我有一个使用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>"
]
}
答案 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()