LambdaをVPCに設置しようとしてハマった
普段からちょくちょく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用のIAMロールに
- Lambda用のVPCが削除できない
- Lambdaを別のVPCに移動してから削除することで解決
どちらもドキュメント、公式QAに書いてあったので、トラブル時はまず公式を確認ですね!
参考になれば幸いです。
Discussion