こんにちは。サーバサイドエンジニアの小林です。
AWS Lambdaから他システムにアクセスする必要がある場合に、相手側でIP制限をかけているのでアクセス元IPを固定しないといけない、という場合があります。今回はその方法についてまとめてみます。
2016年11月現在、Lambda自身にはIP固定機能はありません。そのため、NATやプロキシを挟んで対応する必要があります。今回は NATゲートウェイ を採用してみました。
NATゲートウェイを用いたアクセス元IP固定
完成図は以下になります。
- VPCを用意する
- NATゲートウェイを作成し、ElasticIPを割り当てる
- LambdaをVPCのサブネットに含める
- Lambdaが属するサブネットのルートテーブルでNATゲートウェイを向くようにする
また、可用性を考慮してMulti-AZ構成にしています。
VPCの用意
まず、NATゲートウェイとLambdaを配置するためのVPCを用意します。
図の通り、最低2つのAZに対して
- NATゲートウェイ用のサブネット (パブリックサブネット)
- Lambda用のサブネット (プライベートサブネット)
- パブリックサブネットからインターネットにアクセスするためのインターネットゲートウェイ
を用意します。詳しい手順はここでは省略します。
NATゲートウェイの作成
NATゲートウェイはVPCダッシュボードで管理します。
VPCダッシュボードからNATゲートウェイを選択し、NATゲートウェイの作成をクリック。
先程作成したパブリックサブネットを選択し、ElasticIPを割り当ててNATゲートウェイの作成をクリック。
作成したNATゲートウェイが一覧に表示されます。 もう片方のAZのサブネットの方にも同様にNATゲートウェイを作成しておきます。
ルートテーブルの作成
2種類のルートテーブルを用意します。
- NATゲートウェイ(の属するサブネット)からインターネットゲートウェイへのルーティング
- Lambda(の属するサブネット)からNATゲートウェイへのルーティング
前者はMulti-AZの場合でも共通のインターネットゲートウェイにルーティングするため、1つだけ作成します。ルートテーブルを作成し、ルートタブで先程作成したインターネットゲートウェイをターゲットとするように設定を追加します。
後者は、各プライベートサブネットから同じAZ内のNATゲートウェイにルーティングする必要があるため、AZごとに作成します。それぞれ作成し、ルートタブで各AZに配置したNATゲートウェイをターゲットとするように設定を追加します。
Lambdaをプライベートサブネットに含める
LambdaのConfigurationタブのAdvanced settingsで、先程作成した2つのプライベートサブネットを指定します。そのように設定すると、このLambdaは指定したサブネット内のいずれかで起動するようになります。
以上で設定は終了です。これでLambdaからのアクセス元IPを、NATゲートウェイに割り当てたElasticIPに固定することができました。注意として、今回Multi-AZ構成を取っておりNATゲートウェイが2つあるため、 正確にはIPは2個に絞られる状態 になります。
注意
上記のように構成することでアクセス元IPは固定できますが、デメリットもあります。
- Lambda本来のスケーラビリティが失われてしまう
- NATゲートウェイのスケーラビリティに依存する
- LambdaをVPCに含めることでコールドスタート時のレイテンシが劇的に悪化する
- 定期的に起こすなどの対策が必要
- NATゲートウェイ2台分の追加料金が発生する
- 約 90 USD/月
できることならIP固定はやりたくないですねー。どうしても必要な場合に参考になりますと幸いです。