Perché la mia richiesta Amazon EMR fallisce con un HTTP 403 "Accesso negato" AmazonS3Exception?

6 minuti di lettura
0

Quando invio una richiesta a un cluster Amazon EMR, la richiesta ha esito negativo con un'eccezione HTTP 403 "Accesso negato" AmazonS3Exception.

Risoluzione

Se non si configurano correttamente le autorizzazioni, si potrebbe ottenere un errore di "Accesso negato" su Amazon EMR o Amazon Simple Storage Service (Amazon S3).

Esempio di messaggio di errore:

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 8B28722038047BAA; S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=), S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=

Controllo delle credenziali o del ruolo IAM specificato nel codice dell'applicazione

Nota: se si verificano errori durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), consulta Troubleshooting errors for the AWS CLI (Risoluzione degli errori per AWS CLI). Inoltre, assicurati di utilizzare la versione più recente dell'interfaccia della linea di comando AWS (AWS CLI).

Esegui il comando ls sul nodo primario del cluster Amazon EMR:

aws s3 ls s3://doc-example-bucket/abc/

Nota: sostituisci s3://doc-example-bucket/abc/ con il tuo percorso Amazon S3.

Se il comando precedente ha esito positivo, le credenziali o il ruolo AWS Identity and Access Management (IAM) stanno causando l'errore Accesso negato.

Per risolvere questo problema, completa i passaggi seguenti:

  1. Conferma che l'applicazione utilizza le credenziali previste o assume il ruolo IAM previsto.
  2. Per verificare che il ruolo disponga delle autorizzazioni per il percorso Amazon S3, utilizza l'interfaccia della linea di comando AWS (AWS CLI) per assumere il ruolo IAM. Effettua quindi una richiesta di esempio sul percorso S3.

Verifica della policy per il ruolo del profilo dell'istanza Amazon EC2

Se il profilo dell'istanza Amazon Elastic Compute Cloud (Amazon EC2) non dispone delle autorizzazioni in lettura e scrittura richieste per i bucket S3, potresti ricevere l'errore Accesso negato.

Nota: per impostazione predefinita, le applicazioni ereditano l'accesso ad Amazon S3 dal ruolo IAM del profilo dell'istanza Amazon EC2. Verifica che le policy IAM associate a questo ruolo consentano le operazioni S3 richieste sui bucket di origine e destinazione.

Per verificare se disponi dei permessi di lettura richiesti, esegui il comando ls:

aws s3 ls s3://doc-example-bucket/myfolder/

Esempio di output:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

-oppure-

Esegui il comando seguente:

hdfs dfs -ls s3://doc-example-bucket/myfolder

Esempio di output:

ls: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: RBT41F8SVAZ9F90B; S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=; Proxy: null), S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=

Assicurati che il ruolo del profilo dell'istanza disponga delle autorizzazioni in lettura e scrittura richieste per i bucket S3.

Esempio di policy IAM:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListObjectsInBucket",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ]
    },
    {
      "Sid": "AllObjectActions",
      "Effect": "Allow",
      "Action": "s3:*Object*",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket/*"
      ]
    }
  ]
}

Controllo del ruolo IAM per la mappatura dei ruoli EMRFS

Se utilizzi una configurazione di sicurezza per specificare i ruoli IAM per Amazon EMR File System (EMRFS), stai utilizzando la mappatura dei ruoli. L'applicazione eredita le autorizzazioni S3 dal ruolo IAM sulla base della configurazione della mappatura dei ruoli.

La policy IAM associata ai ruoli deve disporre delle autorizzazioni S3 richieste per i bucket di origine e di destinazione. Per specificare i ruoli IAM per le richieste EMRFS ad Amazon S3, consulta Impostazione di una configurazione di sicurezza con ruoli IAM per EMRFS.

Controllo della policy per gli endpoint VPC di Amazon S3

Se la tabella di routing della sottorete del cluster EMR ha un percorso a un endpoint cloud privato virtuale (VPC) di Amazon S3, verifica che la policy degli endpoint consenta le operazioni Amazon S3 richieste.

Utilizzo dell'interfaccia della linea di comando AWS (AWS CLI)

Esegui il commento dell'interfaccia della linea di comando AWS (AWS CLI) describe-vpc-endpoints per verificare la policy degli endpoint:

aws ec2 describe-vpc-endpoints --vpc-endpoint-ids "vpce-########"

Nota: sostituisci vpce-xxxxxxxx con l'ID VPC.

Esegui il comando modify-vpc-endpoint per modificare la policy degli endpoint:

aws ec2 modify-vpc-endpoint --vpc-endpoint-id "vpce-########" --policy-document file://policy.json

Nota: sostituisci --vpc-endpoint-id e il percorso del file JSON.

Utilizzo della console Amazon VPC

Completa i seguenti passaggi:

  1. Apri la console Amazon VPC.
  2. Nel pannello di navigazione, seleziona Endpoint.
  3. Seleziona l'endpoint Amazon S3, quello che si trova nella tabella di routing della sottorete del cluster EMR.
  4. Scegli la scheda Policy.
  5. Scegli Modifica policy.

Controllo delle policy dei bucket S3 di origine e di destinazione

Le policy dei bucket specificano le azioni consentite o rifiutate per i principali. Le policy dei bucket di origine e destinazione devono consentire al ruolo del profilo dell'istanza o al ruolo IAM mappato di eseguire le operazioni Amazon S3 richieste.

Per modificare le policy dei bucket, utilizza l'interfaccia della linea di comando AWS (AWS CLI) o la console Amazon S3.

Utilizzo dell'interfaccia della linea di comando AWS (AWS CLI)

Esegui il comando get-bucket-policy per ottenere la policy del bucket:

aws s3api get-bucket-policy --bucket doc-example-bucket

Nota: sostituisci doc-example-policy con il nome dei bucket di origine o di destinazione.

Modifica la policy, quindi salvala in un file JSON.

Quindi, esegui il comando put-bucket-policy per aggiungere la policy modificata al bucket:

aws s3api put-bucket-policy --bucket doc-example-bucket --policy file://policy.json

Nota: sostituisci il nome del bucket e il percorso del file JSON.

Utilizzo della console Amazon S3

Per istruzioni, consulta Aggiungere una policy di bucket utilizzando la console Amazon S3.

Importante: se l'applicazione accede a un bucket S3 che appartiene a un altro account AWS, il proprietario dell'account deve consentire il tuo ruolo IAM nella policy del bucket.

Ad esempio, la seguente policy del bucket fornisce a tutti i ruoli e utenti IAM nell'account emr il pieno accesso a s3://doc-example-bucket/myfolder/:

{
  "Id": "MyCustomPolicy",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowRootAndHomeListingOfCompanyBucket",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "myfolder/"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "myfolder/*"
          ]
        }
      }
    },
    {
      "Sid": "AllowAllS3ActionsInUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
       "arn:aws:s3:::doc-example-bucket/myfolder/*",
        "arn:aws:s3:::doc-example-bucket/myfolder*"
      ]
    }
  ]
}

Informazioni correlate

Perché il mio lavoro Spark o Hive su Amazon EMR fallisce con un HTTP 503 "Slow Down" AmazonS3Exception?

Perché la mia applicazione Amazon EMR fallisce con un’eccezione HTTP 404 "Not Found" AmazonS3Exception?

Error responses

In che modo è possibile risolvere gli errori 403 di accesso negato da Amazon S3?

AWS UFFICIALE
AWS UFFICIALEAggiornata 5 mesi fa