LambdaをVPCに設置しようとしてハマった

2 min read読了の目安(約2500字

普段からちょくちょくLambdaを使っているのですが、とある案件の調査でLambdaをVPC内に設置し、DynamoDBとプライベートに通信するという要件がありました。
LambdaをVPC内に設置することができるのは知っていましたが、遠い昔にちょっとやっただけで、細かい部分を完全に忘れていてハマったので、解決法を紹介します。

結論

  • VPC内に設置するには、AWSLambdaVPCAccessExecutionRoleポリシーをLambda用IAMロールに付与する
  • Lambda用に作ったVPCを削除するには、別のVPCに移動してから削除する

ハマったこと1

まずLambdaをVPC内に設置するところで少しハマりました。
とりあえずこんなエラーが出ました。

The provided execution role does not have permissions to call CreateNetworkInterface on EC2

提供された実行ロールには、EC2 で CreateNetworkInterface を呼び出す権限がありません

こちらの解決法は、ドキュメントに書いてありました。

Lambda は、関数のアクセス許可を使用してネットワークインターフェイスを作成および管理します。VPC に接続するには、関数の実行ロールに次のアクセス許可が必要です。
実行ロールのアクセス許可
・ec2:CreateNetworkInterface
・ec2:DescribeNetworkInterfaces
・ec2:DeleteNetworkInterface
これらのアクセス許可は、AWS 管理ポリシー AWSLambdaVPCAccessExecutionRole に含まれています。

実際にLambda用のIAMロールにAWSLambdaVPCAccessExecutionRoleを付与してVPCに設置を試したらうまくいきました。

ハマったこと2

簡単な調査が終わったので、Lambda用に作成したVPCを削除しようと思い、まずはLambdaコンソールでVPC設定を解除しました。

その後、Lambda用に作成したVPCを削除しようとしたら、以下のエラーが出ました。

「あれ?じゃあENIを先に消さないといけないのか?」
と思ったので、ENIを消そうと思ったら以下のエラーが出ました。

強制デタッチもできません。
LambdaコンソールでVPC設定は解除したのになぜ??

答えは公式QAにありました。

異なるサブネットとセキュリティグループを使用します。または、Amazon VPC から機能を完全に切断することもできます。

Lambda ENI Finderというツール?でもできるようですが、自分の端末がWindowsで、 JSON プロセッサ jqというのを入れるのがちょっとめんどくさかったので、コンソールでできる方法を選択しました。

要するに、LambdaのVPCを別のVPCに移動してからLambda用のVPCを消しましょう!
ってことでした。
VPC設定を解除するではダメだったんですね。

別のVPCに移動してから削除

コンソールで実際にやってみました。
まずはLambdaのVPCをデフォルトに移動します。

VPCの移動完了後、VPCコンソールから削除をクリックすると、先ほどはエラーでしたが今回は削除できそうです。

無事削除できました!

まとめ

今回はLambdaをVPCに設置使用して以下の2点でハマりました。

  • VPCに設置時に権限不足
    • Lambda用のIAMロールにAWSLambdaVPCAccessExecutionRoleを付与することで解決
  • Lambda用のVPCが削除できない
    • Lambdaを別のVPCに移動してから削除することで解決

どちらもドキュメント、公式QAに書いてあったので、トラブル時はまず公式を確認ですね!
参考になれば幸いです。