Sat*_*ish 3 amazon-s3 amazon-web-services python-3.x 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)
Run Code Online (Sandbox Code Playgroud)
该行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/"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
运行上述脚本时出现以下错误。
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied
Joh*_*ein 11
该CopyObject()
命令可用于在存储桶之间复制对象,而无需上传/下载。基本上,两个 S3 存储桶相互通信并传输数据。
此命令还可用于在不同区域和不同 AWS 账户的存储桶之间进行复制。
如果您希望在属于不同 AWS 账户的存储桶之间进行复制,则您需要使用一组具有以下特征的凭证:
GetObject
对源存储桶的权限PutObject
对目标存储桶的权限另外,请注意该CopyObject()
命令会发送到目标帐户。目标存储桶有效地从源存储桶中提取对象。
根据您的描述,您的代码正在承担其他账户的角色以获取对源存储桶的读取权限。不幸的是,这对于CopyObject()
命令来说是不够的,因为命令必须发送到目标存储桶。(是的,从文档中很难看出这一点。这就是为什么要特别命名源存储桶而不是目标存储桶的原因。)
因此,在您的情况下,为了能够复制对象,您需要使用一组来自Account-B
(目标)的凭据,该凭据也有权从Bucket-A
(源)读取。这将要求供应商修改与关联的存储桶策略Bucket-A
。
如果他们不想这样做,那么您唯一的选择是使用代入角色下载对象,然后使用您自己的Account-B
.
归档时间: |
|
查看次数: |
6145 次 |
最近记录: |