VPC 연결 Lambda 함수에 인터넷 접근 활성화하기
VPC 연결 Lambda 함수에 인터넷 접근 활성화하기 (Enable internet access for VPC-connected Lambda functions)
기본적으로 Lambda 함수는 인터넷 접근이 있는 Lambda 관리형 VPC에서 실행돼요. 계정의 VPC 리소스에 접근하려면 함수에 VPC 구성을 추가할 수 있어요. 그러면 VPC에 인터넷 접근이 없는 한 함수는 그 VPC 내의 리소스로 제한돼요. 이 페이지는 VPC 연결 Lambda 함수에 인터넷 접근을 제공하는 방법을 설명해요.
본문
VPC 만들기
Create VPC 워크플로는 Lambda 함수가 프라이빗 서브넷에서 공개 인터넷에 접근하는 데 필요한 모든 VPC 리소스(서브넷, NAT 게이트웨이, 인터넷 게이트웨이, 라우트 테이블 항목 포함)를 만들어요.
VPC를 만들려면
- https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.
- 대시보드에서 Create VPC를 선택합니다.
- Resources to create에서 VPC and more를 선택합니다.
- VPC를 구성합니다.
- Name tag auto-generation에 VPC 이름을 입력합니다.
- IPv4 CIDR block에서 기본 제안을 유지하거나 애플리케이션·네트워크에 필요한 CIDR 블록을 입력합니다.
- 애플리케이션이 IPv6 주소로 통신한다면 IPv6 CIDR block, Amazon-provided IPv6 CIDR block을 선택합니다.
- 서브넷을 구성합니다.
- Number of Availability Zones에서 2를 선택합니다. 고가용성을 위해 최소 2개 AZ를 권장합니다.
- Number of public subnets에서 2를 선택합니다.
- Number of private subnets에서 2를 선택합니다.
- 공개 서브넷의 기본 CIDR 블록을 유지하거나 Customize subnet CIDR blocks를 펼쳐 CIDR 블록을 입력합니다.
- NAT gateways에서 1 per AZ를 선택해 회복력을 높입니다.
- Egress only internet gateway에서 IPv6 CIDR 블록을 포함하도록 선택했다면 Yes를 선택합니다.
- VPC endpoints에서 기본값(S3 Gateway)을 유지합니다. 이 옵션은 비용이 없습니다.
- DNS options에서 기본 설정을 유지합니다.
- Create VPC를 선택합니다.
Lambda 함수 구성
함수를 만들 때 VPC 구성하기
- Lambda 콘솔의 Functions 페이지를 엽니다.
- Create function을 선택합니다.
- Basic information 아래에서 Function name에 함수 이름을 입력합니다.
- Advanced settings를 펼칩니다.
- Enable VPC를 선택하고 VPC를 선택합니다.
- (선택 사항) 아웃바운드 IPv6 트래픽을 허용하려면 Allow IPv6 traffic for dual-stack subnets를 선택합니다.
- Subnets에서 모든 프라이빗 서브넷을 선택합니다. 프라이빗 서브넷은 NAT 게이트웨이를 통해 인터넷에 접근할 수 있습니다. 함수를 공개 서브넷에 연결해도 인터넷 접근이 제공되지 않습니다.
참고
Allow IPv6 traffic for dual-stack subnets를 선택했다면 선택한 모든 서브넷에 IPv4 CIDR 블록과 IPv6 CIDR 블록이 모두 있어야 해요.
- Security groups에서 아웃바운드 트래픽을 허용하는 보안 그룹을 선택합니다.
- Create function을 선택합니다.
Lambda는 AWSLambdaVPCAccessExecutionRole AWS 관리 정책으로 실행 역할을 자동으로 만들어요. 이 정책의 권한은 VPC 구성의 탄력적 네트워크 인터페이스를 만드는 데만 필요하며 함수 호출에는 필요 없어요. 최소 권한을 적용하려면 함수와 VPC 구성을 만든 후 실행 역할에서 AWSLambdaVPCAccessExecutionRole 정책을 제거할 수 있어요.
기존 함수에 VPC 구성하기
기존 함수에 VPC 구성을 추가하려면 함수의 실행 역할에 탄력적 네트워크 인터페이스를 만들고 관리할 권한이 있어야 해요. AWSLambdaVPCAccessExecutionRole AWS 관리 정책에는 필요한 권한이 포함돼 있어요. 최소 권한을 적용하려면 VPC 구성을 만든 후 실행 역할에서 이 정책을 제거할 수 있어요.
- Lambda 콘솔의 Functions 페이지를 엽니다.
- 함수를 선택합니다.
- Configuration 탭을 선택한 다음 VPC를 선택합니다.
- VPC 아래에서 Edit을 선택합니다.
- VPC를 선택합니다.
- (선택 사항) 아웃바운드 IPv6 트래픽을 허용하려면 Allow IPv6 traffic for dual-stack subnets를 선택합니다.
- Subnets에서 모든 프라이빗 서브넷을 선택합니다. 함수를 공개 서브넷에 연결해도 인터넷 접근이 제공되지 않습니다.
- Security groups에서 아웃바운드 트래픽을 허용하는 보안 그룹을 선택합니다.
- Save를 선택합니다.
함수 테스트
다음 샘플 코드로 VPC 연결 함수가 공개 인터넷에 도달할 수 있는지 확인하세요. 성공하면 코드는 200 상태 코드를 반환하고, 실패하면 함수가 타임아웃돼요.
Node.js
- Lambda 콘솔의 Code source 창에서 다음 코드를 index.mjs 파일에 붙여넣습니다. 함수는 공개 엔드포인트에 HTTP GET 요청을 보내고 HTTP 응답 코드를 반환해 함수가 공개 인터넷에 접근할 수 있는지 테스트합니다.
const url = "https://aws.amazon.com/"; export const handler = async(event) => { try { const res = await fetch(url); console.info("status", res.status); return res.status; } catch (e) { console.error(e); return 500; } }; - DEPLOY 섹션에서 Deploy를 선택해 함수 코드를 업데이트합니다.
- Test 탭을 선택합니다.
- Test를 선택합니다.
- 함수가 200 상태 코드를 반환하면 아웃바운드 인터넷 접근이 있다는 뜻입니다. 공개 인터넷에 도달할 수 없다면 다음과 같은 오류 메시지가 표시됩니다.
{ "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }
Python
- Lambda 콘솔의 Code source 창에서 다음 코드를 lambda_function.py 파일에 붙여넣습니다.
import urllib.request def lambda_handler(event, context): try: response = urllib.request.urlopen('https://aws.amazon.com') status_code = response.getcode() print('Response Code:', status_code) return status_code except Exception as e: print('Error:', e) raise e - DEPLOY 섹션에서 Deploy를 선택해 함수 코드를 업데이트합니다.
- Test 탭을 선택합니다.
- Test를 선택합니다.
- 함수가 200 상태 코드를 반환하면 아웃바운드 인터넷 접근이 있다는 뜻입니다. 공개 인터넷에 도달할 수 없다면 다음과 같은 오류 메시지가 표시됩니다.
{ "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds" }
이미 VPC가 있지만 Lambda 함수에 공개 인터넷 접근을 구성해야 한다면 다음 단계를 따르세요. 이 절차는 VPC에 최소 두 개의 서브넷이 있다고 가정해요.
라우트 테이블 구성 확인
- https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.
- VPC ID를 선택합니다.
- Resource map 섹션까지 스크롤해 라우트 테이블 매핑을 확인합니다. 서브넷에 매핑된 각 라우트 테이블을 엽니다.
- Routes 탭까지 스크롤합니다. VPC에 다음 두 라우트 테이블이 모두 있는지 확인하려면 라우트를 검토합니다. 각 요구 사항은 별도의 라우트 테이블로 충족해야 합니다.
- 인터넷 바운드 트래픽(IPv4는 0.0.0.0/0, IPv6는 ::/0)이 인터넷 게이트웨이(igw-xxxxxxxxxx)로 라우팅됩니다. 이는 라우트 테이블과 연결된 서브넷이 공개 서브넷이라는 뜻입니다.
참고
서브넷에 IPv6 CIDR 블록이 없으면 IPv4 라우트(0.0.0.0/0)만 보일 거예요.
- IPv4 인터넷 바운드 트래픽(0.0.0.0/0)이 공개 서브넷과 연결된 NAT 게이트웨이(nat-xxxxxxxxxx)로 라우팅됩니다. 이는 서브넷이 NAT 게이트웨이를 통해 인터넷에 접근할 수 있는 프라이빗 서브넷이라는 뜻입니다.
참고
서브넷에 IPv6 CIDR 블록이 있으면 라우트 테이블이 인터넷 바운드 IPv6 트래픽(::/0)도 egress-only 인터넷 게이트웨이(eigw-xxxxxxxxxx)로 라우팅해야 해요. 없으면 IPv4 라우트만 보일 거예요.
- 인터넷 바운드 트래픽(IPv4는 0.0.0.0/0, IPv6는 ::/0)이 인터넷 게이트웨이(igw-xxxxxxxxxx)로 라우팅됩니다. 이는 라우트 테이블과 연결된 서브넷이 공개 서브넷이라는 뜻입니다.
- VPC의 서브넷과 연결된 각 라우트 테이블을 검토하고 인터넷 게이트웨이가 있는 라우트 테이블과 NAT 게이트웨이가 있는 라우트 테이블이 있는지 확인할 때까지 이전 단계를 반복합니다.
커스텀 라우트 테이블 만들기(Amazon VPC 콘솔)
- https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.
- 탐색 창에서 Route tables를 선택합니다.
- Create route table을 선택합니다.
- (선택 사항) Name에 라우트 테이블 이름을 입력합니다.
- VPC에서 VPC를 선택합니다.
- (선택 사항) 태그를 추가하려면 Add new tag를 선택하고 태그 키와 값을 입력합니다.
- Create route table을 선택합니다.
- Subnet associations 탭에서 Edit subnet associations를 선택합니다.
- 라우트 테이블과 연결할 서브넷의 체크박스를 선택합니다.
- Save associations를 선택합니다.
인터넷 게이트웨이 만들기
- https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.
- 탐색 창에서 Internet gateways를 선택합니다.
- Create internet gateway를 선택합니다.
- (선택 사항) 인터넷 게이트웨이 이름을 입력합니다.
- (선택 사항) 태그를 추가합니다.
- Create internet gateway를 선택합니다.
- 화면 상단 배너의 Attach to a VPC를 선택하고 사용 가능한 VPC를 선택한 다음 Attach internet gateway를 선택합니다.
- VPC ID를 선택합니다.
- VPC ID를 다시 선택해 VPC 세부 정보 페이지를 엽니다.
- Resource map 섹션까지 스크롤하고 서브넷을 선택합니다. 서브넷 세부 정보가 새 탭에 표시됩니다.
- Route table 아래의 링크를 선택합니다.
- Route table ID를 선택해 라우트 테이블 세부 정보 페이지를 엽니다.
- Routes 아래에서 Edit routes를 선택합니다.
- Add route를 선택하고 Destination 상자에 0.0.0.0/0을 입력합니다.
- Target에서 Internet gateway를 선택하고 이전에 만든 인터넷 게이트웨이를 선택합니다. 서브넷에 IPv6 CIDR 블록이 있다면 같은 인터넷 게이트웨이에 ::/0 라우트도 추가해야 합니다.
- Save changes를 선택합니다.
NAT 게이트웨이 만들기
- 탐색 창에서 NAT gateways를 선택합니다.
- Create NAT gateway를 선택합니다.
- (선택 사항) NAT 게이트웨이 이름을 입력합니다.
- Subnet에서 VPC의 공개 서브넷을 선택합니다. (공개 서브넷은 라우트 테이블에 인터넷 게이트웨이로 가는 직접 라우트가 있는 서브넷입니다.)
참고
NAT 게이트웨이는 공개 서브넷과 연결되지만, 라우트 테이블 항목은 프라이빗 서브넷에 있어요.
- Elastic IP allocation ID에서 탄력적 IP 주소를 선택하거나 Allocate Elastic IP를 선택합니다.
- Create NAT gateway를 선택합니다.
프라이빗 서브넷의 라우트 테이블에 NAT 게이트웨이 라우트 추가
- 탐색 창에서 Subnets를 선택합니다.
- VPC의 프라이빗 서브넷을 선택합니다. (프라이빗 서브넷은 라우트 테이블에 인터넷 게이트웨이로 가는 라우트가 없는 서브넷입니다.)
- Route table 아래의 링크를 선택합니다.
- Route table ID를 선택해 라우트 테이블 세부 정보 페이지를 엽니다.
- 스크롤해 Routes 탭을 선택한 다음 Edit routes를 선택합니다.
- Add route를 선택하고 Destination 상자에 0.0.0.0/0을 입력합니다.
- Target에서 NAT gateway를 선택하고 이전에 만든 NAT 게이트웨이를 선택합니다.
- Save changes를 선택합니다.
egress-only 인터넷 게이트웨이 만들기
- 탐색 창에서 Egress-only internet gateways를 선택합니다.
- Create egress only internet gateway를 선택합니다.
- (선택 사항) 이름을 입력합니다.
- egress-only 인터넷 게이트웨이를 만들 VPC를 선택합니다.
- Create egress only internet gateway를 선택합니다.
- Attached VPC ID 아래의 링크를 선택합니다.
- VPC ID 아래의 링크를 선택해 VPC 세부 정보 페이지를 엽니다.
- Resource map 섹션까지 스크롤하고 프라이빗 서브넷을 선택합니다. (프라이빗 서브넷은 라우트 테이블에 인터넷 게이트웨이로 가는 라우트가 없는 서브넷입니다.)
- Route table 아래의 링크를 선택합니다.
- Route table ID를 선택해 라우트 테이블 세부 정보 페이지를 엽니다.
- Routes 아래에서 Edit routes를 선택합니다.
- Add route를 선택하고 Destination 상자에 ::/0을 입력합니다.
- Target에서 Egress Only Internet Gateway를 선택하고 이전에 만든 게이트웨이를 선택합니다.
- Save changes를 선택합니다.
Lambda 함수 구성
(함수를 만들 때 또는 기존 함수에 VPC 구성하기 및 함수 테스트 절차는 앞서 설명한 것과 동일합니다.)