Linux, Server, Web

AWS Lambda 에서 RDS + 외부 인터넷 접근

iolate 2017. 7. 30. 02:26

내가 만든 Lambda 함수에서는 AWS RDS 에 접근도 필요했고, 외부 인터넷으로의 접근도 필요했다.

RDS SG(Security Group) 설정상 Lambda 를 VPC 내에 뒀는데, 이러면 Lambda 에서 외부 인터넷으로 접근이 안된다..!


현재 내가 찾은 해결법들은 꼼수 포함 4가지.

1. RDS의 SG설정을 전체 허용, 혹은 Amazon EC2 IP 목록 허용한다.

SG를 전체허용한다면 Lambda 를 VPC 내에 두는 이유가 사라진다.


후자는 Lambda 가 있는 리전의 Amazon EC2 IP 들을 RDS 의 SG 에 때려박아두는 방법.


Amazon 이 사용하는 IP 주소 목록은

https://ip-ranges.amazonaws.com/ip-ranges.json

이 주소에서 JSON 형태로 확인할 수 있다.


관련 설명은 https://docs.aws.amazon.com/ko_kr/general/latest/gr/aws-ip-ranges.html 여기 참고.



대충 위의 접어둔 파이썬 코드를 이용해서,

ap-northeast-2 region 의 EC2 service ip prefix 만 가져온 다음에, 이걸 Security Group 에 넣으면 해결.


Source 에 쉼표로 구분된 값을 넣고 저장하면 알아서 분리된다.


2. AWS에서 제공하는 Managed NAT Gateway를 사용한다.

 VPC 에 Managed NAT Gateway 를 생성하여, VPC 내의 Private subnet 이 외부 인터넷 접속이 가능해주게끔 구성하는 방법

다만 이 NAT Gateway 비용이 월 $40가 넘는다...


3. 외부 인터넷으로 접근하는 함수, VPC 내에서 DB에 접근하는 함수 두개를 만들어 함께 사용한다.

Lambda 비용이 두배로 들겠지만, 어차피 1백만회를 초과할 것 같지도 않고, 초과해도 NAT Gateway 비용보다는 쌀 것 같달까...


다만, VPC 설정이 된 람다함수는 다른 람다함수를 호출할 수 없다. 람다 호출 자체가 외부 인터넷을 사용하는 셈이라..

VPC 밖의 함수를 A(외부 인터넷 연결 가능), VPC 안의 함수를 B 라고 한다면,

항상 A 호출 -> A에서 B를 호출하여 DB작업 -> A에서 결과를 받아서 후처리 -> 반환

의 형태를 취해야한다. 경우에 따라 상관없을 수도 있지만 비효율적으로 될 수도 있는 방법.


4번의 방법을 몰랐기 때문에 난 이렇게 구성해뒀다.


4. ec2 로 NAT instance 를 직접 구축한다.

AWS 에 문서가 있다. -> VPC NAT Instances


후에 시간있을때 적용해볼 예정.

위 글에선 미리 만들어진 AMI를 사용하는데, 나는 기존 Ubuntu Instance 를 어떻게 활용해볼 예정이다.