如何使用Boto3和用户名访问他人的AWS S3存储桶?

3

我正在尝试使用Python/Boto3下载AWS S3内容。

第三方正在上传数据,我需要下载它。他们提供了以下凭证:

  • 用户名: MYUser
  • aws_access_key_id: SOMEKEY
  • aws_secret_access_key: SOMEOTHERKEY

使用流行的Windows 10应用程序CyberDuck,我的“用户名”被添加到应用程序的路径设置中,third-party/MYUser/myfolder

这里没有给我任何东西是“我的存储桶”。

my_bucket = s3.Bucket('third-party/MYUser')
ParamValidationError: Parameter validation failed:
Invalid bucket name 'third-party/MYUser': Bucket name must match the regex "^[a-zA-Z0-9.\-_]{1,255}$"

my_bucket = s3.Bucket('third-party')
ClientError: An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied

my_bucket = s3.Bucket('MYStuff')
NoSuchBucket: An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist

根据我所了解的,third-party 是 AWS S3 存储桶的名称,但我找不到如何访问别人存储桶下子目录的解释。
我发现 Bucket() 有一些 用户 参数。我在其他地方读到了关于 角色访问控制列表 的内容。但是我没有找到一个简单的例子。 如何通过用户名访问 AWS S3 上别人的存储桶?
1个回答

3

亚马逊S3实际上没有目录。相反,对象的 Key (文件名) 包含该对象的 完整路径

例如,考虑这个对象:

s3://my-bucket/invoices/foo.txt
  • 桶的名称为my-bucket
  • 对象的键值为invoices/foo.txt

所以,您可以使用以下方式访问对象:

import boto3

s3_resource = boto3.resource('s3')
object = s3.Object('my-bucket','invoices/foo.txt')

为了使S3与期望拥有文件夹和目录的系统和人类保持兼容,它维护了一个CommonPrefixes列表,实际上等同于目录。它们是从斜杠(/)之间的名称中派生而来的。因此,CyberDuck可以让用户浏览目录。
然而,第三方可能只授予您访问自己目录的权限,而不是根目录。在这种情况下,您需要直接导航到您的目录,而无需按层级进行点击。
使用替代凭据的好方法是将其作为单独的配置文件存储:
aws configure --profile third-party

然后,系统会提示您输入凭证。

接下来,您可以像这样使用凭证:

aws s3 ls s3://third-party/MyUser --profile third-party
aws s3 cp s3://third-party/MyUser/folder/foo.txt .

在最后添加--profile可以选择使用哪个凭证。
boto3的等效语句是:
session = boto3.Session(profile_name='third-party')
s3_resource = session.resource('s3')
object = s3.Object('THEIR-bucket','MYinvoices/foo.txt')

请参阅:凭据 —— Boto 3文档


那么“我的桶”始终是“账户所有者的桶”。哈哈!:P - xtian
这是存储桶的名称,无论谁拥有它。Amazon S3 存储桶名称在全球范围内是唯一的。 - John Rotenstein
所有的次要来源都引用了“我的存储桶”,而你有密钥。你开始思考,如果我的密钥不起作用,那么一定不是“我的存储桶”。现在我明白了S3存储桶有用户。你必须深入挖掘我的用例(而我仍然处于“我的存储桶”所有者指南之外)。 - xtian
1
为了增加你的困惑:用户不拥有资源。用户被分配权限来执行其AWS账户中的操作。所有资源都归账户所有。只需将my-bucket视为由特定账户拥有的a-bucket即可。 - John Rotenstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接