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

使用boto3+assume_role跨AWS账户复制S3数据遇KMS权限问题求助

跨账户跨区域S3复制时KMS权限错误的解决方案

错误原因分析

你遇到的AccessDenied错误明确指向KMS密钥问题,说明在copy_object操作过程中,当前扮演的角色没有权限访问所需的客户主密钥(CMK),大概率属于以下两种场景之一:

  1. 源对象使用SSE-KMS加密:跨账户复制加密对象时,需要权限解密源对象的加密内容
  2. 目标存储桶启用SSE-KMS默认加密:写入目标桶时,需要权限生成数据密钥并加密新对象

排查与解决步骤

1. 确认加密场景

先明确是源还是目标端的KMS密钥导致问题:

  • 检查源对象加密:
    执行AWS CLI命令查看源对象的加密配置:
    aws s3api head-object --bucket <source-bucket-name> --key <source-object-key> --region <region1>
    
    查看输出中的ServerSideEncryption字段,如果值为aws:kms,则源对象使用SSE-KMS加密,同时记录SSEKMSKeyId对应的KMS密钥ARN。
  • 检查目标桶加密:
    登录账户2的S3控制台,查看目标桶的"默认加密"配置,确认是否启用了SSE-KMS,并记录对应的KMS密钥ARN。

2. 配置KMS密钥权限

根据上面的排查结果,修改对应账户的KMS密钥策略:

场景1:源对象使用账户1的KMS加密

在账户1的KMS控制台找到对应的密钥,编辑其权限策略,添加以下语句:

{
    "Sid": "AllowCrossAccountDecrypt",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<account1-id>:role/cross-account-file-share-role"
    },
    "Action": [
        "kms:Decrypt"
    ],
    "Resource": "*"
}

场景2:目标桶使用账户2的KMS加密

在账户2的KMS控制台找到对应的密钥,编辑其权限策略,添加以下语句:

{
    "Sid": "AllowCrossAccountEncrypt",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<account1-id>:role/cross-account-file-share-role"
    },
    "Action": [
        "kms:Encrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*"
}

3. 额外检查项

  • Lambda角色权限:确保账户1中my-lambda-role的权限策略包含sts:AssumeRole权限,目标为cross-account-file-share-role的ARN:
    {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::<account1-id>:role/cross-account-file-share-role"
    }
    
  • S3客户端区域匹配:代码中s3_client指定的region_name必须与目标桶所在区域(region2)一致,否则会出现KMS密钥区域不匹配的错误。
  • TLS版本合规:目标桶策略要求使用TLS1.2/1.3,boto3默认已满足,但确保Lambda运行环境的TLS配置符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:01:57