当前位置: 首页 > 知识库问答 >
问题:

如何使用boto3在两个不同帐户的S3存储桶之间复制文件

滑骞尧
2023-03-14

我正在尝试使用boto3将文件从一个S3存储桶传输到我的S3存储桶。我使用sts服务来承担访问供应商s3 bucket的角色。我能够连接到供应商bucket并获得bucket的列表。复制到我的存储桶时,我遇到CopyObject操作:拒绝访问错误。这是我的剧本

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:调用CopyObject操作时发生错误(AccessDended):Access Dended


共有1个答案

丁振海
2023-03-14

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

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

如果希望在属于不同AWS帐户的存储桶之间进行复制,则需要使用一组凭据,这些凭据具有:

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

另外,请注意,CopyObject()命令被发送到目标帐户。目标bucket有效地从源bucket中提取对象。

根据您的描述,您的html" target="_blank">代码将从另一个帐户获得对源存储桶的读取权限。不幸的是,这对于CopyObject()命令是不够的,因为该命令必须发送到目标存储桶。(是的,从文档中很难看出这一点。这就是为什么专门命名源bucket而不是目标bucket的原因。)

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

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

 类似资料:
  • 我有2个AWS帐户。我试图复制文件从帐户1到帐户2在桶2在美国西部2地区。我有所有必要的IAM政策,相同的凭据适用于两个帐户。我使用python boto3库。 如图所示,复制函数在指向目标帐户2/us-west-2的客户端对象上执行。它是如何获取帐户1/us-east1中的源文件的?我应该提供作为复制函数的输入吗?

  • 有没有一种方法可以将文件列表从一个S3存储桶复制到另一个存储桶?两个S3存储桶都在同一个AWS帐户中。我可以使用aws cli命令一次复制一个文件: 然而,我有1000份文件要复制。我不想复制源存储桶中的所有文件,因此无法使用sync命令。有没有一种方法可以用需要复制的文件名列表来调用一个文件,从而自动化这个过程?

  • 问题内容: 是否可以使用boto3将一个源存储桶中的所有文件复制到另一目标存储桶中。而且源存储桶没有常规的文件夹结构。 我需要使用boto3将SRC存储桶上方的所有文件和文件夹从文件夹C复制到N文件夹下的TGT存储桶。 任何人都可以知道任何API还是我们需要编写新的python脚本来完成此任务。 问题答案: S3存储对象,它不存储文件夹,即使’/’或’'是对象键名的一部分。您只需要操纵键名并复制数

  • 使用Boto3,python脚本从S3桶中下载文件以读取它们,并将下载文件的内容写入名为的文件。 我的问题是,一旦脚本使用AWS Lambda函数,它将如何以相同的方式工作?

  • 问题内容: 我这样做是读取了S3存储桶中的文件名 现在,我需要获取文件的实际内容,类似于。什么是最好的方法? 问题答案: boto3提供了一种资源模型,该资源模型使诸如迭代对象之类的任务变得更加容易。不幸的是,StreamingBody不提供或。

  • 我正在尝试使用Node将文件从AWS S3存储桶复制到另一个存储桶。问题是,如果文件名没有空格,例如:“abc.csv”,它就可以正常工作。但如果我要复制到的文件名中有空格,例如:“abc xyz.csv”。它抛出了下面的错误。 “指定的密钥不存在。”“NoSuchKey:指定的密钥不存在。应请求。extractError(d:\Projects\Other\testproject\s3filet