はじめに
AWS Lambdaを使用する際、「インターネットなどの外部と通信する」ためにどの様な設定が必要なのかをご存じでしょうか。
今回私は、Lambda関数からAmazon Location Serviceへインターネット経由でAPIコールしたい場面に遭遇し、そのネットワーク構成について調べてみました。
結果として、「プライベートサブネットにLambdaを配置し、パブリックサブネットのNAT Gateway経由でインターネットアクセスできる構成にしました。
しかし、「パブリックサブネットにLambdaを直接配置すれば、インターネットゲートウェイ(IGW)経由でアクセスできるのでは?」と疑問が残り、本記事に調べた結果をまとめました。
Lambdaのインターネットアクセスの基本
・ デフォルト設定
LambdaをVPC未指定(デフォルト設定)で作成すると、AWS管理のVPC上で実行されます。
この場合、特別な設定をすることなく、Amazon Location Serviceや外部APIとインターネット経由で通信可能です。
理由としては、AWSが管理しているネットワーク環境には、直接インターネットアクセスできるルーティングが設定されているからです。
・ 意図したVPCにアタッチ
Lambdaをユーザが作成したVPCのサブネットに配置すると、ネットワーク構成の影響を受けます。
ここで生まれる疑問としては、「パブリックサブネットにLambdaを配置すれば、インターネット通信が可能になるのでは?」という点です。
結論、パブリックサブネットにLambdaを配置しても、それだけではインターネット通信できません。
理由としては、Lambda関数のENI(Elastic Network Interface)にパブリックIPが割り当てられないためです。
インターネットゲートウェイ経由で通信するためには、リソースのENIにパブリックIPが必要ですが、LambdaはこのパブリックIPを持ちません。
したがって、パブリックサブネット + インターネットゲートウェイだけの構成では、Lambdaからインターネット通信ができません。

Lambdaからインターネット通信する方法
Lambda関数でインターネット通信が必要な場合の構成パターンは次の通りです。
● デフォルト設定(VPC未指定)
⇒AWS管理のVPCで自動的にインターネットアクセス
● VPC内に配置
⇒プライベートサブネットにLambdaを配置し、パブリックサブネットに配置したNAT Gateway経由でインターネットアクセス
・デフォルト設定でよいのでは?
ここで1つ疑問が発生します。
それは、「インターネット通信するためであればデフォルト設定でよいのでは?」という点です。
結論としては、インターネット通信だけを目的とするのであれば、デフォルト設定で十分です。
しかし、VPC内のサービス(RDSやEC2など)や、S3に対してVPCエンドポイントを利用する場合などにおいては、LambdaをVPCへアタッチする必要があります。
この場合において、プライベートサブネット + NAT Gatewayの構成にすることで、VPC内のアクセスとインターネット通信の両方を可能にします。
まとめ
今回は、Lambda関数におけるインターネット通信についてまとめてみました。
Lambdaをインターネットアクセス可能にするためにはデフォルト設定かプライベートサブネット + NAT Gatewayを使用する必要があるとわかりました。
本記事が、皆様の理解の助けになれば幸いです。
お読みいただきありがとうございました。
