如何验证跨账户AWS S3存储桶是否存在?

时间:2020-08-13 22:33:12

标签: amazon-web-services go amazon-s3

我有一个使用AWS帐户A的应用程序,该应用程序需要检查AWS帐户B中的存储桶是否存在。如果存储桶不存在,那么我希望应用程序在一开始就失败。

我为帐户B中的存储桶设置了"s3:ListBucket", "s3:GetObject", "s3:GetBucketLocation"至帐户A。我正在使用下面的方法来获取所有存储桶,然后遍历该列表以匹配帐户B的存储桶名称。我知道这只会给帐户A拥有的存储桶的列表。

s3Client = s3.New(session)
list, err := s3Client.ListBuckets(nil)

找出此处是否存在帐户B中的存储桶的最佳方法是什么?

这是帐户B中存储区的存储区策略:

{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<accountA_no>:root"
    },
    "Action": [
        "s3:ListBucket",
        "s3:GetObject",
        "s3:GetBucketLocation"
    ],
    "Resource": [
        "<AccountB_bucket_arn>/*",
        "<AccountB_bucket_arn>"
    ]
}

2 个答案:

答案 0 :(得分:0)

仅列出一个存储桶似乎可以指示一个存储桶是否存在:

"{ResponseCode":"ok"}

我不是Go语言的人,但是从Python我得到了以下结果:

$ aws s3 ls s3://example-bucket

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

$ aws s3 ls s3://example-bucketzz

An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation: The specified bucket does not exist

答案 1 :(得分:0)

我发现我们无法列出跨帐户存储桶(s3Client.ListBuckets(nil))。它只会返回经过身份验证的用户拥有的存储桶列表。请参阅https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-cross-account-access/

我更新了代码以使用ListObjectsV2 https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#S3.ListObjectsV2。 在使用ListObjectsV2函数之前,我在帐户A上设置了IAM角色策略,如下所示。

def show_popup(conten):
    # make sure the content has no parent
    if conten.parent is not None:
        conten.parent.remove_widget(conten)
    show = conten
    popupWindow = Popup(title="Popup Window", content=show)
    clButt.bind(on_press=popupWindow.dismiss)
    popupWindow.open()