AWS-CDK配置S3桶SNS通知遇PutBucketNotificationConfiguration权限拒绝
问题排查与解决方案
错误根源
执行PutBucketNotificationConfiguration操作的是CDK自动创建的BucketNotificationsHandler Lambda自定义资源,而非S3服务本身。你之前给s3.amazonaws.com添加资源策略的方向错误,这不是触发操作的主体。
从提供的IAM报告可以看到,该Lambda角色虽已配置s3:PutBucketNotification权限,但存在两个可能的问题:
- 权限的资源范围(
*)可能被S3桶的其他策略限制 - S3桶的资源策略未明确允许该Lambda角色执行
PutBucketNotificationConfiguration操作
解决方法
方法1:给Lambda角色添加明确的桶权限(推荐)
直接为CDK生成的BucketNotificationsHandler角色添加针对目标桶的精准权限:
from aws_cdk import aws_iam as iam # 替换为你的Lambda角色ARN(从IAM报告中获取) NOTIFICATION_HANDLER_ROLE_ARN = "arn:aws:iam::{你的账户ID}:role/Dsp-StoreServiceStack-dev-BucketNotificationsHandler050a0587b7544547bf325f094a3db834-Role" # 获取角色对象 notification_handler_role = iam.Role.from_role_arn( self, "NotificationHandlerRole", role_arn=NOTIFICATION_HANDLER_ROLE_ARN, ) # 添加针对目标桶的PutBucketNotification权限 notification_handler_role.add_to_policy( iam.PolicyStatement( actions=["s3:PutBucketNotificationConfiguration"], resources=[self.bucket.bucket_arn], effect=iam.Effect.ALLOW ) )
方法2:修正S3桶的资源策略
将之前的资源策略主体替换为Lambda角色的ARN,允许其操作目标桶:
self.bucket.add_to_resource_policy( iam.PolicyStatement( actions=["s3:PutBucketNotificationConfiguration"], principals=[iam.ArnPrincipal(NOTIFICATION_HANDLER_ROLE_ARN)], resources=[self.bucket.bucket_arn], ) )
方法3:排查额外限制
- 检查S3桶的资源策略是否存在Deny语句,阻止了该Lambda角色的访问
- 确认Lambda角色未被IAM权限边界限制
s3:PutBucketNotificationConfiguration操作 - 尝试升级AWS CDK到最新版本,部分旧版本存在自动角色权限配置不全的问题
验证步骤
- 执行
cdk synth查看生成的IAM策略,确认权限已正确关联到目标角色和桶 - 用
cdk diff对比部署前后的资源变化,确保权限修改已生效 - 重新部署堆栈,观察是否仍出现AccessDenied错误
内容的提问来源于stack exchange,提问作者curiousguy
相关产品推荐
相关产品推荐

