Pourquoi est-ce que j'obtiens une erreur d'accès refusé pour ListObjectsV2 lorsque j'exécute la commande sync ?

Dernière mise à jour : 25/03/2021

J'exécute la commande aws s3 sync pour copier des objets vers ou à partir d'un compartiment Amazon Simple Storage Service (Amazon S3). Cependant, je reçois une erreur d'accès refusé lorsque j'appelle l'opération ListObjectsV2. Comment résoudre ce problème ?

Brève description

Lorsque vous exécutez la commande aws s3 sync, Amazon S3 émet les appels d'API suivants : ListObjectsV2, CopyObject, GetObject et PutObject.

Plus précisément, voici ce qui se produit :

1.    Amazon S3 répertorie la source et la destination pour vérifier si l'objet existe.

2.    Amazon S3 effectue ensuite les appels d'API suivants :

Appel CopyObject pour une opération de compartiment à compartiment

GetObject pour une opération de compartiment à emplacement local

PutObject pour une opération d'emplacement local à compartiment

Remarque : cet article suppose que les appels GetObject et PutObject sont déjà accordés à l'utilisateur ou au rôle AWS Identity Access Management (IAM). Cet article explique comment résoudre l'erreur d'accès refusé causée par des autorisations ListBuckets incorrectes.

Solution

Vérifiez que vous disposez de l'autorisation pour s3:ListBucket sur les compartiments Amazon S3 vers ou depuis lesquels vous copiez des objets. Vous devez disposer de ces autorisations pour effectuer des actions ListObjectsV2.

Remarque : s3:ListBucket est le nom de l'autorisation qui permet à un utilisateur de répertorier les objets d'un compartiment. ListObjectsV2 est le nom de l'appel d'API qui répertorie les objets d'un compartiment.

Si votre utilisateur ou votre rôle IAM appartiennent à un autre compte AWS, vérifiez si vos stratégies IAM et de compartiment autorisent l'action s3:ListBucket. Vous devez disposer de l'autorisation s3:ListBucket sur votre stratégie IAM et votre stratégie de compartiment.

Si votre utilisateur ou votre rôle appartient au compte du propriétaire du compartiment, vous n'avez pas besoin de ces deux stratégies à la fois pour autoriser s3:ListBucket. Une seule suffit.

Important : si la stratégie IAM ou celle de compartiment autorise les actions s3:ListBucket, vérifiez l'autre stratégie afin de vous assurer qu'elle ne comporte aucune instruction refusant explicitement l'action. Une instruction de refus explicite remplace une instruction d'autorisation.

Voici un exemple de stratégie IAM autorisant l'accès à s3:ListBucket :

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

Cet exemple de stratégie de compartiment autorise l'accès arn:aws:iam::123456789012:user/testuser à s3:ListBucket :

{
  "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"
      ]
    }
  }]
}