実行毎に変わるLambdaのIPを固定。
呼び出し先のAPIにIPをホワイトリスト登録するなどで利用。
構成図
環境
- VPCを1つ用意する。
- サブネットとルーティングテーブルを2つずつ用意し、それぞれアタッチする。
- インターネットゲートウェイを作成し、VPCにアタッチ
- パブリックサブネットのルーティングテーブルの
0.0.0.0/0
をインターネットゲートウェイに向ける。 - EIP確保、NATゲートウェイ作成、プライベートサブネットのテーブルの
0.0.0.0/0
をNATに向ける。
Lambdaの作成/配置
- IAMロールの作成。ポリシーは
AWSLambdaVPCAccessExecutionRole
- Lambda作成。
- LambdaコンソールのVPCを編集し、上記で作成した環境を選択する。適応までちょっと待つ。
検証
API Gatewayで呼び出し元のIPを表示してみる。
統合リクエストから以下を設定することで呼び出し元のIPを取得できる。
統合リクエストのマッピング
{
"sourceIp" : "$context.identity.sourceIp",
"input" : $input.path('$')
}
Lambda側のコード抜粋
request_url = "https://******.execute-api.ap-northeast-1.amazonaws.com/****"
api_key = "**********"
def lambda_handler(event, context):
headers = {'x-api-key': api_key, "Content-Type":"application/json"}
req = urllib.request.Request(url=request_url, method="GET", headers=headers)
with urllib.request.urlopen(req) as res:
body = res.read().decode("utf-8")
return json.loads(body)