VPC를 사용한 프라이빗 네트워킹 - AWS Lambda

VPC를 사용한 프라이빗 네트워킹

Amazon Virtual Private Cloud(Amazon VPC)는 AWS 계정 전용 AWS 클라우드의 가상 네트워크입니다. Amazon VPC를 사용하여 데이터베이스, 캐시 인스턴스 또는 내부 서비스 등과 같은 리소스에 대한 프라이빗 네트워크를 생성할 수 있습니다. Amazon VPC에 대한 자세한 내용은 Amazon VPC가 무엇인가요?를 참조하세요.

Lambda 함수는 항상 Lambda 서비스가 소유한 VPC 내에서 실행됩니다. Lambda는 이 VPC 네트워크 액세스 및 보안 규칙을 적용하고 Lambda는 VPC를 자동으로 유지 관리 및 모니터링합니다. Lambda 함수가 계정 VPC의 리소스에 액세스해야 하는 경우 VPC에 액세스하도록 함수를 구성합니다. Lambda는 Lambda 함수가 Lambda VPC에서 계정 VPC의 ENI(탄력적 네트워크 인터페이스)로 연결하는 데 사용하는 Hyperplane ENI라는 관리형 리소스를 제공합니다.

VPC 또는 Hyperplane ENI의 사용에 따르는 추가 요금은 없습니다. NAT 게이트웨이와 같은 일부 VPC 구성 요소에 대해 요금이 부과됩니다. 자세한 내용은 Amazon VPC 요금을 참조하세요.

VPC 네트워크 요소

Amazon VPC 네트워크에는 다음과 같은 네트워크 요소가 포함됩니다.

  • 탄력적 네트워크 인터페이스 - 탄력적 네트워크 인터페이스는 VPC에서 가상 네트워크 카드를 나타내는 논리적 네트워킹 구성 요소입니다.

  • 서브넷 — VPC의 IP 주소 범위입니다. 지정된 서브넷으로 AWS 리소스를 추가할 수 있습니다. 인터넷에 연결되어야 하는 리소스에는 퍼블릭 서브넷을 사용하고, 인터넷에 연결되지 않는 리소스에는 프라이빗 서브넷을 사용합니다.

  • 보안 그룹 – 보안 그룹을 사용하여 각 서브넷의 AWS 리소스에 대한 액세스를 제어합니다.

  • 액세스 제어 목록(ACL) — 네트워크 ACL을 사용하여 서브넷에 추가 보안을 제공합니다. 기본 서브넷 ACL은 인바운드와 아웃바운드 트래픽을 모두 허용합니다.

  • 라우팅 테이블 — VPC에 대한 네트워크 트래픽을 지시하는 데 AWS에서 사용하는 경로 집합을 포함합니다. 서브넷을 특정 라우팅 테이블과 명시적으로 연결할 수 있습니다. 기본적으로 서브넷은 기본 라우팅 테이블과 연결됩니다.

  • 경로 — 라우팅 테이블의 각 경로는 IP 주소 범위와 Lambda가 해당 범위에 대한 트래픽을 전송하는 대상을 지정합니다. 또한 경로는 트래픽을 전송할 게이트웨이, 네트워크 인터페이스 또는 연결인 대상을 지정합니다.

  • NAT 게이트웨이 — 프라이빗 VPC 프라이빗 서브넷에서 인터넷으로의 액세스를 제어하는 AWS 네트워크 주소 변환(NAT) 서비스입니다.

  • VPC 엔드포인트 – Amazon VPC 엔드포인트를 사용하여 인터넷이나 NAT 장치, VPN 연결 또는 AWS Direct Connect 연결을 통해 액세스할 필요 없이 AWS에서 호스팅되는 서비스에 대한 프라이빗 연결을 생성할 수 있습니다. 자세한 내용은 AWS PrivateLink 및 VPC 엔드포인트를 참조하십시오.

작은 정보

VPC 및 서브넷에 액세스하도록 Lambda 함수를 구성하려면 Lambda 콘솔 또는 API를 사용하면 됩니다.

함수를 구성하려면 CreateFunction의 VpcConfig 섹션을 참조하세요. 자세한 단계는 Lambda 함수를 AWS 계정의 Amazon VPC에 연결하기 섹션을 참조하세요.

Amazon VPC 네트워킹 정의에 대한 자세한 내용은 Amazon VPC 개발자 가이드의 Amazon VPC 작동 방식Amazon VPC 자주 묻는 질문을 참조하십시오.

Lambda 함수를 VPC에 연결

Lambda 함수는 항상 Lambda 서비스가 소유한 VPC 내에서 실행됩니다. 기본적으로 Lambda 함수는 사용자 계정의 VPC에 연결되지 않습니다. 계정에서 VPC에 함수를 연결할 때 VPC가 액세스 권한을 제공하지 않으면 함수는 인터넷에 액세스할 수 없습니다.

Lambda는 Hyperplane ENI를 사용하여 VPC에서 리소스에 액세스합니다. Hyperplane ENI는 VPC-VPC 간 NAT(V2N)를 사용하여 Lambda VPC에서 계정 VPC로 NAT 기능을 제공합니다. V2N은 Lambda VPC에서 계정 VPC로의 연결을 제공하지만 다른 방향으로는 제공하지 않습니다.

Lambda 함수를 생성(혹은 VPC 설정을 업데이트)하면 Lambda는 함수의 VPC 구성에서 각 서브넷에 대해 Hyperplane ENI를 할당합니다. 함수가 동일한 서브넷과 보안 그룹을 공유하는 경우 여러 Lambda 함수가 네트워크 인터페이스를 공유할 수 있습니다.

다른 AWS 서비스에 연결하려면 VPC와 지원되는 AWS 서비스 간의 프라이빗 통신용 VPC 엔드포인트를 사용할 수 있습니다. 다른 접근 방식은 NAT 게이트웨이를 사용하여 아웃바운드 트래픽을 다른 AWS 서비스로 라우팅하는 것입니다.

함수에 인터넷 액세스 권한을 부여하려면 아웃바운드 트래픽을 퍼블릭 서브넷의 NAT 게이트웨이로 라우팅합니다. NAT 게이트웨이는 퍼블릭 IP 주소가 있으므로 VPC의 인터넷 게이트웨이를 통해 인터넷에 연결할 수 있습니다. 자세한 설명은 VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화을 참조하세요.

공유 서브넷

VPC 공유를 통해 여러 AWS 계정이 중앙에서 관리되는 공유 Virtual Private Cloud(VPC)에서 Amazon EC2 인스턴스 및 Lambda 함수와 같은 애플리케이션 리소스를 생성할 수 있습니다. 이 모델에서 VPC를 소유한 계정(소유자)은 동일한 AWS 조직에 속한 다른 계정(참가자)과 하나 이상의 서브넷을 공유합니다.

프라이빗 리소스에 액세스하려면 함수를 VPC의 프라이빗 공유 서브넷에 연결합니다. 서브넷 소유자는 서브넷에 함수를 연결하기 전에 서브넷을 공유해야 합니다. 서브넷 소유자는 나중에 서브넷 공유를 해제하여 연결을 제거할 수도 있습니다. 공유 서브넷에서 VPC 리소스를 공유, 공유 해제 및 관리하는 방법에 대한 자세한 내용은 Amazon VPC 가이드에서 다른 계정과 VPC 공유를 참조하세요.

Lambda Hyperplane ENI

Hyperplane ENI는 Lambda 서비스에서 생성 및 관리하는 관리형 네트워크 리소스입니다. Lambda VPC의 여러 실행 환경에서는 Hyperplane ENI를 사용하여 계정의 VPC 내부의 리소스에 안전하게 액세스할 수 있습니다. Hyperplane ENI는 Lambda VPC에서 계정 VPC로 NAT 기능을 제공합니다.

각 서브넷에 있어 Lambda는 각 고유한 보안 그룹 세트에 대해 네트워크 인터페이스를 생성합니다. 동일한 서브넷 및 보안 그룹 조합을 공유하는 계정의 함수는 동일한 네트워크 인터페이스를 사용합니다. 하이퍼플레인 계층을 통해 이루어진 연결은 보안 그룹 구성에 추적하도록 별도로 설정되어 있지 않더라도 자동으로 추적됩니다. 설정된 연결과 일치하지 않는 VPC의 인바운드 패킷은 하이퍼플레인 계층에서 삭제됩니다. 자세한 내용은 Amazon EC2 사용 설명서의 보안 그룹 연결 추적을 참조하세요.

계정의 함수가 ENI 리소스를 공유하므로 ENI 수명 주기는 다른 Lambda 리소스보다 복잡합니다. 다음 섹션에서는 ENI 수명 주기에 대해 설명합니다.

ENI 생성

Lambda는 새로 생성된 VPC 지원 함수 또는 기존 함수에 대한 VPC 구성 변경을 위해 Hyperplane ENI 리소스를 생성할 수 있습니다. Lambda가 필요한 리소스를 생성하는 동안 함수는 보류 중인 상태로 유지됩니다. Hyperplane ENI가 준비되면 함수가 활성 상태로 전환되고 ENI를 사용할 수 있게 됩니다. Lambda가 Hyperplane ENI를 생성하는 데 몇 분이 소요될 수 있습니다.

새로 생성된 VPC 지원 함수의 경우 함수 상태가 활성으로 전환될 때까지 함수에서 작동하는 호출이나 기타 API 작업이 실패합니다.

기존 함수에 대한 VPC 구성 변경의 경우 모든 함수 호출은 함수 상태가 활성으로 전환될 때까지 이전 서브넷 및 보안 그룹 구성과 연결된 Hyperplane ENI를 계속 사용합니다.

Lambda 함수가 연속으로 30일 동안 유휴 상태로 유지되면 Lambda는 사용되지 않는 Hyperplane ENI를 회수하고 함수 상태를 유휴 상태로 설정합니다. 다음 호출은 Lambda가 유휴 함수를 다시 활성화하도록 합니다. 호출이 실패하고 Lambda가 Hyperplane ENI의 생성 또는 할당을 완료할 때까지 함수가 보류 상태로 전환됩니다.

함수 상태에 대한 자세한 내용은 Lambda 함수 상태 단원을 참조하세요.

ENI 관리

Lambda는 함수의 실행 역할에 있는 권한을 사용하여 네트워크 인터페이스를 생성하고 관리합니다. Lambda는 계정에서 VPC 지원 함수에 대한 고유한 서브넷과 보안 그룹 조합을 정의할 때 Hyperplane ENI를 생성합니다. Lambda는 계정에서 동일한 서브넷과 보안 그룹 조합을 사용하는 다른 VPC 지원 함수에 대해 Hyperplane ENI를 재사용합니다.

동일한 Hyperplane ENI를 사용할 수 있는 Lambda 함수 수에는 할당량이 없습니다. 그러나 각 Hyperplane ENI는 최대 65,000개의 연결/포트를 지원합니다. 연결 수가 65,000개를 초과하는 경우 Lambda는 추가 연결을 제공하기 위해 새 Hyperplane ENI를 생성합니다.

다른 VPC에 액세스하도록 함수 구성을 업데이트하면 Lambda가 이전 VPC의 Hyperplane ENI에 대한 연결을 종료합니다. 새 VPC 대한 연결을 업데이트하는 프로세스는 몇 분 정도 걸릴 수 있습니다. 이 시간 동안 함수에 대한 호출은 이전 VPC를 계속 사용합니다. 업데이트가 완료되면 새 VPC의 Hyperplane ENI를 사용하여 새 호출이 시작됩니다. 이 시점에서 Lambda 함수는 더 이상 이전 VPC와 연결되지 않습니다.

ENI 삭제

VPC 구성을 제거하기 위해 함수를 업데이트하는 경우 Lambda에서 연결된 Hyperplane ENI를 삭제하는 데 최대 20분이 소요됩니다. Lambda는 다른 함수(또는 게시된 함수 버전)가 해당 Hyperplane ENI를 사용하고 있지 않은 경우에만 ENI를 삭제합니다.

Lambda는 함수 실행 역할의 권한에 따라 Hyperplane ENI를 삭제합니다. Lambda가 Hyperplane ENI를 삭제하기 전에 실행 역할을 삭제하면 Lambda가 Hyperplane ENI를 삭제할 수 없습니다. 수동으로 삭제를 수행할 수 있습니다.

Lambda는 계정의 함수 또는 함수 버전에서 사용 중인 네트워크 인터페이스를 삭제하지 않습니다. Lambda ENI Finder를 사용하여 Hyperplane ENI를 사용하는 함수 또는 함수 버전을 식별할 수 있습니다. 더 이상 필요하지 않은 함수 또는 함수 버전의 경우 Lambda가 Hyperplane ENI를 삭제하도록 VPC 구성을 제거할 수 있습니다.

연결

Lambda는 TCP(전송 제어 프로토콜)와 UDP(사용자 데이터그램 프로토콜)의 두 가지 유형의 연결을 지원합니다.

VPC를 생성하면 Lambda는 자동으로 DHCP 옵션 세트를 생성하여 VPC와 연결합니다. VPC에 대해 고유한 DHCP 옵션 세트를 구성할 수 있습니다. 자세한 내용은 Amazon VPC DHCP 옵션을 참조하세요.

Amazon은 VPC용 DNS 서버(Amazon Route 53 Resolver)를 제공합니다. 자세한 내용은 VPC에 대한 DNS 지원을 참조하세요.

IPv6 지원

Lambda는 Lambda의 퍼블릭 듀얼 스택 엔드포인트에 대한 인바운드 연결과 IPv6를 통한 듀얼 스택 VPC 서브넷으로의 아웃바운드 연결을 지원합니다.

인바운드

IPv6를 통해 함수를 호출하려면 Lambda의 퍼블릭 듀얼 스택 엔드포인트를 사용하세요. IPv4 및 IPv6를 모두 지원하는 듀얼 스택 엔드포인트입니다. Lambda 듀얼 스택 엔드포인트는 다음 구문을 사용합니다.

protocol://lambda.us-east-1.api.aws

Lambda 함수 URL를 사용하여 IPv6를 통해 함수를 호출할 수도 있습니다. 함수 URL 엔드포인트는 다음 형식을 취합니다.

https://url-id.lambda-url.us-east-1.on.aws
아웃바운드

함수는 IPv6를 통해 듀얼 스택 VPC 서브넷의 리소스에 연결할 수 있습니다. 이 옵션은 기본적으로 꺼져 있습니다. 아웃바운드 IPv6 트래픽을 허용하려면 콘솔을 사용하거나 create-function 또는 update-function-configuration 명령과 함께 --vpc-config Ipv6AllowedForDualStack=true 옵션을 사용하세요.

참고

VPC에서 아웃바운드 IPv6 트래픽을 허용하려면 함수에 연결된 모든 서브넷이 듀얼 스택 서브넷이어야 합니다. Lambda는 VPC의 IPv6 전용 서브넷을 위한 아웃바운드 IPv6 연결, VPC에 연결되지 않은 함수를 위한 아웃바운드 IPv6 연결 또는 VPC 엔드포인트(AWS PrivateLink)를 사용하는 인바운드 IPv6 연결을 지원하지 않습니다.

IPv6를 통해 서브넷 리소스에 명시적으로 연결하도록 함수 코드를 업데이트할 수 있습니다. 다음 Python 예제는 소켓을 열고 IPv6 서버에 연결합니다.

예 - IPv6 서버에 연결
def connect_to_server(event, context): server_address = event['host'] server_port = event['port'] message = event['message'] run_connect_to_server(server_address, server_port, message) def run_connect_to_server(server_address, server_port, message): sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0) try: # Send data sock.connect((server_address, int(server_port), 0, 0)) sock.sendall(message.encode()) BUFF_SIZE = 4096 data = b'' while True: segment = sock.recv(BUFF_SIZE) data += segment # Either 0 or end of data if len(segment) < BUFF_SIZE: break return data finally: sock.close()

보안

AWS는 VPC의 보안을 강화하기 위해 보안 그룹네트워크 ACL을 제공합니다. 보안 그룹은 리소스용 인바운드 및 아웃바운드 트래픽을 제어하고, 네트워크 ACL은 서브넷용 인바운드 및 아웃바운드 트래픽을 제어합니다. 보안 그룹은 대부분의 서브넷에 대해 충분한 액세스 제어를 제공합니다. VPC에 대한 추가 보안 계층을 원하는 경우 네트워크 ACL을 사용할 수 있습니다. 자세한 내용은 Amazon VPC의 인터네트워크 트래픽 개인 정보 보호를 참조하세요. 생성된 각 서브넷에는 자동으로 VPC의 기본 네트워크 ACL이 연결됩니다. 연결된 네트워크 ACL 및 기본 네트워크 ACL의 내용을 변경할 수 있습니다.

일반 보안 모범 사례는 VPC 보안 모범 사례를 참조하세요. IAM을 사용하여 Lambda API 및 리소스에 대한 액세스를 관리하는 방법에 대한 자세한 내용은 AWS Lambda사용 권한을 참조하세요.

VPC 설정에 Lambda 특정 조건 키를 사용하여 Lambda 함수에 대한 추가 권한 제어를 제공할 수 있습니다. VPC 조건 키에 대한 자세한 내용은 VPC 설정에 IAM 조건 키 사용을 참조하세요.

참고

Lambda 함수는 퍼블릭 인터넷 또는 AWS PrivateLink 엔드포인트에서 간접적으로 호출할 수 있습니다. 퍼블릭 인터넷을 통해서만 함수 URL에 액세스할 수 있습니다. Lambda 함수는 AWS PrivateLink를 지원하지만 함수 URL은 지원하지 않습니다.

관찰성

VPC 흐름 로그를 사용하여 VPC의 네트워크 인터페이스에서 송수신되는 IP 트래픽에 대한 정보를 캡처할 수 있습니다. 흐름 로그 데이터는 Amazon CloudWatch Logs 또는 Amazon S3에 게시할 수 있습니다. 흐름 로그를 생성한 다음 선택된 대상의 데이터를 가져와 확인할 수 있습니다.

참고: 함수를 VPC에 연결하면 CloudWatch 로그 메시지는 VPC 경로를 사용하지 않습니다. Lambda는 이를 로그에 대한 일반 라우팅을 사용하여 전송합니다.