EventBridge ルールからクロスアカウントの Lambda を呼び出す際のプリンシパルについて
Lambda のリソースベースポリシーでは EventBridge ルールの IAM ロールを指定する必要がありました。
検証
[アップデート]Amazon EventBridgeで別のアカウントのリソースに直接イベントを配信できるようになりました! | DevelopersIO
上記ブログでは Lambda のリソースベースポリシーで EventBridge ルールの IAM ロールを指定することでクロスアカウントでの呼び出しを設定しています。
そこで、Lambda のリソースベースポリシーでプリンシパルを AWS サービスとして定義した場合に Lambda を呼び出せるのかが気になりました。
検証時の Lambda のリソースベースポリシーは以下の通りです。
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "test",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-northeast-1:<target-account-id>:function:test",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:events:ap-northeast-1:<source-account-id>:rule/test"
}
}
}
]
}
ソースアカウントの EventBridge ルールからの呼び出しとして定義しています。
なお、EventBridge ルールの IAM ロールには上記ブログと同様の権限が付与されているので、現状では以下の権限設定になっています。
- EventBridge ルールはクロスアカウントの Lambda を呼び出す権限を持っている
- Lambda はクロスアカウントの EventBridge ルールからの呼び出しを許可している
EventBridge ルールにデッドレターキューを設定して EventBridge ルールをテスト実行したところ、以下のエラーが記録されてました。
User: arn:aws:sts::<source-account-id>:assumed-role/Amazon_EventBridge_Invoke_Lambda_1777811161/ffa575a172ec314aa3a185d7e488b2d6 is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:ap-northeast-1:<target-account-id>:function:test because no resource-based policy allows the lambda:InvokeFunction action (Service: AWSLambdaInternal; Status Code: 403; Error Code: AccessDeniedException; Request ID: 57ec2f75-5e3b-434d-82fc-a05ef268e6fd; Proxy: null)
RULE_ARN
String
arn:aws:events:ap-northeast-1:<source-account-id>:rule/test
TARGET_ARN
String
arn:aws:lambda:ap-northeast-1:<target-account-id>:function:test
上記エラーの通り、Lambda 関数の呼び出しに使用されているプリンシパルは EventBridge ルールの IAM ロールでした。
プリンシパルが events.amazonaws.com ではないため呼び出しが拒否されています。
以上より、EventBridge ルールからクロスアカウントの Lambda を呼び出す際のプリンシパルに events.amazonaws.com を指定する方法では Lambda を呼び出せないことがわかりました。
まとめ
今回は EventBridge ルールからクロスアカウントの Lambda を呼び出す際のプリンシパルについて紹介しました。
どなたかの参考になれば幸いです。
Discussion