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

Date de la dernière mise à jour : 26/03/2021

J'exécute la commande aws s3 sync pour copier des objets vers ou depuis 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.

Ré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 cette autorisation pour effectuer les 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 politique IAM qui autorise 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"
      ]
    }
  }]
}