使用boto3+assume_role跨AWS账户复制S3数据遇KMS权限问题求助
跨账户跨区域S3复制时KMS权限错误的解决方案
错误原因分析
你遇到的AccessDenied错误明确指向KMS密钥问题,说明在copy_object操作过程中,当前扮演的角色没有权限访问所需的客户主密钥(CMK),大概率属于以下两种场景之一:
- 源对象使用SSE-KMS加密:跨账户复制加密对象时,需要权限解密源对象的加密内容
- 目标存储桶启用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
相关产品推荐
相关产品推荐

