Acces refuzat la sincronizarea între bucket-uri s3 pe conturi AWS diferite (Administrarea sistemului, Permisiuni, Amazon S3, Sincronizare, Aws Cli)

OrigamiEye a intrebat.

Încerc să configurez sincronizarea între două bucket-uri de pe conturi AWS diferite.

Am primit cp să funcționeze cu:

@ubuntu:~$ s3cmd cp -v s3://src/dir/ s3://dest/folder --recursive

Eu sunt utilizatorul care deține /src/dir și am adăugat:

{
"Version": "2012-10-17",
"Id": "Policy1477299702471",
"Statement": [
    {
        "Sid": "Stmt1477299696163",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::awsid:user/name"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::bucket/*"
    }
]}

La politica de permisiuni pentru bucket pe bucket-ul de test.

Acum sunt după aws sync să funcționeze, deoarece folosind s3 cp nu este recomandată pentru utilizarea cu cron.

Am încercat

[email protected]:~$ aws s3 sync --dryrun s3://src/ s3://dest/ --region eu-central-1

dar primesc acces refuzat:

eroare fatală: A apărut o eroare (AccessDenied) la apelarea operațiunii ListObjects: Acces refuzat

Cum pot obține acces refuzat dacă acesta este utilizatorul care deține bucket-ul și să pornesc sincronizarea?

1 răspunsuri
John Rotenstein

Cauza problemei dvs. ListObjects eroare este că ați atribuit permisiunea de a accesa conținutului al găleții dvs. (arn:aws:s3:::bucket/*), dar nu ați acordat permisiuni pentru găleata în sine (arn:aws:s3:::bucket). Adresa ListObjects necesită acces la bucket.

Pentru a testa acest lucru, am făcut următoarele:

  • Am folosit două conturi AWS: Contul A, Contul B
  • Creat bucket-a în contul A
  • Creat bucket-b în contul B
  • Creat un utilizator IAM user-a în contul A cu permisiuni de acces bucket-a
  • A adăugat o Politică Bucket la bucket-b:

    {
      "Id": "CopyBuckets",
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1",
          "Action": "s3:*",
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::bucket-b",
            "arn:aws:s3:::bucket-b/*"
          ],
          "Principal": {
            "AWS": [
              "arn:aws:iam::<account-a-id>:user/user-a"
            ]
          }
        }
      ]
    }
    

Apoi am declanșat sincronizarea folosind user-a în contul A:

aws s3 sync s3://bucket-a s3://bucket-b --profile user-a

A funcționat cu succes.

Comentarii

  • Bună ziua, regiunile în care se află bucket-ul nu sunt relevante? –  > Por OrigamiEye.
  • Numele bucket-urilor Amazon S3 sunt unice la nivel global, astfel încât ARN-urile (Amazon Resource Names) pentru bucket-urile S3 nu au nevoie de cont, nici de regiune (deoarece acestea pot fi derivate din numele bucket-ului). Cu toate acestea, atunci când se apelează aws s3 sync comandă, regiunea este importantă, deoarece ar trebui să trimiteți cererea către bucket-ul care este face copia (bucket sursă). –  > Por John Rotenstein.
  • Aveți grijă la permisiunile lipsă pentru elementele care sunt sincronizate. Atunci când efectuați o sincronizare, trebuie, de asemenea, să utilizați opțiunea –grants pentru a specifica faptul că numele canonic al contului B primește permisiune, altfel obiectele care sunt sincronizate vor fi accesibile doar proprietarului inițial din contul A. –  > Por CarlR.
  • Dacă doriți să aveți proprietarul corect pe obiectele copiate în găleata de destinație, trebuie să executați comanda de sincronizare din contul de destinație, nu din contul sursă. Așadar, logica de aici ar fi inversată. –  > Por Josh Bernfeld.
  • Sau utilizați --acl bucket-owner-full-control –  > Por John Rotenstein.