我正在尝试使用boto3将供应商S3存储桶中的文件传输到我的S3存储桶中。我正在使用sts服务来承担访问供应商s3存储桶的角色。我能够连接到供应商存储桶并获得存储桶的清单。复制到存储桶时遇到server {
listen 80;
listen 443 ssl;
server_name api.local;
root /var/www/services;
ssl_certificate /etc/ssl/certs/optimax.crt;
ssl_certificate_key /etc/ssl/certs/optimax.key;
ssl_dhparam /etc/ssl/certs/optimax.pem;
location ~ /index\.php(/|$) {
fastcgi_pass php72:9001;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param REQUEST_URI $ms_request;
fastcgi_param SCRIPT_FILENAME $realpath_root/$ms_dir/public$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root/$ms_dir/public;
}
location ~ ^/(?<ms_dir>[^/]+)(?:/(.*))$ {
root /var/www/services/$ms_dir/public;
set $ms_request $2;
try_files $uri /index.php$is_args$args;
}
access_log /dev/stdout;
error_log /dev/stderr;
rewrite_log on;
}
错误。这是我的剧本
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)
行。我的AWS用户具有以下政策,允许将其复制到我的存储桶中
dest_s3.copy...
运行上述脚本时出现以下错误。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket/"
]
}
]
}
答案 0 :(得分:2)
CopyObject()
命令可用于在存储桶之间复制对象,而无需上载/下载。基本上,两个S3存储桶彼此通信并传输数据。
此命令还可用于在不同区域和不同AWS账户的存储桶之间进行复制。
如果您希望在属于不同AWS账户的存储桶之间进行复制,那么您将需要使用具有以下特征的一套凭据:
GetObject
权限PutObject
权限此外,请注意,CopyObject()
命令已发送到目标帐户。目标存储桶有效地从源存储桶中拉出对象。
根据您的描述,您的代码是假设来自另一个帐户的角色,以获取对源存储桶的读取权限。不幸的是,这对于CopyObject()
命令是不够的,因为该命令必须发送到目标存储桶。 (是的,很难从文档中分辨出来。这就是为什么要专门命名源存储桶,而不是目标存储桶的原因。)
因此,在您的情况下,要能够复制对象,您将需要使用来自Account-B
(目的地)的一组凭据,该凭据还具有读取权限Bucket-A
(来源)。这将要求供应商修改与Bucket-A
相关联的存储桶策略。
如果他们不希望这样做,那么您唯一的选择是使用假定的角色下载对象,然后使用来自您自己的{{1 }}。