「困ったら大体lambda(とS3)」「lambda イズ 仙道」、AWSの基本ですね()
ただ彼は基本的に固定IPを持ちません。仙道同様、気まぐれです。
今回はそんな彼に固定IPを付与する方法をまとめます。
また、結果としてVPC&サブネットへ所属させる方法にもなります。
どんな時に役立つか
例えば
- 申請式で特定IPからのアクセスしか認められないサービスとの連携
- インスタンス内で動くIP制限付きサイトの死活監視
- プライベートサブネット内のインスタンスと通信
※インスタンスそのものの監視はcloudwatchでどうぞ
構成図
手順
手順的には大まかに以下の形です。
- lambdaをVPC内のプライベートサブネットに設置
- lambdaのロールにvpc、eniに関する権限を追加
- パブリックサブネットにNATゲートウェイを設置
- プライベートサブネットのルートテーブルを編集
順番に見ていきましょう。
VPC内にプライベートサブネット(インターネットゲートウェイを持たない)、パブリックサブネットが一つずつある前提です。
1. lambdaをVPC内のプライベートサブネットに設置
lambda関数の作成時、デフォルトでは非VPCとなっています。
普段はこれで問題ないですが、今回は既存のVPC、プライベートサブネット、セキュリティグループを設定して下さい。
ちなみにパブリックサブネットに設置するとVPC内はいけますが、外に出られません。
公式より
2. lambdaのロールにvpc、eniに関する権限を追加
lambda関数作成時に指定したロールにVPCアクセス、eni作成、削除の権限が必要になります。
「IAM -> ロール」より当該ロールを選択し、AWSLambdaVPCAccessExecutionRole、AWSLambdaENIManagementAccessをアタッチしてください。
3. パブリックサブネットにNATゲートウェイを設置
「VPC -> NATゲートウェイ」よりNATゲートウェイを作成します。
サブネットにパブリックサブネットを指定する点に注意してください。
4. プライベートサブネットのルートテーブルを編集
最後の手順です。
「VPC -> ルートテーブル」よりプライベートサブネットに紐づくルートテーブルを選択し、ルートテーブルの編集より、以下のように送信先に0.0.0.0/0、ターゲットに3.で作成したNATゲートウェイを指定したルートを追加してください。
これにより、lambda関数から外に出る際に、パブリックサブネット内のNATゲートウェイを経由する形となります。
ちなみにサブネットを作成した直後は、サブネットのルートテーブルにVPCのものが紐づいているので、間違ってそちらを編集しないように気をつけてください。
おしまい
あとはlambda関数内で外部アクセスするコードを記述、検証してOKなら問題なしです。
なにか抜けや間違いなどありましたらご指摘いただけると幸いです。