AWS Lambda 에서 외부에서 자료를 읽어와 VPC 의 RDS 에 저장하는 function 을 만들었다.
RDS 저장을 위해 Lambda 에 VPC 를 설정하면 외부 통신이 안되고, VPC 를 빼버리면 RDS 저장이 안되고.
기본적으로 Lambda 에 VPC 를 설정하면 선택된 서브넷으로만 접근을 할 수 있다.
Lambda 는 Public IP 가 없기 때문에 Internet Gateway 를 사용할 수 없고, 대신에 NAT Gateway 에 EIP 를 할당하여 사용할 수 있다.
Lambda 설정시 VPC 를 선택하면 아래와 같은 주의문을 볼 수 있다.
When you enable VPC, your Lambda function will lose default internet access. If you require external internet access for your function, ensure that your security group allows outbound connections and that your VPC has a NAT gateway.
-> 외부 인터넷 접근을 위해 시큐리티 그룹에 아웃바운드를 허용하고, NAT gateway 를 설정하라는...
NAT(Network Address Translation) gateway 은 자체 IP 를 할당하여 private 서브넷에 속한 인스턴스들을 외부망으로 보낼 수 있도록 한다.
NAT gateway 은 public 서브넷을 지정하여 IP 할당하면 생성 완료되며, private 서브넷과 연결된 라우팅 테이블에 nat-xxxxxxx 를 업데이트하면 설정 끝.
그리고 lambda 서블릿에 해당 private 서브넷을 설정하고, outbound 가능한 security group 을 선택하면 완료!
VPC 의 일반적인 EC2 와 Lambda 에서 외부망 통신하는 플로우는 다음과 같다.
VPC EC2(EIP) -> Public Subnet -> Routing Table(IGW) -> Internet Gateway -> Internet
VPC Lambda -> Private Subnet -> Routing Table(NAT) -> NAT Gateway(EIP) -> Public Subnet -> Routing Table(IGW) -> Internet Gateway -> Internet
Lambda 에서 간단히 inline Python 소스를 만들어 테스트 해 볼 수 있다.
from urllib import request def lambda_handler(event, context): response = request.urlopen('https://www.google.com/') return response | cs |
Timeout 걸리면 실패. 응답이 있으면 성공.
VPC 는 꽁짜지만, NAT gateway 가 유료라는 건 함정.
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.