Как проверить, существует ли корзина AWS S3 для разных учетных записей или нет?

#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