Perché ricevo messaggi di errore Accesso negato per ListObjectsV2 quando eseguo il comando sync nel mio bucket Amazon S3?

Ultimo aggiornamento: 01/11/2021

Sto eseguendo il comando aws s3 sync per copiare oggetti in o da un bucket Amazon Simple Storage Service (Amazon S3). Tuttavia ricevo un messaggio di errore Accesso negato quando chiamo l'operazione ListObjectsV2. Come posso risolvere questo problema?

Breve descrizione

Quando si esegue il comando aws s3 sync, Amazon S3 emette le seguenti chiamate API: ListObjectsV2, CopyObject, GetObject e PutObject.

Più specificamente, accade quanto segue:

1.    Amazon S3 elenca la fonte e la destinazione per controllare se l'oggetto esiste.

2.    Amazon S3 esegue quindi le seguenti chiamate API:

Chiamata CopyObject per un'operazione da bucket a bucket
GetObject per un'operazione da bucket a locale
PutObject per un'operazione da locale a bucket

Nota: questa risoluzione presuppone che le chiamate GetObject e PutObject siano già concesse all'utente o al ruolo AWS Identity Access Management (IAM). La risoluzione spiega come risolvere l'errore Accesso negato causato da autorizzazioni ListBucket improprie o dall'utilizzo di una sintassi errata del comando sync con pagamento a carico del richiedente.

Risoluzione

Configurazione della policy IAM

Verifica di disporre dell'autorizzazione per s3:ListBucket sui bucket Amazon S3 in cui o da cui stai copiando gli oggetti. È necessario disporre di questa autorizzazione per eseguire le operazioni ListObjectsV2.

Nota: s3:ListBucket è il nome dell'autorizzazione che permette a un utente di elencare gli oggetti in un bucket. ListObjectsV2 è il nome della chiamata API che elenca gli oggetti in un bucket.

Se il tuo utente o ruolo IAM appartiene a un altro account AWS, controlla se le policy IAM e del bucket permettono l'operazione s3:ListBucket. Devi disporre dell'autorizzazione per s3:ListBucket sia sulla policy IAM che sulla policy del bucket.

Se il tuo utente o ruolo appartiene all'account del proprietario del bucket, non sono necessarie entrambe le policy, IAM e del bucket, per permettere di eseguire s3:ListBucket. Ne basta una sola per permettere l'operazione.

Importante: se solo una tra la policy IAM o la policy del bucket permette già l'operazione s3:ListBucket, controlla l'altra policy per eventuali istruzioni che rifiutano esplicitamente l'operazione. Un'istruzione di rifiuto esplicito sostituisce un'istruzione di permesso.

Di seguito è riportato un esempio di policy IAM che concede l'accesso a s3:ListBucket:

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

Di seguito è riportato un esempio di policy del bucket che concede all'utente arn:aws:iam::123456789012:user/testuser l'accesso a 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"
      ]
    }
  }]
}

Utilizzo del comando sync con pagamento a carico del richiedente

Se il tuo bucket appartiene a un altro account AWS e hai abilitato il pagamento a carico del richiedente, verifica che sia la policy del bucket che le autorizzazioni IAM concedano le autorizzazioni ListObjectsV2. Se le autorizzazioni ListObjectsV2 sono concesse correttamente, controlla la sintassi del comando sync. Quando si utilizza il comando sync, è necessario includere l'opzione --request-payer requester. In caso contrario, viene visualizzato un messaggio di errore Accesso negato.

Ad esempio:

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