AWS Lambdaから他システムにアクセスする際のIPを固定する

こんにちは。サーバサイドエンジニアの小林です。

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固定はやりたくないですねー。どうしても必要な場合に参考になりますと幸いです。