要約
① NATゲートウェイを設置したパブリックサブネットを用意する
② NATゲートウェイにルーティングさせるルートテーブルを設定したプライベートサブネットを用意する
③ Lmabdaに②で作成したプライベートサブネットを指定する
図解
Lambdaは、デフォルトの設定ではAWSが自動で設定したVPCに設置され、自由にインターネットへのアクセスができます。
ただし、なんらかの事情で(例えばVPC内のリソースにLambdaからアクセスしたい時など)自分のVPCにLambdaを設置したい場合は、
図のようにNATゲートウェイを経由してインターネットにアクセスする必要があります。
なぜNATを経由する必要があるのか
例えば、以下のようにパブリックサブネットに直接Lambdaを設置してインターネットにアクセスできないのか?と私は一度考えました。
しかし、Lambdaをパブリックサブネットで構成しても、作成時に割り当てられるENI(Elastic Network Interface)にはパブリックIPは付与されません。プライベートIPのみが付与されます。
したがって、VPC外のインターネットにLambdaからのアウトバウンドトラフィックが届くはずもありません。
NATゲートウェイにルーティングするようルートテーブルを設定すると、Lambda→インターネットへの通信はまずNATに流れます。
パブリックIPをもつNATが代わりにインターネットゲートウェイへアクセスし、リクエストのレスポンス等のアウトバウンドトラフィックがあった場合は、LambdaがもつプライベートIPへ適切に返してくれます。
おまけ
Lambdaには複数のサブネットを指定することができます。本記事の参考にしたAWSの公式ガイドにも、NATへルーティングされるプライベートサブネットを全てLambdaに指定するよう書いてあります。
VPC に接続された Lambda 関数にインターネットアクセスを有効にする
しかしこれには注意が必要です。下図の様にLambdaからVPC内のAWSリソース(例えばRDS)へアクセスしたい場合、サブネットやネットワークALC、セキュリティグループの設定を適切に行う必要があります。
Lambda関数が複数のサブネットにアタッチされている場合、AWSはどのサブネットを使用するかを自動的に決定します。そのため、特定のサブネットからしかアクセスできないリソースにアクセスする必要がある場合、そのリソースへの接続が保証されない可能性があります。
複数のサブネットを設定することで高可用性を期待できる等のメリットもありますが、そのサブネットでリソースへの接続ができるかどうかはきちんと確認したほうがいいでしょう。