VPC에서 리소스에 액세스하도록 Lambda 함수 구성 - AWS Lambda

VPC에서 리소스에 액세스하도록 Lambda 함수 구성

AWS 계정에서 VPC(Virtual Private Cloud)의 프라이빗 서브넷에 연결하도록 Lambda 함수를 구성할 수 있습니다. Amazon Virtual Private Cloud(Amazon VPC)를 사용하여 데이터베이스, 캐시 인스턴스, 내부 서비스 등과 같은 리소스에 대해 프라이빗 네트워크를 생성하십시오. 함수를 VPC에 연결하여 실행 중 프라이빗에 리소스에 액세스합니다.

함수를 VPC에 연결하려면

  1. Lambda 콘솔 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

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

  4. VPC 연결의 경우 사용자 지정 VPC를 선택합니다.

  5. VPC, 서브넷 및 보안 그룹을 선택합니다.

    참고

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

  6. 저장을 선택합니다.

함수를 VPC에 연결하면 Lambda은 함수의 VPC 구성에서 보안 그룹과 서브넷의 각 조합에 대해 탄력적 네트워크 인터페이스를 생성합니다. 이 프로세스는 1분 정도 걸릴 수 있습니다.

Lambda이 네트워크 인터페이스를 생성하는 동안에는 버전 생성 또는 함수 코드 업데이트와 같이 함수를 대상으로 하는 추가 작업을 수행할 수 없습니다. 새 함수의 경우 상태가 Pending에서 Active로 전환될 때까지 함수를 호출할 수 없습니다. 기존 함수의 경우 업데이트가 진행 중인 동안에도 이전 버전을 호출할 수 있습니다. 함수 상태에 대한 자세한 내용은 Lambda API를 사용하여 함수 상태 모니터링 단원을 참조하십시오.

동일한 서브넷에 연결된 여러 함수는 네트워크 인터페이스를 공유합니다. 기존 Lambda 관리형 네트워크 인터페이스가 있는 서브넷에 추가 함수를 연결하는 것은 Lambda에서 추가 네트워크 인터페이스를 생성하는 것보다 훨씬 빠릅니다. 하지만 함수가 많이 있거나 사용량이 매우 많은 함수가 있는 경우 Lambda은 추가 네트워크 인터페이스를 생성할 수 있습니다.

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

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

실행 역할 및 사용자 권한

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

실행 역할 권한

  • ec2:CreateNetworkInterface

  • ec2:DescribeNetworkInterfaces

  • ec2:DeleteNetworkInterface

이러한 권한은 AWS 관리형 정책 AWSLambdaVPCAccessExecutionRole에 포함됩니다.

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

사용자 권한

  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

Lambda API를 사용한 VPC 액세스 구성

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

함수를 생성하고 AWS Command Line Interface(AWS CLI)를 사용하여 VPC에 연결하려면 create-function 명령을 vpc-config 옵션과 함께 사용하면 됩니다. 다음 예제에서는 두 개의 서브넷과 하나의 보안 그룹이 있는 VPC에 연결하여 함수를 생성합니다.

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

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

$ 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 설정에 조건 키를 사용하는 방법을 보여줍니다. 원하는 제한 사항이 있는 정책 구문을 생성한 후 대상 IAM 사용자 또는 역할에 대한 정책 구문을 추가합니다.

사용자가 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가 액세스 권한을 제공하지 않으면 함수는 인터넷에 액세스할 수 없습니다.

참고

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

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

샘플 VPC 구성

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

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

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

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