Lambda 함수에 Amazon VPC의 리소스에 대한 액세스 권한 부여
Amazon Virtual Private Cloud(VPC)를 사용하면 AWS 계정에 프라이빗 네트워크를 생성하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스, Amazon Relational Database Service(RDS) 인스턴스 및 Amazon ElastiCache 인스턴스 같은 리소스를 호스팅할 수 있습니다. 리소스가 포함된 프라이빗 서브넷을 통해 함수를 VPC에 연결하여 Lambda 함수에 Amazon VPC에서 호스팅된 리소스에 대한 액세스 권한을 부여할 수 있습니다. Lambda 콘솔 AWS Command Line Interface(AWS CLI) 또는 AWS SAM을 사용하여 Amazon VPC에 Lambda 함수를 연결하려면 다음 섹션의 지침을 따릅니다.
참고
모든 Lambda 함수는 Lambda 서비스가 소유하고 관리하는 VPC 내에서 실행됩니다. 이러한 VPC는 Lambda에 의해 자동으로 유지 관리되며 고객에게는 표시되지 않습니다. Amazon VPC의 다른 AWS 리소스에 액세스하도록 함수를 구성해도 함수가 내부에서 실행하는 Lambda 관리형 VPC에는 영향을 미치지 않습니다.
Sections
필수 IAM 권한
Lambda 함수를 AWS 계정의 Amazon VPC에 연결하려면 Lambda가 사용하는 네트워크 인터페이스를 생성하고 관리할 권한이 있어야 함수에 VPC의 리소스에 대한 액세스 권한을 부여할 수 있습니다.
Lambda가 생성하는 네트워크 인터페이스는 Hyperplane 탄력적 네트워크 인터페이스 또는 Hyperplane ENI라고 알려져 있습니다. 이러한 네트워크 인터페이스에 대한 자세한 내용은 Hyperplane 탄력적 네트워크 인터페이스(ENIs) 이해하기 섹션을 참조하세요.
함수의 실행 역할에 AWS 관리형 정책 AWSLambdaVPCAccessExecutionRole을 연결하여 함수에 필요한 권한을 부여할 수 있습니다. Lambda 콘솔에서 새 함수를 생성하여 VPC에 연결하면 Lambda는 자동으로 이 권한 정책을 추가합니다.
자체 IAM 권한 정책을 생성하고 싶다면 다음 권한을 모두 추가해야 합니다.
-
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
참고로 함수 역할에는 네트워크 인터페이스를 생성할 때만 이러한 권한이 필요하며 함수를 호출할 때는 필요하지 않습니다. 함수의 실행 역할에서 이러한 권한을 제거하더라도 함수가 Amazon VPC에 연결된 경우 여전히 성공적으로 함수를 호출할 수 있습니다.
함수를 VPC에 연결하려면 Lambda는 또한 IAM 사용자 역할을 사용하여 네트워크 리소스를 확인해야 합니다. 사용자 역할에 IAM 권한이 있는지 확인해야 합니다.
-
ec2:DescribeSecurityGroups
-
ec2:DescribeSubnets
-
ec2:DescribeVpcs
참고
함수의 실행 역할에 부여한 Amazon EC2 권한은 Lambda 서비스에서 함수를 VPC에 연결하는 데 사용됩니다. 그러나 이러한 권한을 함수 코드에도 암시적으로 부여하고 있습니다. 이는 함수 코드가 이러한 Amazon EC2 API 호출을 수행할 수 있다는 의미입니다. 보안 모범 사례 준수에 대한 자세한 내용은 보안 모범 사례 섹션을 참조하세요.
Lambda 함수를 AWS 계정의 Amazon VPC에 연결하기
Lambda 콘솔인 AWS CLI 또는 AWS SAM을 사용하여 함수를 AWS 계정의 Amazon VPC에 연결합니다. AWS CLI 또는 AWS SAM을 사용하는 경우나 Lambda 콘솔을 사용하여 VPC에 기존 함수를 연결하는 경우에는 함수의 실행 역할에 이전 섹션에서 나열된 필수 권한이 있는지 확인합니다.
Lambda 함수는 전용 인스턴스 테넌시를 사용하여 VPC에 직접 연결할 수 없습니다. 전용 VPC의 리소스에 연결하려면, 기본 테넌시를 사용하여 두 번째 VPC에 피어로 연결
VPC에 연결 시 인터넷 액세스
기본적으로 Lambda 함수는 퍼블릭 인터넷에 액세스할 수 있습니다. 함수를 VPC에 연결하는 경우 해당 VPC 내에서 사용 가능한 리소스에만 액세스할 수 있습니다. 함수에 인터넷 액세스 권한을 부여하려면 인터넷에 액세스 할 수 있도록 VPC도 구성해야 합니다. 자세한 내용은 VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화을 참조하십시오.
IPv6 지원
함수는 IPv6를 통해 듀얼 스택 VPC 서브넷의 리소스에 연결할 수 있습니다. 이 옵션은 기본적으로 꺼져 있습니다. 아웃바운드 IPv6 트래픽을 허용하려면, 콘솔을 사용하거나 create-function--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()
Amazon VPC로 Lambda를 사용하는 모범 사례
Lambda VPC 구성이 모범 사례 지침을 준수하려면 다음 섹션의 조언을 따릅니다.
보안 모범 사례
Lambda 함수를 VPC에 연결하려면 함수의 실행 역할에 여러 Amazon EC2 권한을 부여해야 합니다. 함수가 VPC의 리소스에 액세스하는 데 사용하는 네트워크 인터페이스를 생성하려면 이러한 권한이 필요합니다. 그러나 이러한 권한은 함수 코드에도 암시적으로 부여됩니다. 이는 함수 코드에 이러한 Amazon EC2 API 호출을 수행할 수 있는 권한이 있다는 의미입니다.
최소 권한 액세스 원칙을 따르려면 함수의 실행 역할에 다음 예시와 같은 거부 정책을 추가합니다. 이 정책은 Lambda 서비스가 함수를 VPC에 연결하는 데 사용하는 Amazon EC2 API를 함수가 호출하지 못하게 합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "ec2:CreateNetworkInterface", "ec2:DeleteNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSubnets", "ec2:DetachNetworkInterface", "ec2:AssignPrivateIpAddresses", "ec2:UnassignPrivateIpAddresses" ], "Resource": [ "*" ], "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": [ "arn:aws:lambda:us-west-2:123456789012:function:my_function" ] } } } ] }
AWS는 VPC의 보안을 강화하기 위해 보안 그룹과 네트워크 액세스 제어 목록(ACL)을 제공합니다. 보안 그룹은 리소스용 인바운드 및 아웃바운드 트래픽을 제어하고, 네트워크 ACL은 서브넷용 인바운드 및 아웃바운드 트래픽을 제어합니다. 보안 그룹은 대부분의 서브넷에 대해 충분한 액세스 제어를 제공합니다. VPC에 대한 추가 보안 계층을 원하는 경우 네트워크 ACL을 사용할 수 있습니다. Amazon VPC를 사용할 때의 보안 모범 사례에 대한 일반 지침은 Amazon Virtual Private Cloud 사용 설명서에서 VPC의 보안 모범 사례를 참조하세요.
성능 모범 사례
함수를 VPC에 연결하면 Lambda는 연결에 사용할 수 있는 이용 가능한 네트워크 리소스(Hyperplane ENI)가 있는지 확인합니다. Hyperplane ENI는 보안 그룹 및 VPC 서브넷의 특정 조합과 연결됩니다. 한 함수를 VPC에 이미 연결한 경우 다른 함수를 연결할 때 동일한 서브넷과 보안 그룹을 지정하면 Lambda가 네트워크 리소스를 공유할 수 있으므로 Hyperplane ENI를 새로 생성할 필요가 없어집니다. Hyperplane ENI와 수명 주기에 대한 자세한 내용은 Hyperplane 탄력적 네트워크 인터페이스(ENIs) 이해하기 섹션을 참조하세요.
Hyperplane 탄력적 네트워크 인터페이스(ENIs) 이해하기
Hyperplane ENI는 Lambda 함수와 함수를 연결하려는 리소스 간의 네트워크 인터페이스 역할을 하는 관리형 리소스입니다. Lambda 서비스는 함수를 VPC에 연결할 때 이러한 ENI를 자동으로 생성하고 관리합니다.
Hyperplane ENI는 직접 볼 수 없으므로 구성하거나 관리할 필요가 없습니다. 하지만 작동 방식을 알면 함수를 VPC에 연결할 때의 함수 동작을 이해하는 데 도움이 될 수 있습니다.
특정 서브넷과 보안 그룹 조합을 사용하여 함수를 VPC에 처음 연결하는 경우 Lambda가 Hyperplane ENI를 생성합니다. 동일한 서브넷과 보안 그룹 조합을 사용하는 계정의 다른 함수도 이 ENI를 사용할 수 있습니다. Lambda는 가능한 곳에서 기존 ENI를 재사용하여 리소스 활용을 최적화하고 새 ENI 생성을 최소화합니다. 각 Hyperplane ENI는 최대 65,000개의 연결/포트를 지원합니다. 연결 수가 이 한도를 초과하는 경우 Lambda는 네트워크 트래픽 및 동시성 요구 사항에 따라 ENI 수를 자동으로 조정합니다.
새 함수의 경우, Lambda가 Hyperplane ENI를 생성하는 동안에는 함수가 보류 중 상태로 유지되므로 함수를 호출할 수 없습니다. 함수는 Hyperplane ENI가 준비된 경우에만 활성 상태로 전환되며 몇 분 정도 소요될 수 있습니다. 기존 함수의 경우 버전 생성 또는 함수의 코드 업데이트 같이 함수를 대상으로 하는 추가 작업을 수행할 수는 없지만 이전 버전의 함수를 계속 호출할 수는 있습니다.
참고
Lambda 함수가 연속으로 30일 동안 유휴 상태로 유지되면 Lambda는 사용되지 않는 모든 Hyperplane ENI를 회수하고 함수 상태를 유휴 상태로 설정합니다. 다음 호출은 실패하며 Lambda가 Hyperplane ENI의 생성 또는 할당을 완료할 때까지 함수는 보류 중 상태로 다시 전환됩니다. Lambda 함수 상태에 대한 자세한 내용은 Lambda 함수 상태 섹션을 참조하세요.
VPC 설정에 IAM 조건 키 사용
VPC 설정에 Lambda 특정 조건 키를 사용하여 Lambda 함수에 대한 추가 권한 제어를 제공할 수 있습니다. 예를 들어 조직의 모든 함수가 VPC에 연결되도록 요구할 수 있습니다. 또한 함수의 사용자가 사용할 수 있고 사용할 수 없는 서브넷 및 보안 그룹을 지정할 수도 있습니다.
Lambda는 IAM 정책에서 다음 조건 키를 지원합니다.
-
lambda:VpcIds – 하나 이상의 VPC를 허용하거나 거부합니다.
-
lambda:SubnetIds – 하나 이상의 서브넷을 허용하거나 거부합니다.
-
lambda:SecurityGroupIds – 하나 이상의 보안 그룹을 허용하거나 거부합니다.
Lambda API 작업 CreateFunction 및 UpdateFunctionConfiguration은 이러한 조건 키를 지원합니다. 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-1
및 vpc-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-1
및 subnet-2
에 대한 사용자 액세스를 거부합니다.
{ "Sid": "EnforceOutOfSubnet", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }
특정 보안 그룹에 대한 사용자의 액세스를 거부하려면 StringEquals
를 사용하여 lambda:SecurityGroupIds
조건 값을 확인합니다. 다음 예제에서는 sg-1
및 sg-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-1
및 vpc-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-1
및 subnet-2
에 액세스하도록 허용합니다.
{ "Sid": "EnforceStayInSpecificSubnets", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }
특정 보안 그룹에 대한 사용자의 액세스를 허용하려면 StringEquals
를 사용하여 lambda:SecurityGroupIds
조건 값을 확인합니다. 다음 예제에서는 사용자가 sg-1
및 sg-2
에 액세스하도록 허용합니다.
{ "Sid": "EnforceStayInSpecificSecurityGroup", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }
VPC 자습서
다음 자습서에서는 Lambda 함수를 VPC의 리소스에 연결합니다.