AccessDenied для ListObjects для корзины S3, когда разрешения s3:*


Я

произошла ошибка (AccessDenied) при вызове операции ListObjects: Access Denied

когда я пытаюсь получить папку из моего ведра S3.

С помощью этой команды

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

разрешения IAM для ведра выглядят так

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

что мне нужно изменить, чтобы иметь возможность copy и ls успешно?

5 51

5 ответов:

вы дали разрешение на выполнение команд над объектами внутри корзины S3, но вы не дали разрешения на выполнение каких-либо действий над самой корзиной. Измените свою политику следующим образом:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

Если вы хотите скопировать рекурсивно все объекты корзины s3 с помощью команды " aws s3 cp s3://bucket-name/ data / all-data/. -- рекурсивный" как вы упомянули, вот минимальная политика, необходимая для этого:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ]
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

первый оператор в этой политике позволяет перечислять объекты внутри корзины. Имейте в виду, что с помощью этого параметра вы также можете перечислять объекты в подкаталогах этого ведра. Кажется невозможным только дать разрешение ls на суб s3 каталоги, поэтому попытка применить это действие к ресурсу " arn:aws: s3::://bucket-name/data/all-data/" не будет работать должным образом (я протестировал и попробовал несколько способов сделать это, помощь здесь будет оценена).

второй оператор в этой политике позволяет получать объекты внутри корзины в определенном подкаталоге. Это означает, что все, что находится внутри пути "s3://bucket-name/data/all-data/", вы сможете скопировать. Имейте в виду, что это не позволяет копировать из родительские пути, такие как"s3://bucket-name/data/".

аналогичную проблему можно найти здесь, что привело меня к решению, которое я даю. https://github.com/aws/aws-cli/issues/2408

надеюсь, что это поможет!

вы должны указать ресурс для ведра через "arn:aws: 3::: bucketname" или "arn:aws: 3::: bucketname*". Последнее предпочтительнее, так как оно также позволяет манипулировать объектами ведра. Обратите внимание, что нет косой черты!

перечисление объектов-это операция над ведром. Таким образом, действия "С3:ListBucket" обязательна. Добавление объекта в корзину-это операция над объектом. Поэтому необходимо действие "s3: PutObject". Конечно, вы можете добавить другие действия, как вы требовать.

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname*"
        ]
    }
] 
}

Я не смог получить доступ к S3, потому что

  • сначала я настроил доступ к ключу на экземпляре (тогда было невозможно прикрепить роль после запуска)
  • забыл об этом на несколько месяцев
  • добавленные роль к примеру
  • попытался открыть. Настроенный ключ имел более высокий приоритет, чем роль, и доступ был запрещен, потому что пользователю не были предоставлены необходимые разрешения S3.

устранение: rm -rf .aws/credentials, потом aws использует роль.

Я получил ту же ошибку при использовании политики, как показано ниже, хотя у меня есть "s3:ListBucket" для операции s3:ListObjects.

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

затем я исправил это, добавив одну строку "arn: aws:s3::: bucketname"

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}