我正在尝试使用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
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