Lambda로 토이 프로젝트를 진행하는데, DB로 Atlas MongoDB를 선택했습니다.(무료라서!) Atlas MongoDB의 Network Accesss whitlist에 추가할 Lambda IP가 없어, Elastic IP Address를 VPC(Net Gateway)에 할당 후 이 VPC를 Lambda에 연결 합니다.
참고로 API 콜이 없더라도 Net Gateway 비용은 계속 청구됩니다.. T_T
본론
작업은 다음과 같이 크게 3단계로 구분 됩니다.
VPC 셋팅은 간단하지만 여러 단계로 이루어져 있습니다.
VPC 셋팅
보안그룹 셋팅
Lambda VPC 설정
1. VPC 셋팅
VPC(가상 사설 클라우드)는 AWS 리소스를 시작할 수 있는 클라우드의 가상 네트워크입니다. 자체 사설 IP 주소 범위 선택, 서브넷 생성, 라우팅 테이블 및 네트워크 게이트웨이 구성을 포함하여 가상 네트워킹 환경을 완벽하게 제어할 수 있습니다. VPC는 개인 정보 보호, 보안 및 독점 데이터 손실 방지와 같은 클라우드 컴퓨팅 측면에 도움이 되기 때문에 VPC 사용에 관심이 많습니다. 또한 AWS 관계형 데이터베이스와 같은 일부 인스턴스는 VPC에 있어야 하며 액세스할 수 있는 유일한 방법은 동일한 VPC에 있어야 합니다.
VPC 생성
VPC 이름 태그를 설정 합니다.(예: mion-blog-vpc)
IPv4 CIDR(Classless Inter-Domain Routing)로 IP 범위를 설정 합니다. (예: 172.30.0.0/16)
172.30.0.0/16은 네트워크 마스크라고하며 172.30.0.0 ~ 172.30.255.255 IP를 의미 합니다.
Subnet 생성
private subnet과 public subnet을 생성 합니다.
서브넷은 단순히 VPC IP 범위 입니다. 범위가 큰 VPC IP를 더 작은 네트워크 단위를 나눕니다.
private subnet 생성
VPC ID를 선택 합니다.(예: mion-blog-vpc)
서브넷 이름를 설정합니다.(예: mion-blog-private-subnet)
IPv4 CIDR 블록을 설정 합니다.(예: 172.30.1.0/24)172.30.1.0/24는 172.30.1.0 ~ 172.30.1.255 IP를 의미 합니다.
public subnet 생성
VPC ID를 선택 합니다.(예: mion-blog-vpc)
서브넷 이름를 설정합니다.(예: mion-blog-public-subnet)
IPv4 CIDR 블록을 설정 합니다.(예: 172.30.2.0/24)
Internet Gateway 및 NAT Gateway 생성
Internet Gateway는 물리적 장치가 아니라 AWS VPC와 인터넷 간의 논리적 연결 입니다. 각 VPC에 하나만 연결할 수 있습니다. VPC에 Internet Gateway가 없으면 VPC의 리소스는 인터넷에 액세스하지 못하고, 반대로 인터넷에서 VPC 리소스로 액세스할 수 없습니다. NAT Gateway는 NAT(네트워크 주소 변환) 서비스입니다. 프라이빗 서브넷의 인스턴스가 VPC 외부의 서비스에 연결할 수 있지만 외부 서비스에서 이러한 인스턴스와의 연결을 시작할 수 없도록 NAT 게이트웨이를 사용할 수 있습니다.
Internet Gateway 생성 및 VPC 연결
왼쪽 메뉴에서 인터넷 게이트웨이를 선택하고, 인터넷 게이트웨이 생성 버튼을 클릭 합니다.
이름 태그를 설정합니다.(예: mion-blog-vpc-igw)
인터넷 게이트웨이 탭에서 방금 생성한 Internet Gateway를 체크하고, 오른쪽 위 작업 -> VPC에 연결 버튼을 클릭 합니다.
사용 가능한 VPC를 선택합니다.(예: mion-blog-vpc)
NAT Gateway 생성
왼쪽 메뉴에서 NAT 게이트웨이를 선택하고, NAT 게이트웨이 생성 버튼을 클릭 합니다.
이름을 설정 합니다.(예: mion-blog-nat)
서브넷을 공개하려는 subnet을 선택합니다. public subnet으로 설정 합니다.(예: mion-blog-public-subnet)
연결유형을 퍼블릭으로 설정 합니다.
탄력적 IP 할당 ID을 설정합니다. 사용하던 IP가 있다면 사용하셔도 되고, 새로운 IP를 할당하셔도 됩니다.
인프라는 이제 다음과 같습니다.
Routing Table 생성 및 Subnet과 연결
라우팅 테이블은 VPC 수준이 아니라 서브넷 수준에서 작동합니다. VPC에서 원하는 만큼 라우팅 테이블을 생성할 수 있습니다. 라우팅 테이블은 하나 이상의 서브넷에 연결할 수 있습니다. 기본적으로 VPC의 모든 라우팅 테이블에는 VPC 내 통신을 위한 로컬 경로가 있습니다. 어떤 트래픽(IP 대상)이 어디로(대상) 가야 하는지를 정의하는 새 경로를 생성하여 경로 테이블에 사용자 지정 경로를 추가할 수 있습니다.
public과 private. 2개의 Routing Table을 만들고, 각각 public, priat 서브넷에 연결하고 라우팅 경로를 설정합니다.
주의! public 라우트 경로는 인터넷 게이트웨이, private 라우트 경로는 NAT 게이트웨이로 설정해야 합니다.
public Routing Table
생성
왼쪽 메뉴에서 라우팅 테이블을 선택하고, 라우팅 테이블 생성 버튼을 클릭합니다.
이름을 설정 합니다.(예: mion-blog-vpc-public-route-table)
VPC를 선택 합니다.(예: mion-blog-vpc)
라우팅 테이블 생성을 클릭 합니다.
라우트(경로) 설정(인터넷 게이트웨이 연결)
라우팅 테이블 섹션에서 방금 만든 라우팅 테이블을 선택하고, 라우팅 탭에서 라우팅 편집 버튼을 클릭 합니다.
라우팅 추가 버튼을 클릭하고, 0.0.0.0/0 입력하고 위 단계에서 만든 Internet Gateway(mion-blog-igw)를 선택 합니다.
저장 버튼을 클릭 합니다.
서브넷 연결 설정
서브넷 연결 탭에서 서브넷 연결 편집 버튼을 클릭 합니다.
위에서 만든 public subnet(mion-blog-public-subnet) 을 선택하고 연결 저장을 클릭 합니다.
이제 퍼블릭 서브넷에서 나가는 모든 트래픽은 NAT Gateway로 redirection 됩니다.
private Routing Table
생성
왼쪽 메뉴에서 라우팅 테이블을 선택하고, 라우팅 테이블 생성 버튼을 클릭합니다.
이름을 설정 합니다.(예: mion-blog-vpc-private-route-table)
VPC를 선택 합니다.(예: mion-blog-vpc)
라우팅 테이블 생성을 클릭 합니다.
라우트(경로) 설정(NAT 연결)
라우팅 테이블 섹션에서 방금 만든 라우팅 테이블을 선택하고, 라우팅 탭에서 라우팅 편집 버튼을 클릭 합니다.
라우팅 추가 버튼을 클릭하고, 0.0.0.0/0 입력하고 위 단계에서 만든 NAT Gateway(mion-blog-nat)를 선택 합니다.
저장 버튼을 클릭 합니다.
서브넷 연결 설정
서브넷 연결 탭에서 서브넷 연결 편집 버튼을 클릭 합니다.
위에서 만든 private subnet(mion-blog-private-subnet) 을 선택하고 연결 저장을 클릭 합니다.
이제 프라이빗 서브넷에서 나가는 모든 트래픽은 NAT Gateway로 redirection 됩니다..
2. 보안그룹 생성
AWS EC2에서 Labmda에서 사용할 보안그룹을 생성 합니다.
Labmda 보안 그룹
보안그룹 생성 버튼 클릭
보안 그룹 이름 설정합니다.(예: mion-blog-lambda-security-group)
VPC을 설정 합니다.(예: mion-blog-vpc)
설명은 적당히 작성 합니다.
인바운드 규칙은 비웁니다.
아웃바운드 규칙 유형은 모든 트래픽, IP는 0.0.0.0/0로 되어있는지 확인 합니다.
3. Lambda VPC 설정
먼저 VPC에 연결할 수 있도록 실행역할을 추가 합니다.
Lambda - 구성에서 권한 -> 실행 역할에서 현재 람다의 실행역할을 클릭 합니다.
실행역할에서 권한 탭 -> 권한 추가 버튼을 클릭하여 정책 연결을 클릭 합니다.
AWSLambdaVPCAccessExecutionRole 권한을 추가 합니다.
람다와 VPC 연결을 해줍니다.
Lambda - 구성에서 VPC-> 편집 버튼을 클릭 합니다.
VPC를 선택 합니다.(예: mion-blog-vpc)
subnet은 private subnet을 선택 합니다.(예: mion-blog-priate-subnet)