#amazon-web-services #go #amazon-s3
#amazon-web-services #Вперед #amazon-s3
Вопрос:
У меня есть приложение, использующее учетную запись aws A, которому необходимо проверить, существует ли корзина в учетной записи aws B. Если корзина не существует, я хочу, чтобы приложение завершилось сбоем при запуске.
У меня есть настройка "s3:ListBucket", "s3:GetObject", "s3:GetBucketLocation"
для корзины в учетной записи B на учетную запись 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>"
]
}
Комментарии:
1. Будет ли учетная запись B предоставлять вашей учетной записи AWS какие-либо права доступа к корзине? Или у корзины в учетной записи B будет политика корзины, которая делает ее доступной для других учетных записей? Как вы будете использовать эту корзину, если она действительно существует?
2. Политика корзины для учетной записи B @JohnRotenstein приведена ниже. Более того, я могу читать сообщения с использованием awscli из корзины учетной записи B с экспортированными учетными данными учетной записи A. ` { «Эффект»: «Разрешить», «Принципал»: { «AWS»: «arn: aws: iam::<accountA_no>: root»}, «Действие»: [ «s3:ListBucket», «s3: GetObject», «s3: GetBucketLocation»], «Ресурс»: [ «<AccountB_bucket_arn> /*», «<AccountB_bucket_arn>»] }`
3. @JohnRotenstein Кроме того, приложение выдаст сообщение об ошибке, когда обнаружит, что корзина не существует.
Ответ №1:
Я выяснил, что мы не можем перечислить корзины для разных учетных записей (S3Client.Список пакетов (ноль)). Он вернет только список корзин, принадлежащих аутентифицированному пользователю. См 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 я настроил политику ролей IAM для учетной записи A, как показано ниже, которая отсутствовала.
{
"Sid": "",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::account-B-Bucket/*",
"arn:aws:s3:::account-B-Bucket"
]
}
Ответ №2:
Похоже, что простое перечисление корзины может указывать, существует ли корзина или не существует:
$ 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
Я не специалист по Go, но из Python я получил эти результаты:
>>> len(list(boto3.resource('s3').Bucket('example-bucket').objects.all()))
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
>>> len(list(boto3.resource('s3').Bucket('example-bucketzz').objects.all()))
botocore.errorfactory.NoSuchBucket: An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist