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

使用boto3跨AWS账户复制S3文件遇CopyObject权限拒绝问题

解决STS扮演角色下S3 CopyObject的Access Denied问题

咱们一步步来拆解这个问题:你已经成功通过STS角色拿到了供应商S3桶的访问权限,能列出文件说明角色的列表权限是没问题的,但复制操作失败,大概率是权限链上的某个环节缺了必要的权限,或者CopyObject的执行逻辑有细节没注意到。

最可能的原因:供应商侧IAM角色缺少s3:GetObject权限

能列出桶内文件只需要s3:ListBucket权限,但复制操作需要读取源对象,这就要求扮演的角色必须有s3:GetObject权限。你需要确认供应商给你的IAM角色(arn:aws:iam::<accountid>:role/assumedrole)的权限策略里,是否包含了对源桶对象的读取权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": "arn:aws:s3:::ven_bucket"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::ven_bucket/*"
    }
  ]
}

如果只有ListBucket没有GetObject,那复制时必然会报Access Denied——因为你连源文件都读不了,更别说复制了。

快速验证方法:测试源对象读取权限

在你的循环里加一段小测试,用src_s3客户端直接读取源对象,确认权限是否正常:

for page in pages:
    for obj in page["Contents"]:
        src_key = obj["Key"]
        # 新增测试代码
        try:
            test_response = src_s3.get_object(Bucket="ven_bucket", Key=src_key)
            print(f"成功读取源对象 {src_key},大小:{test_response['ContentLength']}")
        except Exception as e:
            print(f"读取源对象失败:{str(e)}")
        # 原复制逻辑
        des_key = dest_prefix + src_key[len(src_prefix) :]
        src = {"Bucket": "ven_bucket", "Key": src_key}
        print(src)
        print(des_key)
        dest_s3.copy(src, "my-bucket", des_key, SourceClient=src_s3)

如果这里读取失败,那问题肯定出在供应商角色的权限上,直接联系供应商补充s3:GetObject权限即可。

其他可能的排查点

  1. 源对象加密场景:如果供应商的S3对象用了SSE-KMS加密,那你的STS角色还需要额外的KMS权限(kms:Decrypt),针对对应的KMS密钥。这时候需要供应商给角色添加KMS相关的权限策略。
  2. 目标桶的桶策略限制:虽然你的用户权限已经允许s3:*操作自己的桶,但如果目标桶(my-bucket)有桶策略拒绝了PutObject操作,也会导致失败。不过这种情况概率较低,你可以检查下目标桶的桶策略是否有拒绝规则。
  3. 凭证有效性:虽然你刚获取了STS凭证,但可以打印creds的内容,确认SessionToken、AccessKeyId等参数都正确,且没有过期(你设置的DurationSeconds=18000是5小时,测试2个文件应该不会过期)。

补充说明CopyObject的执行逻辑

当你使用dest_s3.copy(..., SourceClient=src_s3)时,这个操作是由你的目标客户端(用自己的用户凭证)发起,AWS会自动使用SourceClient的凭证去访问源桶读取对象,再写入目标桶。所以整个流程需要两个权限:

  • 源侧:STS角色有s3:GetObject(以及加密场景下的KMS权限)
  • 目标侧:你的用户有s3:PutObject(你的策略已经满足)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:55:17