안녕하세요.
서버리스 환경에서 외부 서비스와 통신할 때, IP를 고정해야 하는 상황이 종종 발생합니다. 예를 들어, 방화벽이 등록된 IP만 허용할 경우, Lambda 함수가 외부와 통신할 때 사용하는 IP를 고정해야 하죠.
이번 글에서는 AWS Lambda 함수에 고정 IP(Elastic IP)를 부여하는 방법을 하나하나 단계별로 설명드리겠습니다.
목표
- AWS Lambda 함수가 외부로 나가는 요청에 대해 고정 IP(Elastic IP) 사용
- 이를 위해 VPC, 프라이빗 서브넷, NAT Gateway, EIP 구성
1️⃣ Lambda 함수 준비하기
먼저 테스트용 Lambda 함수를 생성하겠습니다.
- 런타임:
Python 3.12
- 함수 이름: 자유롭게 설정
▶️ 예제 코드 (IP 확인용)
import json
import urllib.request
def lambda_handler(event, context):
try:
with urllib.request.urlopen("<https://api.ipify.org?format=json>") as response:
ip_data = response.read().decode("utf-8")
return {
'statusCode': 200,
'body': json.dumps({
'message': 'Success',
'public_ip': json.loads(ip_data)['ip']
})
}
except Exception as e:
return {
'statusCode': 500,
'body': json.dumps({
'message': 'Error fetching IP',
'error': str(e)
})
}
이 코드는 Lambda 함수가 외부에 요청을 보내고, 어떤 IP로 요청이 나가는지 확인하는 테스트용 함수입니다.
2️⃣ Lambda를 VPC에 연결하기
Lambda 함수 → 구성 탭 → VPC → 편집
- VPC: 기존 또는 새로 만든 VPC
- 서브넷: 프라이빗 서브넷 선택 (중요!)
- 보안 그룹: 아웃바운드 80/443 허용
❓ 왜 프라이빗 서브넷인가요?
- Lambda는 퍼블릭 IP를 자동으로 할당받지 않기 때문에, 퍼블릭 서브넷에 연결해도 외부와 통신할 수 없습니다.
- 외부와 통신하려면 프라이빗 서브넷 + NAT Gateway + EIP 구조를 통해 나가야 합니다.
3️⃣ IAM 역할 설정 (네트워크 권한 추가)
Lambda 함수가 VPC 내에서 동작하려면 ENI(Network Interface)를 만들 수 있는 권한이 필요합니다.
- Lambda → 구성 → 권한 → 연결된 IAM 역할 클릭
- 권한 추가 → 정책 연결
- AmazonEC2FullAccess (또는
ec2:CreateNetworkInterface
등 최소 권한 정책) 추가
4️⃣ VPC 네트워크 구성
이제 Lambda 함수가 나갈 수 있는 네트워크 출구를 만들어야 합니다.
① Elastic IP (EIP) 생성
- VPC → 탄력적 IP → 새 주소 할당
② NAT Gateway 생성
- VPC → NAT 게이트웨이 → 생성
- 퍼블릭 서브넷에 NAT Gateway 생성
- 위에서 만든 EIP 연결
NAT Gateway는 반드시 퍼블릭 서브넷에 있어야 하고, EIP를 연결해야 고정 IP가 부여됩니다.
③ 서브넷 라우팅 테이블 구성
- 프라이빗 서브넷의 라우팅 테이블을 열고
0.0.0.0/0
→ 대상: NAT Gateway
- 퍼블릭 서브넷의 라우팅 테이블에는
0.0.0.0/0
→ 대상: 인터넷 게이트웨이(IGW)
5️⃣ 테스트
Lambda 함수로 돌아가서 Test
를 실행해봅니다.
정상 동작 시, 반환된 IP가 Elastic IP와 동일해야 합니다.
✨ 이제 Lambda 함수가 항상 고정된 IP를 통해 외부와 통신하게 됩니다!
이처럼 AWS Lambda에서도 VPC, NAT Gateway, EIP를 적절히 활용하면
고정 IP를 사용할 수 있습니다.
이 방법은 외부 서비스에서 IP 허용 목록(Whitelist)을 적용해야 할 때 매우 유용합니다.
감사합니다
📚 참고 자료