VPC Lambdaをパブリックサブネットで構成してもパブリックIPが付与されずインターネットアクセスできない
こんにちは、岩城です。
結論
タイトルのとおりです。
VPC Lambdaをパブリックサブネットに構成したとしても、ENIにパブリックIPアドレスが付与されないので、インターネットアクセスできません。
これはドキュメントにもしっかり記載があります。
アウトバウンドネットワークを VPC 内のリソースに接続する
プライベートリソースにアクセスするには、関数をプライベートサブネットに接続します。関数にインターネットアクセスが必要な場合は、ネットワークアドレス変換 (NAT) を使用します。関数をパブリックサブネットに接続しても、インターネットアクセスやパブリック IP アドレスは提供されません。
遭遇した事象
VPC Lambdaは、RDSをはじめとするVPC内のリソースにLambdaからアクセスしたい場合に利用するものです。
本来であれば、本エントリのようなパブリックサブネットでVPC Lambdaを構成する必要はありません。
今回たまたまパブリックサブネットに構成してしまった環境で、以下のようにSNSのエンドポイントにアクセスできず、Lambdaのタイムアウト設定をいくら延ばしてもタイムアウトエラーとなる事象に遭遇しました。
タイムアウトになっていたので、すぐにネットワーク設定ミスを疑い以下を確認しましたが、いずれも問題なく、このときは何故タイムアウトするのか分かっていませんでした。
- ルートテーブル
- パブリックサブネットからIGWへ通信するルートが設定されていた
- NACL
- サブネットレベルで通信制限をしていなかった
- セキュリティグループ
- VPC Lambdaにアタッチされたセキュリティグループには、アウトバウンドルールが設定されていなかった
原因の特定
あてが外れたので改めて考え直しました。
普段と違うのはVPC Lambdaの利用なので、VPC Lambdaをパブリックサブネットに構成することへの影響を再確認することにしました。
そして冒頭のドキュメントにたどり着きます。
関数をパブリックサブネットに接続しても、インターネットアクセスやパブリック IP アドレスは提供されません。
VPC Lambdaをパブリックサブネットで構成してもパブリックIPが付与されない、、、これじゃん!と思ったので実際に設定を確認しました。
LambdaにアタッチされているENIの設定を確認すると、たしかにパブリックIPが付与されていないことを確認できました。
原因は分かりましたが、ではどうやってVPC LambdaからSNSのエンドポイントにアクセスさせられるのでしょうか。
対応方法
対応方法は以下の2つです。
- NATGWを利用してアクセスする
- VPC Endpointを利用してアクセスする
本エントリでは、VPC Lambdaをプライベートサブネットに構成した後、VPC Endpointを利用するように構成しなおしたところ、タイムアウトエラーは解消されました。
おわりに
ネットワーク設定的に問題なければ、VPC Lambdaから直接インターネットにアクセスできると思っていましたが、そんなことはありませんでした。
VPC Lambdaをパブリックサブネットに構成してもパブリックIPが付与されないため、インターネットにアクセスできません。
そもそも、VPC Lambdaのユースケース的にパブリックサブネットに構成する必要はないので、プライベートサブネットに構成してください。
プライベートサブネットに構成するなら、インターネットに直接アクセスできないため、NATGWやVPC Endpointが必要になるはず、といった感じで考えが巡ると思います。
そうすれば、本エントリのようにハマることはありません。
本エントリが、どなたかのお役に立てれば幸いです。