python-3.x - 如何使用 boto3 在 2 个不同帐户的 S3 存储桶之间复制文件

标签 python-3.x amazon-web-services amazon-s3 boto3 aws-sts

我正在尝试使用 boto3 将供应商 S3 存储桶中的文件传输到我的 S3 存储桶。我正在使用 sts 服务来承担访问供应商 s3 存储桶的角色。我能够连接到供应商存储桶并获得存储桶的列表。我遇到了 CopyObject operation: Access Denied复制到我的存储桶时出错。这是我的脚本

session = boto3.session.Session(profile_name="s3_transfer")
sts_client = session.client("sts", verify=False)
assumed_role_object = sts_client.assume_role(
    RoleArn="arn:aws:iam::<accountid>:role/assumedrole",
    RoleSessionName="transfer_session",
    ExternalId="<ID>",
    DurationSeconds=18000,
)

creds = assumed_role_object["Credentials"]
src_s3 = boto3.client(
    "s3",
    aws_access_key_id=creds["AccessKeyId"],
    aws_secret_access_key=creds["SecretAccessKey"],
    aws_session_token=creds["SessionToken"],
    verify=False,
)
paginator =src_s3.get_paginator("list_objects_v2")
# testing with just 2 items.
# TODO: Remove MaxItems once script works.
pages = paginator.paginate(
    Bucket="ven_bucket", Prefix="client", PaginationConfig={"MaxItems": 2, "PageSize": 1000}
)
dest_s3 = session.client("s3", verify=False)
for page in pages:
    for obj in page["Contents"]:
        src_key = obj["Key"]
        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)

线路dest_s3.copy...是我得到错误的地方。我的 aws 用户有以下策略允许复制到我的存储桶
{
    "Version": "2012-10-17",
   "Statement": [
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket/*",
            "arn:aws:s3:::my-bucket/"
        ]
    }
    ]
}

运行上述脚本时出现以下错误。
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied

最佳答案

CopyObject()命令可用于在存储桶之间复制对象,而无需上传/下载。基本上,两个 S3 存储桶相互通信并传输数据。

此命令还可用于在不同区域和不同 AWS 账户的存储桶之间进行复制。

如果您想在 之间复制属于不同 AWS 账户的存储桶 ,那么您将需要使用 单套凭证具有:

  • GetObject源存储桶权限
  • PutObject对目标存储桶的权限

  • 另外,请注意 CopyObject()命令是 发送到目标账户 .目标桶有效 从源存储桶中拉取对象 .

    根据您的描述,您的代码是承担另一个帐户的角色 获得对源存储桶的读取权限。不幸的是,这对于 CopyObject() 来说还不够。命令,因为命令必须发送到目标存储桶。 (是的,从文档中很难看出这一点。这就是为什么要特别命名源存储桶而不是目标存储桶的原因。)

    因此,在您的情况下,为了能够复制对象,您需要 使用来自 Account-B 的一组凭据(目的地)也有权限从 Bucket-A 读取(来源)。这将要求供应商修改存储桶策略 Bucket-A 相关联.

    如果他们不想这样做,那么您唯一的选择就是 使用假定的角色下载对象 然后使用您自己的凭据将文件单独上传到您自己的存储桶 Account-B .

    关于python-3.x - 如何使用 boto3 在 2 个不同帐户的 S3 存储桶之间复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56380673/

    相关文章:

    amazon-web-services - ECS 服务 aws-cli 与仪表板

    java - 用于 SSE-C 特定加密的 aws 预签名 URL

    amazon-web-services - 什么使子网在 aws 中成为私有(private)子网

    php - 如何在 PHP 中获取 AWS EC2 实例 ID

    ruby-on-rails - 可以将 AWS Gem 与 Paperclip 结合使用用于 DigitalOcean Spaces 服务吗?

    hadoop - 如何从 Sqoop 导入中捕获已处理记录的计数?

    python - 检查元组中的两个元素是否具有相同的值

    python - 获取列表中所有可能的有序子列表

    python - 仅从数据框中返回位置值的最简单方法

    python-3.x - xpath:如何提取 "strong"标记内的文本?