S3 AWS 的 IAM 角色和密钥设置使用 boto3 访问两个不同的账户存储桶

Posted

技术标签:

【中文标题】S3 AWS 的 IAM 角色和密钥设置使用 boto3 访问两个不同的账户存储桶【英文标题】:IAM role and Keys setup for S3 AWS accessing two different account buckets using boto3 【发布时间】:2018-09-13 16:38:11 【问题描述】:

我有两个不同的帐户 1)帐户一是供应商帐户,他们给了我们访问ID和访问密钥。 2) 我们拥有完全访问权限的帐户。

我们需要使用 boto3 Python 3.7 脚本将文件从供应商 S3 存储桶复制到我们的 S3 存储桶。

boto3 中用于获得最佳性能的最佳功能是什么。

我尝试使用 get_object 和 put_object。这种情况的问题是我实际上正在读取文件正文并写入它。我们如何使用更快的复制模式从一个帐户复制到另一个帐户?

我可以从头到尾进行任何设置以直接复制吗?只要性能好,我们也可以使用 Lambda。我不能要求供应商进行任何更改,除非他们给我们访问密钥。

谢谢 汤姆

【问题讨论】:

【参考方案1】:

在 2 个存储桶之间复制数据的最快方法之一是使用 S3DistCp,仅当您要复制大量文件时才值得使用它,它会通过 EMR 集群以分布式方式复制它们。 带有 boto3 的 Lambda 函数将是一个选项,只有在复制时间少于 5 分钟的情况下,您可以考虑使用 ECS 任务(基本上是 Docker 容器)。

关于如何使用boto3复制的部分,您可以查看here。 看起来您可以执行以下操作:

import boto3

s3_client = boto3.client('s3')
s3_resource = boto3.resource('s3')

source_bucket_name = 'src_bucket_name'
destination_bucket_name = 'dst_bucket_name'

paginator = s3_client.get_paginator('list_objects')
response_iterator = paginator.paginate(
    Bucket=source_bucket_name,
    Prefix='your_prefix',
    PaginationConfig=
        'PageSize': 1000,
    
)
objs = response_iterator.build_full_result()['Contents']

keys_to_copy = [o['Key'] for o in objs] # or use a generator (o['Key'] for o in objs)

for key in keys_to_copy:
    print(key)
    copy_source = 
        'Bucket': source_bucket_name,
        'Key': key
    
    s3_resource.meta.client.copy(copy_source, destination_bucket_name, key)

建议的解决方案首先获取要复制的对象的名称,然后为每个对象调用复制命令。 为了使其更快而不是使用 for 循环,您可以使用 async。

如果您在 Lambda 或 ECS 任务中运行代码,请记住创建一个可以访问源存储桶和目标存储桶的 IAM 角色。

【讨论】:

您好,我如何提及目标存储桶名称。我的意思是在将其复制到该文件夹​​之前,我不必连接到目标存储桶名称。如前所述,我的源和目标是不同的帐户和不同的存储桶。目标存储桶我确实有访问密钥。我在 EC2 实例中运行这个 python 脚本 目标存储桶在代码destination_bucket_name = 'dst_bucket_name'中指定。如果您从 EC2 机器上运行代码,则无需指定任何 AWS 密钥,只需创建具有访问目标存储桶权限的实例配置文件角色(并将其附加到机器上)即可。还请您的供应商向您的 AWS 账户授予对源存储桶的读取权限,然后将此策略委托给您机器的实例配置文件。在这里查看docs.aws.amazon.com/AmazonS3/latest/dev/… 嗨,谢谢。我有我的存储桶的秘密访问密钥。我使用什么命令,我不想读入缓冲区(EC2)然后将其复制到我的 S3 存储桶中。如解释:s3_vendor_connection,s3_our_connection。然后读取 s3_vendor.get_object(),然后读取 s3_our.put_object()。我正在尝试将其直接放入桶中,而无需获取和放置。 get() 和 put() 好用吗?谢谢 不幸的是,我想到的使用 aws secretes 的唯一解决方案是您一开始建议的解决方案。从源存储桶下载 S3 对象,然后再次将对象上传到目标存储桶,效率非常低。是否有可能说服供应商将 S3 GetObject 策略附加到您的 AWS 账户?这将是迄今为止最好的解决方案。看看这个blog.vizuri.com/how-to-copy/… 几乎是你想做的,但他们使用 aws cli(用 boto3 编写) 所以根据我的理解,如果我们不使用 CLI,那么其他最好的解决方案是创建可以读取供应商存储桶并写入我们的 S3 存储桶的 IAM 角色?对吗?

以上是关于S3 AWS 的 IAM 角色和密钥设置使用 boto3 访问两个不同的账户存储桶的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用复制命令使用访问密钥和秘密密钥将数据从 S3 加载到红移表中吗(不使用 IAM 角色)

Spark + S3 + IAM 角色

[AWS][安全][S3] IAM 角色授权 EC2 访问 S3

如何使用 IAM 角色通过 aws sdk (java) 从 ECS 容器调用 s3 存储桶

如何将 S3 存储桶锁定到特定用户和 IAM 角色

AWS IAM 策略:按用户/角色限制存储桶/文件夹访问?