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とかの方)にも付与しなさいよということらしい。
権限を追加したところ無事、変更削除ができました。
めでたし、めでたし。