はじめに
AWSにてCDK開発を行っていた際に、作成したリソースの連携が権限エラーで上手く動かないことがありました。調べてみるとリソースベースポリシーというものが関係しており、そこにたどり着くまでに、結構困らされました。
同じような方が増えないように、リソースベースポリシーについて解説してみようと思います。
リソースベースポリシーとは
ユーザーガイドによると・・・
Amazon S3 バケットなどのリソースにアタッチする JSON ポリシードキュメントです。これらのポリシーでは、そのリソースに対して特定のアクションを実行するために指定されたプリンシパルのアクセス許可を付与するとともに、このアクセス許可が適用される条件を定義します。リソースベースのポリシーはインラインポリシーです。マネージド型のリソースベースのポリシーはありません
つまり、一般的なロールやユーザーに付与するポリシーではなく、リソースに対して付与するポリシーになります。
そして、付与したリソースに対して誰(何)からアクセスを許可するかを定義するものです。
実際にみてみる
EventBridgeRuleからLambdaを呼び出す例を見てみます。
Lambdaを作成
EventBridgeを作成
先ほど作成したLambdaをターゲットとするEventBridgeRuleを作成します。
イベントを検知させる
正常に呼び出されることが確認できました。
EventBridgeにはLambdaを呼び出す権限がないのになぜ・・・?
Lambdaのリソースポリシーが設定されているから!
先ほど作成したLambdaを見てみるとリソースベースポリシーが自動で設定されていることが分かります。
リソースベースポリシーを削除してみる
エラーメッセージを見るためにRuleにデッドレターキューを設定して実行してみました。
権限エラーが起きていることが分かります。
つまり・・・
一部リソースでは、リソースベースポリシーが無いと正常に動かないものがあり、コンソール上の作業では自動的に適切なポリシーが付与されるものもあります。
そのため、あまり意識してこなかった部分でしたが、CDKでは明示的にこのリソースベースポリシーを作成しないといけないわけです!
リソースベースポリシーの設定があるかどうかは以下サイトから確認が可能です。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html
さいごに
適切な権限設定しているはずなのに(本当はできていない)動かないってときは、リソースベースポリシーが原因かも