Por que estou recebendo um erro de acesso negado para ListObjectsV2 ao executar o comando de sincronização em meu bucket do Amazon S3?

Última atualização: 01/11/2021

Estou executando o comando aws s3 sync para copiar objetos de ou para um bucket do Amazon Simple Storage Service (Amazon S3). No entanto, estou recebendo um erro de acesso negado quando chamo a operação ListObjectsV2. Como resolvo isso?

Breve descrição

Quando você executa o comando aws s3 sync, o Amazon S3 emite as seguintes chamadas de API: ListObjectsV2, CopyObject, GetObject e PutObject.

Mais especificamente, acontece o seguinte:

1.    O Amazon S3 lista a origem e o destino para verificar se o objeto existe.

2.    Em seguida, o Amazon S3 executa as seguintes chamadas de API:

Chamada CopyObject para uma operação de bucket para bucket
GetObject para uma operação de bucket para local
PutObject para uma operação de local para bucket

Observação: esta resolução pressupõe que as chamadas GetObject e PutObject já foram concedidas ao usuário ou à função do AWS Identity Access Management (IAM). Essa resolução aborda como resolver o erro de acesso negado causado por permissões incorretas do ListBucket ou usando a sintaxe de comando sync incorreta com pagamentos a cargo do solicitante.

Resolução

Configurar a política do IAM

Verifique se você tem a permissão para s3:ListBucket nos buckets do Amazon S3 dos quais ou para os quais você está copiando objetos. É necessário ter essa permissão para executar ações ListObjectsV2.

Observação: s3:ListBucket é o nome da permissão que permite que um usuário liste os objetos em um bucket. ListObjectsV2 é o nome da chamada de API que lista os objetos em um bucket.

Se o usuário ou a função do IAM pertencer a outra conta da AWS, verifique se as políticas do IAM e do bucket permitem a ação s3:ListBucket. Você deve ter permissão para s3:ListBucket na política do IAM e na política do bucket.

Se o usuário ou a função pertencer à conta do proprietário do bucket, você não precisará das políticas do IAM e do bucket para permitir s3:ListBucket. Apenas uma delas será necessária para permitir a ação.

Importante: se a política do IAM ou a política do bucket já permitir a ação s3:ListBucket, verifique se há instruções que negam explicitamente essa ação na outra política. Uma instrução de negação explícita substitui uma instrução de permissão.

Veja a seguir um exemplo de política do IAM que concede acesso a s3:ListBucket:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "Stmt1546506260896",
    "Action": "s3:ListBucket",
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET"
  }]
}

Veja a seguir um exemplo de política de bucket que concede acesso a s3:ListBucket para o usuário arn:aws:iam::123456789012:user/testuser:

{
  "Id": "Policy1546414473940",
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "Stmt1546414471931",
    "Action": "s3:ListBucket",
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET",
    "Principal": {
      "AWS": [
        "arn:aws:iam::123456789012:user/testuser"
      ]
    }
  }]
}

Usando o comando sync com pagamento a cargo do solicitante

Se o bucket pertencer a outra conta da AWS e tiver o Requester Pays (Pagamento a cargo do solicitante) habilitado, verifique se a política de bucket e as permissões do IAM concedem permissões ListObjectsV2. Se as permissões ListObjectsV2 forem concedidas corretamente, verifique a sintaxe do comando sync. Ao usar o comando sync, é necessário incluir a opção --request-payer requester. Senão, você receberá um erro Access Denied (Acesso negado).

Por exemplo:

aws s3 sync ./ s3://requester-pays-bucket/ --request-payer requester