Salta al contenuto

Come posso risolvere gli errori di autorizzazione "Access Denied" che ricevo quando eseguo una query in Athena?

7 minuti di lettura
0

Desidero eseguire una query su Amazon Athena, ma ricevo un errore "Access Denied".

Breve descrizione

Gli errori "Access Denied" delle query sono in genere correlati a problemi di autorizzazione di altri servizi AWS o account AWS con cui Athena interagisce. Ecco alcuni esempi di servizi con cui Athena interagisce comunemente: AWS Identity and Access Management (AWS IAM), Amazon Simple Storage Service (Amazon S3) e Servizio AWS di gestione delle chiavi (AWS KMS).

Un errore "Access Denied" può essere causato dai seguenti motivi:

  • La policy del Catalogo dati AWS Glue non consente l'accesso all'utente IAM o al ruolo IAM.
  • L'entità IAM non ha le autorizzazioni per leggere il bucket di dati di origine S3 o scrivere i risultati nel bucket dei risultati delle query.
  • Le policy di bucket S3 non consentono le autorizzazioni richieste all'entità IAM quando la tabella e i bucket Athena sono in account diversi.
  • Il proprietario dell'oggetto è diverso dal proprietario del bucket S3.
  • Non hai accesso alla chiave AWS KMS utilizzata per leggere o scrivere i dati crittografati.

Per risolvere l'errore "Access Denied", verifica di aver impostato le autorizzazioni corrette per il caso d'uso. Per ulteriori informazioni sugli errori relativi alle autorizzazioni, consulta Autorizzazioni.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Verifica che la policy del Catalogo dati Glue consenta l'accesso all'entità IAM

Ricevi il seguente messaggio di errore:

"Insufficient permissions to execute the query. User: arn:aws:iam:: 1111222233334444:user/athena_user is not authorized to perform: glue:GetTable on resource: arn:aws:glue:us-east-1:1111222233334444:database/doc_example_database with an explicit deny Query Id: example_query_ID".

L'errore precedente si verifica quando la policy del Catalogo dati nega l'accesso a Catalogo dati. Il seguente esempio di policy include un Deny esplicito che nega ad athena_user l'accesso al Catalogo AWS Glue:

{  "Version": "2012-10-17",  "Statement": [  
    {  
      "Principal": {  
        "AWS": [  
          "arn:aws:iam::1111222233334444:user/athena_user"  
        ]  
      },  
      "Effect": "Deny",  
      "Action": [  
        "glue:*"  
      ],  
      "Resource": [  
        "arn:aws:glue:us-east-1:1111222233334444:*"  
      ]  
    }  
  ]  
}

Per risolvere il problema, modifica il Deny esplicito in Allow. Per visualizzare esempi di policy che includono un Allow esplicito, consulta Esempi di autorizzazioni a livello di database e tabella. Per modificare la policy del Catalogo dati AWS Glue, consulta Impostazioni del Catalogo dati.

Per un elenco completo delle autorizzazioni richieste per AWS Glue, consulta Policy gestita da AWS: AmazonAthenaFullAccess.

Verifica che l'entità IAM abbia le autorizzazioni necessarie per accedere ai bucket

Se ricevi il seguente messaggio di errore, non hai accesso al bucket di dati di origine:

"Your query has the following errors:com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID:###; S3 Extended Request ID:###=; Proxy: null), S3 Extended Request ID:###= (Path: s3://my-athena-source-bucket/athena_data.csv)".

Se ricevi il seguente messaggio di errore, non hai accesso al bucket dei risultati delle query:

"Your query has the following errors: Access denied when writing output to url: s3://my-athena-result-bucket/Unsaved/2021/05/07/example_query_ID.csv . Please ensure you are allowed to access the S3 bucket. If you are encrypting query results with KMS key, please ensure you are allowed to access your KMS key".

L'entità IAM che esegue le query deve avere accesso a entrambi i bucket. Per concedere le autorizzazioni richieste, collega la seguente policy IAM all'entità IAM:

{  "Version": "2012-10-17",  "Statement": [  
    {  
      "Effect": "Allow",  
      "Action": [  
        "s3:ListBucket"  
      ],  
      "Resource": [  
        "arn:aws:s3:::my-athena-source-bucket"  
      ]  
    },  
    {  
      "Effect": "Allow",  
      "Action": [  
        "s3:GetObject"  
      ],  
      "Resource": [  
        "arn:aws:s3:::my-athena-source-bucket/data/*"  
      ]  
    },  
    {  
      "Effect": "Allow",  
      "Action": [  
        "s3:GetBucketLocation",  
        "s3:GetObject",  
        "s3:ListBucket",  
        "s3:ListBucketMultipartUploads",  
        "s3:AbortMultipartUpload",  
        "s3:PutObject",  
        "s3:ListMultipartUploadParts"  
      ],  
      "Resource": [  
        "arn:aws:s3:::my-athena-result-bucket",  
        "arn:aws:s3:::my-athena-result-bucket/*"  
      ]  
    }  
  ]  
}

Nota: sostituisci my-athena-source-bucket con il nome del tuo bucket di dati di origine e my-athena-source-bucket/data/ con la posizione dei dati di origine. Sostituisci my-athena-result-bucket con il nome del bucket dei risultati delle tue query.

Per l'elenco completo delle policy, consulta Policy gestite da AWS per Amazon Athena.

Aggiungi una policy di bucket S3 con le autorizzazioni necessarie per le query multi-account

Se la tabella Athena e il bucket S3 si trovano nello stesso account, non serve aggiungere una policy basata sulle risorse al bucket S3. Tuttavia, se hai già aggiunto una policy di bucket, verifica che conceda le autorizzazioni per S3 all'entità IAM che esegue query sui dati.

Se la tabella Athena e il bucket S3 si trovano in account diversi, aggiungi una policy basata sulle risorse al bucket S3 che conceda l'accesso all'entità IAM.

Nel seguente esempio, l'utente Athena è nell'Account A e il bucket S3 è nell'Account B.

Il seguente esempio di policy basata sulle risorse consente esplicitamente ad athena_user nell'Account A di accedere al bucket S3 my-athena-source-bucket nell'Account B:

{  "Version": "2012-10-17",  "Id": "Policy1620692934647",  
  "Statement": [  
    {  
      "Sid": "Stmt1620692932186",  
      "Effect": "Allow",  
      "Principal": {  
        "AWS": "arn:aws:iam::1111222233334444:user/athena_user"  
      },  
      "Action": [  
        "s3:*"  
      ],  
      "Resource": [  
        "arn:aws:s3:::my-athena-source-bucket",  
        "arn:aws:s3:::my-athena-source-bucket/data/*"  
      ]  
    }  
  ]  
}

Nota: sostituisci my-athena-source-bucket con il nome del tuo bucket di dati di origine e my-athena-source-bucket/data/ con la posizione dei dati di origine. Sostituisci 1111222233334444 con l'ID dell'account utente IAM nell'Account A e athena_user con il nome dell'utente IAM nell'Account A.

Per concedere l'accesso al bucket a tutti gli utenti dell'Account A, sostituisci la chiave Principal con una chiave che specifichi root ("arn:aws:iam::1111222233334444:root").

Nota: la policy di bucket S3 precedente consente tutte le azioni in S3 a my-athena-source-bucket. Aggiorna le azioni in S3 a seconda che il bucket S3 sia il bucket di dati di origine o il bucket dei risultati delle query. Per ulteriori informazioni, consulta Accesso multi-account agli oggetti del bucket.

Verifica che la policy di bucket S3 non includa istruzioni che negano esplicitamente l'accesso all'Account A o ai suoi utenti IAM. Inoltre, assicurati che la policy non includa condizioni che potrebbero negare le richieste. Per ulteriori informazioni, consulta Come posso risolvere gli errori 403 di Accesso negato da Amazon S3?

Aggiorna la policy della chiave AWS KMS

Se hai crittografato i dati di origine o la query Athena utilizza una chiave AWS KMS per scrivere risultati crittografati, intraprendi le seguenti azioni:

  • Verifica che la policy dell'utente IAM consenta le azioni su AWS KMS necessarie.
  • Verifica che la policy della chiave AWS KMS consenta l'accesso all'utente.

Il seguente esempio di policy della chiave AWS KMS autorizza l'account 1111222233334444 a utilizzare le policy IAM per consentire tutte le azioni sulla chiave KMS:

{  "Sid": "Enable IAM policies",    
  "Effect": "Allow",  
  "Principal": {  
    "AWS": "arn:aws:iam::1111222233334444:root"  
   },  
  "Action": "kms:*",  
  "Resource": "*"  
}

Nota: nella policy precedente, sostituisci 1111222233334444 con l'ID del tuo account.

Per ulteriori informazioni, consulta Policy della chiave AWS KMS e Consente l'accesso all'account AWS e alle policy IAM abilitate.

Assicurati che il proprietario del bucket S3 abbia accesso agli oggetti

Per impostazione predefinita, l'account che carica un oggetto S3 in un bucket è il proprietario dell'oggetto. Questo vale anche quando il bucket è di proprietà di un altro account. Se utenti in altri account possono caricare oggetti nel bucket, determina l'account proprietario degli oggetti a cui gli utenti non possono accedere. Esegui il comando GetObjectAcl per verificare il proprietario dell'oggetto.

Se il proprietario del bucket S3 e il proprietario dell'oggetto sono diversi, il proprietario dell'oggetto può concederti il pieno controllo dell'oggetto. Il proprietario dell'oggetto deve eseguire il comando PutObjectAcl con il parametro bucket-owner-full-control.

Per trasferire la proprietà dell'oggetto all'account che possiede il bucket S3, esegui il comando AWS CLI cp. Assicurati di eseguire il comando cp dall'account del bucket per copiare l'oggetto su se stesso.

Per ulteriori informazioni, consulta Perché non riesco ad accedere a un oggetto che è stato caricato nel mio bucket Amazon S3 da un altro account AWS?

Informazioni correlate

Gestione dell'identità e dell'accesso in Athena

AWS UFFICIALEAggiornata un anno fa