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

时间:2019-05-30 14:53:48

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

我正在尝试使用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/" ] } ] }

1 个答案:

答案 0 :(得分:2)

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

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

如果您希望在属于不同AWS账户的存储桶之间进行复制,那么您将需要使用具有以下特征的一套凭据

    对源存储分区的
  • GetObject权限
  • 目标存储分区上的
  • PutObject权限

此外,请注意,CopyObject()命令已发送到目标帐户。目标存储桶有效地从源存储桶中拉出对象

根据您的描述,您的代码是假设来自另一个帐户的角色,以获取对源存储桶的读取权限。不幸的是,这对于CopyObject()命令是不够的,因为该命令必须发送到目标存储桶。 (是的,很难从文档中分辨出来。这就是为什么要专门命名源存储桶,而不是目标存储桶的原因。)

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

如果他们不希望这样做,那么您唯一的选择是使用假定的角色下载对象,然后使用来自您自己的{{1 }}。