正確には「VPC内に配置したLabmda関数がインターネットと通信する場合」の話しです。
Lambda関数をVPC内に配置するときはこうしろっていうのは検索すればすぐ出てくるのですが、理由が書かれてない記事が多いので取り上げてみました。
背景
Security Hubを導入したところ準拠すべきセキュリティルールの中に「Lambda関数はVPC内に配置せよ」とあったので、適当なVPCの適当なパブリックサブネットに配置した。
事象
EC2を自動起動停止させるLambda関数が「Task timed out after XX.XX seconds」で動かなくなった。
対応1 (解決せず)
タイムアウトを伸ばしてみた。→解決せず
元々タイムアウト3秒で正常に動いていたが、エラーメッセージがタイムアウトなので30秒まで伸ばしてみたが、それでもタイムアウトする。
原因
今回言いたかったのはこれ。
実はLambda関数はパブリックサブネットに配置してもパブリックIPが払い出されないらしい。
AWSのドキュメントに下記の記述があった。
VPC 内のリソースにアクセスするように Lambda 関数を設定する
プライベートリソースにアクセスするには、関数をプライベートサブネットに接続します。関数にインターネットアクセスが必要な場合は、ネットワークアドレス変換 (NAT) を使用します。関数をパブリックサブネットに接続しても、インターネットアクセスやパブリック IP アドレスは提供されません。
このLambda関数はEC2を起動停止させるAPIを叩くために、VPC外 (AWSのAPIエンドポイント) へのアクセスが必要なのでこれに該当する。
対応2 (解決)
すでにNATゲートウェイを持つプライベートサブネットがあったのでそこに配置し直したら解決した。
NATゲートウェイを持つプライベートサブネットを新規に作成する場合の手順もAWSのナレッジにあるので、必要な場合はこちらをご参照ください。
Amazon VPC に接続されている Lambda 関数にインターネットアクセスを許可するにはどうすればよいですか?
補足
最初にLabmda関数を配置したパブリックサブネットはデフォルトでパブリックIPを割り当てる設定 (「パブリック IPv4 アドレスを自動割り当て」が有効) になっていましたが、それでもLambda関数にはパブリックIPは割り当てられませんでした。
「Lambda関数をVPC内に配置せよ」と言われたとき、仕様を知らないと調べもせずに「この関数はインターネット通信あるからパブリックに」とやってしまうことがあると思いますが、このような落とし穴があるのでご注意ください。