아웃바운드 네트워킹을 VPC의 리소스에 연결 - AWS Lambda

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

아웃바운드 네트워킹을 VPC의 리소스에 연결

AWS 계정에서 VPC(Virtual Private Cloud)의 프라이빗 서브넷에 연결하도록 Lambda 함수를 구성할 수 있습니다. Amazon Virtual Private Cloud(Amazon VPC)를 사용하여 데이터베이스, 캐시 인스턴스, 내부 서비스 등과 같은 리소스에 대해 프라이빗 네트워크를 생성합니다. 함수를 VPC에 연결하여 함수가 실행되는 동안 프라이빗 리소스에 액세스합니다. 이 섹션에서는 Lambda VPC 연결에 대한 요약을 제공합니다. Lambda의 VPC 네트워킹에 대한 자세한 내용은 VPC를 사용한 프라이빗 네트워킹 섹션을 참조하세요.

작은 정보

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

함수를 구성하려면 CreateFunction의 VpcConfig 섹션을 참조하세요. 자세한 단계는 VPC 액세스 구성(콘솔) 및 VPC 액세스 구성(API)를 참조하세요.

함수를 VPC에 연결하면 Lambda는 함수의 VPC 구성에 있는 각 서브넷의 Hyperplane ENI(탄력적 네트워크 인터페이스)에 함수를 할당합니다. Lambda는 계정의 VPC 지원 함수에 대해 고유한 서브넷과 보안 그룹 조합이 처음으로 정의될 때 Hyperplane ENI를 생성합니다.

Lambda가 Hyperplane ENI를 생성하는 동안에는 버전 생성 또는 함수의 코드 업데이트와 같이 함수를 대상으로 하는 추가 작업을 수행할 수 없습니다. 새 함수의 경우 상태가 Pending에서 Active로 전환될 때까지 함수를 호출할 수 없습니다. 기존 함수의 경우 업데이트가 진행 중인 동안에도 이전 버전을 호출할 수 있습니다. Hyperplane ENI 수명 주기에 대한 자세한 내용은 Lambda Hyperplane ENI 섹션을 참조하세요.

Lambda 함수는 전용 인스턴스 테넌시를 사용하여 VPC에 직접 연결할 수 없습니다. 전용 VPC의 리소스에 연결하려면, 기본 테넌시를 사용하여 두 번째 VPC에 피어로 연결합니다.

VPC 연결 관리

함수가 동일한 서브넷과 보안 그룹을 공유하는 경우 여러 함수가 네트워크 인터페이스를 공유할 수 있습니다. 기존 Lambda 관리형 네트워크 인터페이스가 있는 동일한 VPC 구성(서브넷 및 보안 그룹)에 추가 함수를 연결하면 새 네트워크 인터페이스를 생성하는 것보다 훨씬 빠릅니다.

함수가 장기간 동안 활성 상태가 아니면 Lambda는 네트워크 인터페이스를 회수하고 함수는 Idle 상태가 됩니다. 유휴 함수를 다시 활성화하려면 호출하세요. 이 호출이 실패하고 네트워크 인터페이스가 사용 가능할 때까지 함수가 다시 Pending 상태로 바뀝니다.

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

DynamoDB 쿼리와 같은 수명이 짧은 작업의 경우, TCP 연결 설정의 대기 시간 오버헤드가 작업 자체보다 클 수 있습니다. 수명이 짧거나 자주 호출되지 않는 함수에 대한 연결의 재사용을 보장하려면, 함수 초기화 중에 생성된 연결에 대해 TCP 연결 유지(TCP keep-alive)를 사용하여 후속 호출에 대한 새 연결의 생성을 방지하는 것이 좋습니다. 연결 유지를 사용한 연결 재사용에 대한 자세한 내용은 연결 재사용에 대한 Lambda 설명서를 참조하세요.

실행 역할 및 사용자 권한

Lambda는 함수의 권한을 사용하여 네트워크 인터페이스를 생성하고 관리합니다. VPC에 연결하려면 함수의 실행 역할에 다음 권한이 주어져야 합니다.

실행 역할 권한
  • ec2:CreateNetworkInterface

  • ec2:DescribeNetworkInterfaces— 이 작업은 모든 리소스에서 허용된 경우에만 작동합니다("Resource": "*").

  • ec2:DescribeSubnets

  • ec2:DeleteNetworkInterface - 실행 역할에서DeleteNetworkInterface에 대한 리소스 ID를 지정하지 않은 경우 함수가 VPC 액세스하지 못할 수 있습니다. 고유한 리소스 ID를 지정하거나 모든 리소스 ID(예: "Resource": "arn:aws:ec2:us-west-2:123456789012:*/*")를 포함합니다.

  • ec2:AssignPrivateIpAddresses

  • ec2:UnassignPrivateIpAddresses

이러한 권한은 AWS 관리형 정책 AWSLambdaVPCAccessExecutionRole에 포함됩니다. 이러한 권한은 VPC 함수를 호출하지 않고 ENI를 생성하는 데에만 필요합니다. 즉, 실행 역할에서 이러한 권한을 제거하더라도 여전히 VPC 함수를 성공적으로 호출할 수 있습니다. Lambda 함수를 VPC에서 완전히 분리하려면 콘솔이나 UpdateFunctionConfiguration API를 사용하여 함수의 VPC 구성 설정을 업데이트합니다.

VPC 연결을 구성할 때 Lambda는 사용자의 권한을 사용하여 네트워크 리소스를 확인합니다. VPC에 연결하도록 함수를 구성하려면 사용자는 다음 권한이 필요합니다.

사용자 권한
  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

VPC 액세스 구성(콘솔)

IAM 권한이 VPC에 연결하는 Lambda 함수만 생성하도록 허용할 경우 함수를 생성할 때 VPC를 구성해야 합니다. IAM 권한이 VPC에 연결되지 않은 함수를 생성할 수 있도록 허용할 경우 함수를 생성한 후 VPC 구성을 추가할 수 있습니다.

함수를 생성할 때 VPC를 구성하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수 생성을 선택합니다.

  3. 기본 정보(Basic information)에서 함수 이름(Function name)에 함수 이름을 입력합니다.

  4. Advanced settings(고급 설정)를 확장합니다.

  5. VPC 활성화를 선택한 다음 함수에서 액세스할 VPC를 선택합니다.

  6. (선택 사항) 아웃바운드 IPv6 트래픽을 허용하려면 듀얼 스택 서브넷에 IPv6 트래픽 허용을 선택합니다.

  7. 서브넷 및 보안 그룹을 선택합니다. 듀얼 스택 서브넷에 IPv6 트래픽 허용을 선택한 경우 선택한 모든 서브넷에 IPv4 CIDR 블록 및 IPv6 CIDR 블록이 있어야 합니다.

    참고

    프라이빗 리소스에 연결하려면 함수를 프라이빗 서브넷에 액세스합니다. 함수에 인터넷 액세스 권한이 필요한 경우 NAT(Network Address Translation)를 사용합니다. 함수를 퍼블릭 서브넷에 연결해도 인터넷 액세스 권한 또는 퍼블릭 IP 주소는 제공되지 않습니다.

  8. 함수 생성을 선택합니다.

기존 함수에 대한 VPC를 구성하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 구성(Configuration)을 선택한 다음 VPC를 선택합니다.

  4. VPC에서 편집을 선택합니다.

  5. 함수가 액세스할 VPC를 선택합니다.

  6. (선택 사항) 아웃바운드 IPv6 트래픽을 허용하려면 듀얼 스택 서브넷에 IPv6 트래픽 허용을 선택합니다.

  7. 서브넷 및 보안 그룹을 선택합니다. 듀얼 스택 서브넷에 IPv6 트래픽 허용을 선택한 경우 선택한 모든 서브넷에 IPv4 CIDR 블록 및 IPv6 CIDR 블록이 있어야 합니다.

    참고

    프라이빗 리소스에 연결하려면 함수를 프라이빗 서브넷에 액세스합니다. 함수에 인터넷 액세스 권한이 필요한 경우 NAT(Network Address Translation)를 사용합니다. 함수를 퍼블릭 서브넷에 연결해도 인터넷 액세스 권한 또는 퍼블릭 IP 주소는 제공되지 않습니다.

  8. 저장을 선택합니다.

VPC 액세스 구성(API)

VPC에 Lambda 함수를 연결하려면 다음 API 작업을 사용하면 됩니다.

함수를 생성하고 AWS Command Line Interface(AWS CLI)를 사용하여 VPC에 연결하려면 create-function 명령을 VpcConfig 옵션과 함께 사용하면 됩니다. 다음 예제에서는 VPC 연결을 사용하는 함수를 생성합니다. 이 함수는 두 개의 서브넷과 한 개의 보안 그룹에 액세스할 수 있으며 아웃바운드 IPv6 트래픽을 허용합니다.

aws lambda create-function --function-name my-function \ --runtime nodejs20.x --handler index.js --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/lambda-role \ --vpc-config Ipv6AllowedForDualStack=true,SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb

기존 함수를 VPC에 연결하려면 update-function-configuration 명령을 vpc-config 옵션과 함께 사용합니다.

aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb

VPC에서 함수를 연결 해제하려면 서브넷 및 보안 그룹의 빈 목록을 사용하여 함수 구성을 업데이트하세요.

aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=[],SecurityGroupIds=[]

VPC 설정에 IAM 조건 키 사용

VPC 설정에 Lambda 특정 조건 키를 사용하여 Lambda 함수에 대한 추가 권한 제어를 제공할 수 있습니다. 예를 들어 조직의 모든 함수가 VPC에 연결되도록 요구할 수 있습니다. 또한 함수의 사용자가 사용할 수 있고 사용할 수 없는 서브넷 및 보안 그룹을 지정할 수도 있습니다.

Lambda는 IAM 정책에서 다음 조건 키를 지원합니다.

  • lambda:VpcIds – 하나 이상의 VPC를 허용하거나 거부합니다.

  • lambda:SubnetIds – 하나 이상의 서브넷을 허용하거나 거부합니다.

  • lambda:SecurityGroupIds – 하나 이상의 보안 그룹을 허용하거나 거부합니다.

Lambda API 작업 CreateFunctionUpdateFunctionConfiguration은 이러한 조건 키를 지원합니다. IAM 정책의 조건 키 사용 방법에 대한 자세한 내용은 IAM 사용 설명서IAM JSON 정책 요소: 조건을 참조하세요.

작은 정보

함수에 이전 API 요청의 VPC 구성이 이미 포함되어 있는 경우 VPC 구성 없이 UpdateFunctionConfiguration 요청을 보낼 수 있습니다.

VPC 설정에 대한 조건 키가 있는 정책의 예제

다음 예제에서는 VPC 설정에 조건 키를 사용하는 방법을 보여줍니다. 원하는 제한 사항이 있는 정책 구문을 생성한 후 대상 사용자 또는 역할에 대한 정책 구문을 추가합니다.

사용자가 VPC 연결 함수만 배포하도록 보장

모든 사용자가 VPC 연결 함수만 배포하도록 보장하려면 유효한 VPC ID가 포함되지 않은 함수 생성 및 업데이트 작업을 거부할 수 있습니다.

VPC ID는 CreateFunction 또는 UpdateFunctionConfiguration 요청에 대한 입력 파라미터가 아닙니다. Lambda는 서브넷 및 보안 그룹 파라미터를 기반으로 VPC ID 값을 검색합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceVPCFunction", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "Null": { "lambda:VpcIds": "true" } } } ] }

특정 VPC, 서브넷 또는 보안 그룹에 대한 사용자 액세스 거부

특정 VPC에 대한 사용자의 액세스를 거부하려면 StringEquals를 사용하여 lambda:VpcIds 조건 값을 확인합니다. 다음 예제에서는 vpc-1vpc-2에 대한 사용자 액세스를 거부합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOutOfVPC", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

특정 서브넷에 대한 사용자의 액세스를 거부하려면 StringEquals를 사용하여 lambda:SubnetIds 조건 값을 확인합니다. 다음 예제에서는 subnet-1subnet-2에 대한 사용자 액세스를 거부합니다.

{ "Sid": "EnforceOutOfSubnet", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

특정 보안 그룹에 대한 사용자의 액세스를 거부하려면 StringEquals를 사용하여 lambda:SecurityGroupIds 조건 값을 확인합니다. 다음 예제에서는 sg-1sg-2에 대한 사용자 액세스를 거부합니다.

{ "Sid": "EnforceOutOfSecurityGroups", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

사용자가 특정 VPC 설정을 사용하여 함수를 생성 및 업데이트하도록 허용

특정 VPC에 대한 사용자의 액세스를 허용하려면 StringEquals를 사용하여 lambda:VpcIds 조건 값을 확인합니다. 다음 예제에서는 사용자가 vpc-1vpc-2에 액세스하도록 허용합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceStayInSpecificVpc", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

특정 서브넷에 대한 사용자의 액세스를 허용하려면 StringEquals를 사용하여 lambda:SubnetIds 조건 값을 확인합니다. 다음 예제에서는 사용자가 subnet-1subnet-2에 액세스하도록 허용합니다.

{ "Sid": "EnforceStayInSpecificSubnets", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

특정 보안 그룹에 대한 사용자의 액세스를 허용하려면 StringEquals를 사용하여 lambda:SecurityGroupIds 조건 값을 확인합니다. 다음 예제에서는 사용자가 sg-1sg-2에 액세스하도록 허용합니다.

{ "Sid": "EnforceStayInSpecificSecurityGroup", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

VPC 연결 함수의 인터넷 및 서비스 액세스

기본적으로 Lambda는 AWS 서비스 액세스 및 인터넷을 통해 안전한 VPC에서 함수를 실행합니다. Lambda가 이 VPC를 소유하며, 해당 VPC는 계정의 기본 VPC에 연결되지 않습니다. 계정에서 VPC에 함수를 연결할 때 VPC가 액세스 권한을 제공하지 않으면 함수는 인터넷에 액세스할 수 없습니다.

참고

일부 AWS 서비스에서는 VPC 엔드포인트를 제공합니다. VPC 엔드포인트를 사용하면 VPC 내에서 인터넷 액세스 권한 없이 AWS 서비스에 연결할 수 있습니다.

프라이빗 서브넷에서의 인터넷 액세스에는 NAT(Network Address Translation)가 필요합니다. 함수에 인터넷 액세스 권한을 부여하려면 아웃바운드 트래픽을 퍼블릭 서브넷의 NAT 게이트웨이로 라우팅합니다. NAT 게이트웨이는 퍼블릭 IP 주소가 있으므로 VPC의 인터넷 게이트웨이를 통해 인터넷에 연결할 수 있습니다. 유휴 상태의 NAT 게이트웨이 연결은 350초 후에 중단됩니다. 자세한 내용은 VPC에서 Lambda 함수에 인터넷 액세스 권한을 제공하려면 어떻게 해야 합니까?를 참조하세요.

VPC 자습서

다음 자습서에서는 Lambda 함수를 VPC의 리소스에 연결합니다.

샘플 VPC 구성

다음 샘플 AWS CloudFormation 템플릿을 사용하여 Lambda 함수와 함께 사용할 VPC 구성을 생성할 수 있습니다. 이 가이드의 GitHub 저장소에는 두 가지 템플릿이 있습니다.

  • vpc-private.yaml – Amazon Simple Storage Service(Amazon S3) 및 Amazon DynamoDB에 대해 2개의 프라이빗 서브넷과 VPC 엔드포인트를 갖는 VPC입니다. 이 템플릿을 사용하여 인터넷 액세스 권한이 필요하지 않은 함수에 대한 VPC를 생성합니다. 이 구성은 AWS SDK에서의 Amazon S3 및 DynamoDB 사용을 지원하며, 로컬 네트워크 연결을 통해 동일한 VPC에 있는 데이터베이스 리소스에 대한 액세스를 지원합니다.

  • vpc-privatepublic.yaml – 두 개의 프라이빗 서브넷, VPC 엔드포인트, NAT 게이트웨이가 포함된 퍼블릭 서브넷 및 인터넷 게이트웨이가 있는 VPC입니다. 프라이빗 서브넷의 함수에서 발생하는 인터넷 바인딩된 트래픽은 라우팅 테이블을 사용하여 NAT 게이트웨이로 라우팅됩니다.

템플릿을 사용하여 VPC를 생성하려면 AWS CloudFormation 콘솔 스택 페이지에서 스택 생성을 선택한 다음 스택 생성 마법사의 지침을 따릅니다.