You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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桶的通知配置

内容的提问来源于stack exchange,提问作者Asim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 15:15:17