Lambda용 인바운드 인터페이스 VPC 엔드포인트 연결하기
Lambda용 인바운드 인터페이스 VPC 엔드포인트 연결하기 (Connecting inbound interface VPC endpoints for Lambda)
Amazon Virtual Private Cloud(Amazon VPC)로 AWS 리소스를 호스팅한다면 VPC와 Lambda 사이에 연결을 설정할 수 있어요. 이 연결로 공용 인터넷을 거치지 않고 Lambda 함수를 호출할 수 있어요.
VPC와 Lambda 사이의 프라이빗 연결을 설정하려면 인터페이스 VPC 엔드포인트(interface VPC endpoint)를 만들어요. 인터페이스 엔드포인트는 AWS PrivateLink가 구동해요. AWS PrivateLink로는 인터넷 게이트웨이, NAT 디바이스, VPN 연결, AWS Direct Connect 연결 없이 Lambda API에 프라이빗하게 접근할 수 있어요. VPC의 인스턴스는 Lambda API와 통신하기 위해 공용 IP 주소가 필요하지 않아요. VPC와 Lambda 사이의 트래픽은 AWS 네트워크를 벗어나지 않아요.
각 인터페이스 엔드포인트는 서브넷의 하나 이상의 탄력적 네트워크 인터페이스(elastic network interface)로 표현돼요. 네트워크 인터페이스는 Lambda로 가는 트래픽의 진입점 역할을 하는 프라이빗 IP 주소를 제공해요.
섹션
- Lambda 인터페이스 엔드포인트 고려 사항
- Lambda용 인터페이스 엔드포인트 만들기
- Lambda용 인터페이스 엔드포인트 정책 만들기
본문
Lambda 인터페이스 엔드포인트 고려 사항
Lambda용 인터페이스 엔드포인트를 설정하기 전에 Amazon VPC User Guide의 인터페이스 엔드포인트 속성과 제한 사항을 검토하세요.
VPC에서 Lambda API 연산을 호출할 수 있어요. 예를 들어 VPC 안에서 Invoke API를 호출해 Lambda 함수를 호출할 수 있죠. Lambda API 전체 목록은 Lambda API 레퍼런스의 Actions를 참고하세요.
use1-az3는 Lambda VPC 함수를 위한 제한 용량 리전이에요. 이 가용 영역의 서브넷을 Lambda 함수와 함께 쓰지 않는 게 좋아요. 장애 발생 시 영역 중복성(zonal redundancy)이 줄어들 수 있기 때문이에요.
영구 연결의 keep-alive
Lambda는 시간이 지나면서 유휴 연결을 정리(purge)하므로 영구 연결을 유지하려면 keep-alive 지시문을 사용해야 해요. 함수를 호출할 때 유휴 연결을 재사용하려 하면 연결 오류가 발생해요. 영구 연결을 유지하려면 런타임에 연결된 keep-alive 지시문을 사용해요. 예시는 AWS SDK for JavaScript Developer Guide의 Node.js에서 Keep-Alive로 연결 재사용하기를 참고하세요.
요금 고려 사항
인터페이스 엔드포인트를 통해 Lambda 함수에 접근하는 데 추가 비용은 없어요. Lambda 가격에 대한 자세한 내용은 AWS Lambda Pricing을 참고하세요.
AWS PrivateLink의 표준 요금이 Lambda용 인터페이스 엔드포인트에 적용돼요. 각 가용 영역에서 인터페이스 엔드포인트가 프로비저닝된 시간마다, 그리고 인터페이스 엔드포인트를 통해 처리된 데이터에 대해 요금이 부과돼요. 인터페이스 엔드포인트 요금에 대한 자세한 내용은 AWS PrivateLink pricing을 참고하세요.
VPC 피어링 고려 사항
VPC 피어링(VPC peering)으로 인터페이스 엔드포인트가 있는 VPC에 다른 VPC를 연결할 수 있어요. VPC 피어링은 두 VPC 사이의 네트워킹 연결이에요. 여러분의 두 VPC 사이에, 또는 다른 AWS 계정의 VPC와 VPC 피어링 연결을 설정할 수 있어요. VPC는 서로 다른 두 AWS 리전에 있을 수도 있어요.
피어링된 VPC 사이의 트래픽은 AWS 네트워크에 머무르고 공용 인터넷을 통과하지 않아요. VPC가 피어링되면 두 VPC의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스, Amazon Relational Database Service(Amazon RDS) 인스턴스, 또는 VPC 지원 Lambda 함수 같은 리소스가 한 VPC에 만들어진 인터페이스 엔드포인트를 통해 Lambda API에 접근할 수 있어요.
Lambda용 인터페이스 엔드포인트 만들기
Amazon VPC 콘솔이나 AWS Command Line Interface(AWS CLI)로 Lambda용 인터페이스 엔드포인트를 만들 수 있어요. 자세한 내용은 Amazon VPC User Guide의 인터페이스 엔드포인트 만들기를 참고하세요.
Lambda용 인터페이스 엔드포인트 만들기 (콘솔)
- Amazon VPC 콘솔의 Endpoints 페이지를 열어요.
- Create Endpoint를 선택해요.
- Service category에서 AWS services가 선택됐는지 확인해요.
- Service Name에서 com.amazonaws.
region.lambda를 선택하고 Type이 Interface인지 확인해요. - VPC와 서브넷을 선택해요.
- 인터페이스 엔드포인트의 프라이빗 DNS를 활성화하려면 Enable DNS Name 확인란을 선택해요. AWS 서비스용 VPC 엔드포인트에는 프라이빗 DNS 이름을 활성화할 것을 권장해요. 그러면 AWS SDK를 통한 요청처럼 공용 서비스 엔드포인트를 사용하는 요청이 VPC 엔드포인트로 해석되도록 보장돼요.
- Security group에서 하나 이상의 보안 그룹을 선택해요.
- Create endpoint를 선택해요.
프라이빗 DNS 옵션을 사용하려면 VPC의 enableDnsHostnames와 enableDnsSupport 속성을 설정해야 해요. 자세한 내용은 Amazon VPC User Guide의 VPC의 DNS 지원 보기·업데이트하기를 참고하세요. 인터페이스 엔드포인트에서 프라이빗 DNS를 활성화하면 리전의 기본 DNS 이름(예: lambda.us-east-1.amazonaws.com)으로 Lambda에 API 요청을 할 수 있어요. 더 많은 서비스 엔드포인트는 AWS General Reference의 Service endpoints and quotas를 참고하세요.
자세한 내용은 Amazon VPC User Guide의 인터페이스 엔드포인트를 통한 서비스 접근을 참고하세요.
CloudFormation으로 엔드포인트를 만들고 구성하는 방법은 AWS CloudFormation User Guide의 AWS::EC2::VPCEndpoint 리소스를 참고하세요.
Lambda용 인터페이스 엔드포인트 만들기 (AWS CLI)
create-vpc-endpoint 명령으로 VPC ID, VPC 엔드포인트 유형(interface), 서비스 이름, 엔드포인트를 사용할 서브넷, 엔드포인트의 네트워크 인터페이스와 연결할 보안 그룹을 지정해요. 예를 들면 다음과 같아요.
aws ec2 create-vpc-endpoint \
--vpc-id vpc-ec43eb89 \
--vpc-endpoint-type Interface \
--service-name com.amazonaws.us-east-1.lambda \
--subnet-id subnet-abababab \
--security-group-id sg-1a2b3c4d
Lambda용 인터페이스 엔드포인트 정책 만들기
인터페이스 엔드포인트를 누가 사용할 수 있고 사용자가 어떤 Lambda 함수에 접근할 수 있는지 제어하려면 엔드포인트에 엔드포인트 정책을 연결할 수 있어요. 정책은 다음 정보를 지정해요.
- 작업을 수행할 수 있는 주체(principal)
- 주체가 수행할 수 있는 작업(action)
- 주체가 작업을 수행할 수 있는 리소스
자세한 내용은 Amazon VPC User Guide의 VPC 엔드포인트로 서비스 접근 제어하기를 참고하세요.
예시: Lambda 작업용 인터페이스 엔드포인트 정책
다음은 Lambda용 엔드포인트 정책의 예시예요. 엔드포인트에 연결되면 이 정책은 사용자 MyUser가 함수 my-function을 호출할 수 있게 해줘요.
참고 리소스에 한정된(qualified) ARN과 비한정(unqualified) 함수 ARN을 모두 포함해야 해요.
{
"Statement": [
{
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/MyUser"
},
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:us-east-2:123456789012:function:my-function",
"arn:aws:lambda:us-east-2:123456789012:function:my-function:*"
]
}
]
}
다른 AWS 계정이 소유한 VPC의 리소스에 함수가 접근하게 하려면 다른 계정의 Amazon VPC 리소스에 Lambda 함수 접근 부여하기를 참고하세요.