takeda_san’s blog

KotlinとVRを頑張っていく方向。

VPC内のリソースにアクセスするときのLambda関数の権限まわり

きっかけ

VPC上のRDSにアクセスするLambda関数を作るときに通常と違う権限設定が必要です。
ちょっとハマったのでメモ。

基本編

ほぼこのドキュメント読めばおしまいです。

Amazon VPC 内のリソースにアクセスできるように Lambda 関数を構成する - AWS Lambda

というと記事が終わってしまうので、ちょっと詳しく書きます。

Lambda関数自体に付与する権限

この3つ。

ec2:CreateNetworkInterface
ec2:DescribeNetworkInterfaces
ec2:DeleteNetworkInterface

わざわざ上を付けなくても、管理ポリシーとして AWSLambdaVPCAccessExecutionRole があるので、こちらのほうが便利。

Lambdaをデプロイする側に付与する権限

jenkinsとかCircleCIとかのCIでデプロイしている場合は、そのユーザに付与します。

ec2:DescribeSecurityGroups
ec2:DescribeSubnets
ec2:DescribeVpcs

こちらは管理ポリシーがないっぽいので、この3つをそれぞれ追加。

だが削除するときにエラーになる

ここまでの権限でデプロイはできます。
だが、関数名の変更や関数の削除をするときに困ったことが起きます。

CFnのログを眺めるとこんな記載が。

CloudFormation - DELETE_FAILED
API: ec2:DescribeNetworkInterfaces You are not authorized to perform this operation.

削除に失敗してますね…
しかも困ったことにデプロイ自体は成功している判定なので、CIは落ちません。

Update successful. One or more resources could not be deleted.

Lambda関数自体は見えなくなるのですが、存在自体はしている模様。

足りない権限

足りない権限とは…、ってログの通りですね。
API: ec2:DescribeNetworkInterfaces を追加しましょう。
あれ、Lambda関数に付与してあるな…

というのは、勘違いでデプロイする側のユーザ(jenkinsとかCircleCIとかの方)にも付与しなさいよということらしい。
権限を追加したところ無事、変更削除ができました。
めでたし、めでたし。