【问题标题】:How to access someone else's AWS S3 'bucket' with Boto3 and Username?如何使用 Boto3 和用户名访问其他人的 AWS S3“存储桶”?
【发布时间】:2020-03-12 15:51:05
【问题描述】:

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

第三方正在上传数据,我需要下载。 他们提供了这样的凭据:

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

使用流行的 Windows 10 应用 Cyber​​Duck,我的“用户名”被添加到应用的路径设置中,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() 有一些 user 参数。我在其他地方读到过角色访问控制列表。但我没有找到一个简单的例子。

我如何在给定用户名的情况下访问其他人在 AWS S3 上的存储桶?

【问题讨论】:

    标签: python amazon-web-services amazon-s3 boto3


    【解决方案1】:

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

    例如,考虑这个对象:

    s3://my-bucket/invoices/foo.txt
    
    • 桶是my-bucket
    • 对象的Key是invoices/foo.txt

    因此,您可以通过以下方式访问该对象:

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

    为了使 S3 与希望拥有文件夹和目录的系统和人类保持兼容,它维护了一个 CommonPrefixes 列表,实际上与目录相同。它们源自斜线之间的名称 (/)。因此,Cyber​​Duck 可以让用户能够浏览目录。

    但是,第三方可能只为您分配了足够的权限来访问您自己的目录,而不是根目录。在这种情况下,您需要直接导航到您的目录,而无需单击层次结构。

    使用备用凭据集的一个好方法是将它们存储为单独的配置文件:

    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')
    

    见:Credentials — Boto 3 Documentation

    【讨论】:

    • 那么“我的存储桶”始终是“帐户所有者的存储桶”。哈哈! :P
    • 它是存储桶的名称,无论谁拥有它。 Amazon S3 存储桶名称是全球唯一的。
    • 所有二级来源都引用了我的存储桶,并且您有密钥。你开始想,如果我的钥匙不工作,一定不能是'我的桶'。现在我了解 S3 存储桶有 users。你必须深入了解我的use case(我还在外面,因为这是'my-bucket'所有者指南)。
    • 增加你的困惑:用户不拥有资源。用户被分配了对其 AWS 账户执行操作的权限。所有资源均归该帐户所有。只需将my-bucket 视为属于特定帐户的a-bucket
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多