初めに
以下のような構成でLamdaをパブリックサブネットに配置すれば外部と通信できるんだろうと思ったら、結果はタイムアウト。。
調べてみると、Lambdaのネットワーク構造に特有の制約があることがわかりました。
この記事ではその原因と対処法をまとめます

※そもそもLambdaをVPCの中に入れてパブリックサブネットで使う意味あるのかは?ありますが、聞かないでください。。
問題は?
まず、LambdaをVPC内に置いた場合の挙動
LambdaをVPC内に配置すると、AWSはElastic Network Interface (ENI) を作成してサブネットにアタッチします。
このENIにはプライベートIPのみが割り当てられ、パブリックIPは付与されません
↑の内容を踏まえて問題の原因は?
- インターネットゲートウエイ(IGW)はパブリックIPを持つリソースが外部通信するための仕組み
- LambdaのENIはプライベートIPしかもたないため、IGWを通じて直接外部通信できない
その結果、パブリックサブネットに置いても「外に出られない」状態になります
なぜLambdaはパブリックIPを持たない設計なのか?
調べましたが、公式から明記されているものはなかったので、
自分で少し理由を考えてみました。
大きな理由はやはりセキュリティ上の理由なのかなと思いました。
各Lambdaに直接パブリックIPを割り当てられるような状態にすると外部からアクセスが可能になり、セキュリティリスクがあがります。
そのため、割り当てられないのではないかと思います
対象法は?
外部通信が必要な場合の解決策は以下の2つです
-
VPCに置かない
デフォルトではLambdaはAWS管理のVPCで動作し、直接インターネットにアクセス可能です -
プライベートサブネット+NAT Gateway
Lambdaをプライベートサブネットに配置し、NAT Gateway経由で外部通信させます
まとめ
- Lambdaはパブリックサブネットに置いてもパブリックIPは付与されない
- IGWを通じた直接通信は不可
- 外部通信が必要なら「VPC外で動かす」か「プライベートサブネット+NAT Gateway」を利用する
参考URL
https://note.com/minato_kame/n/na9fce7812e91
https://dev.classmethod.jp/articles/20230829-vpc-lambda/
https://repost.aws/ja/knowledge-center/internet-access-lambda-function