使用CDK跨账户配置S3事件通知时遇AccessDenied错误求助
跨账户S3事件通知配置排障方案
核心问题分析
你遇到的AccessDenied错误,本质是CDK部署角色没有权限修改B账户S3桶的通知配置——你之前把s3:PutBucketNotification权限给了Lambda角色,但CDK执行部署操作时,是用A账户的CDK执行角色(而非Lambda角色)去调用B账户S3的PutBucketNotification接口,这才是权限缺失的根源。
具体修复步骤
1. 调整B账户的S3桶策略
在B账户的目标桶策略中,添加允许A账户的CDK执行角色(或A账户根用户)操作桶通知的语句:
{ "Sid": "AllowCDKModifyBucketNotification", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[A账户ID]:role/[CDK执行角色名称]" // 或者直接用A账户根用户:"arn:aws:iam::[A账户ID]:root" }, "Action": [ "s3:PutBucketNotification", "s3:GetBucketNotification" ], "Resource": "arn:aws:s3:::[bucket_in_account_B]" }
注意:
s3:PutBucketNotification的资源只需桶本身,不需要/*路径。
2. 修正CDK代码中的错误
(1)修正Lambda权限的sourceAccount
lambdaPermission中的sourceAccount应该填B账户的ID(触发Lambda的S3桶所在账户),而非A账户ID:
const lambdaPermission = new CfnPermission(this, "S3InvokePermission", { action: "lambda:InvokeFunction", principal: "s3.amazonaws.com", sourceAccount: [B账户ID], // 这里改成B账户ID sourceArn: `arn:aws:s3:::${bucket_in_account_B}`, functionName: this.lambdaFunction.functionName });
(2)修复addEventNotification的语法错误
原代码中suffix: '.tsv'后面缺少闭合的}和),修正后:
source_bucket.addEventNotification( s3.EventType.OBJECT_CREATED, new s3n.LambdaDestination(this.lambdaFunction), { prefix: 'testfolder/', suffix: '.tsv' } // 补全闭合括号 );
3. 确认CDK执行角色权限
确保A账户的CDK执行角色(通常是cdk-hnb659fds-deploy-role-[A账户ID]-[区域])拥有调用s3:PutBucketNotification和s3:GetBucketNotification的权限,可以在A账户的IAM中给该角色添加对应权限策略。
额外说明
- Lambda角色的权限是用来让Lambda读取B账户S3桶的对象,和配置桶通知无关,你之前给Lambda角色的权限是正确的,无需调整。
- 跨账户S3触发Lambda的核心是两个权限:
- B账户S3桶允许调用A账户Lambda(即你配置的
CfnPermission) - A账户的CDK部署角色允许修改B账户S3桶的通知配置
- B账户S3桶允许调用A账户Lambda(即你配置的
内容的提问来源于stack exchange,提问作者Asim
相关产品推荐
相关产品推荐

