Pourquoi l'erreur « Accès refusé » s'affiche lorsque j'exécute une requête dans Amazon Athena ?

Date de la dernière mise à jour : 2021-05-19

Lorsque j'exécute une requête Amazon Athena, je reçois une erreur « Accès refusé ».

Brève description

Vous obtenez généralement une erreur « Accès refusé » pour les raisons suivantes :

  • L'utilisateur AWS Identity and Access Management (IAM) ne dispose pas d'une ou de plusieurs des autorisations suivantes :
    • Lecture du compartiment de données source.
    • Écriture des résultats dans le compartiment de résultats de la requête.
  • Les stratégies de compartiment Amazon Simple Storage Service (Amazon S3) n'accorde pas les autorisations requises à l'utilisateur IAM.
  • Le propriétaire de l'objet est différent du propriétaire du compartiment Amazon S3.
  • Vous n'avez pas accès à la clé AWS Key Management Service (AWS KMS) utilisée pour lire ou écrire les données chiffrées.
  • La stratégie AWS Glue Data Catalog n'autorise pas l'accès à l'utilisateur IAM.

Résolution

Pour supprimer l'erreur « Accès refusé », vérifiez les éléments suivants :

Assurez-vous que l'utilisateur IAM dispose des autorisations requises pour accéder au compartiment de données source et au compartiment de résultats de requête.

Vous obtenez une erreur similaire à la suivante si vous n'avez pas accès au compartiment de données source :

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: 72VA5FB0ASWCQFPD; S3 Extended Request ID: cykX1CZ/KfxpL/h8/DOQoCBJ88qFGYqt6J52Jqh87qBfyN8c2P2azRiYjjJE1HL7i0Mg9xxxxxx=; Proxy: null), S3 Extended Request ID: cykX1CZ/KfxpL/h8/DOQoCBJ88qFGYqt6J52Jqh87qBfyN8c2P2azRiYjjJE1HL7i0Mg9xxxxxx= (Path: s3://my-athena-source-bucket/athena_data.csv)

Vous obtenez une erreur similaire à la suivante si vous n'avez pas accès au compartiment de résultats de la requête :

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'utilisateur IAM qui exécute les requêtes a besoin d'accéder au compartiment de données source et au compartiment de résultats de la requête. Vous pouvez accorder l'autorisation requise à l'utilisateur IAM en joignant une stratégie IAM à l'utilisateur/au rôle IAM. La stratégie IAM suivante accepte des autorisations minimales sur le compartiment de données source et le compartiment de résultats de requête :

{
    "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/*"
            ]
        }
    ]
}

Tâchez de remplacer ce qui suit dans cet exemple de stratégie :

  • my-athena-source-bucket par le nom de votre compartiment de données source
  • my-athena-source-bucket/data/ par l'emplacement des données source
  • my-athena-result-bucket par le nom de votre compartiment de résultats de requête

Pour obtenir la liste complète des stratégies, voir Stratégies gérées pour l'accès utilisateur.

Joindre la stratégie de compartiment Amazon S3 avec les autorisations requises pour les requêtes inter-comptes

Vous n'avez pas besoin de joindre des stratégies de compartiment S3 si votre table Athena et vos compartiments S3 sont dans le même compte. Toutefois, si vous avez des stratégies de compartiment S3, assurez-vous qu'elles accordent les actions S3 requises à l'utilisateur/au rôle IAM. Si votre table Athena et vos compartiments S3 se trouvent dans des comptes différents, vous devez joindre les stratégies de compartiment S3 qui accordent l'accès requis à l'utilisateur IAM.

Vous pouvez joindre une stratégie de compartiment S3 similaire à la suivante dans le compte B pour accorder l'accès à l'utilisateur IAM athena_user dans le compte A. Cet exemple de stratégie permet explicitement à l'utilisateur IAM d'accéder au compartiment S3 my-athena-source-bucket dans le compte 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/*"
            ]
        }
    ]
}

Assurez-vous de remplacer ce qui suit dans la stratégie ci-dessus :

  • my-athena-source-bucket par le nom de votre compartiment de données source
  • my-athena-source-bucket/data/ par l'emplacement des données source
  • 1111222233334444 par l'ID de compte pour le compte A
  • athena_user par le nom de l'utilisateur IAM dans le compte A

Pour accorder l'accès au compartiment à tous les utilisateurs du compte A, remplacez la clé Principal par une clé qui spécifie la racine (Exemple : arn:aws:iam።1111222233334444:root).

Remarque : la stratégie ci-dessus autorise toutes les actions S3 sur my-athena-source-bucket. Vous pouvez mettre à jour les actions S3 selon que le compartiment S3 est le compartiment source ou le compartiment de résultat de la requête. Pour plus d'informations, consultez la section Stratégie de compartiment ou stratégies utilisateur IAM dans Accès entre comptes dans Athena aux compartiments Amazon S3.

Vérifiez que la stratégie de compartiment S3 n'inclut pas d'instructions qui refusent explicitement l'accès au compte A ou à ses utilisateurs IAM. Assurez-vous également que votre stratégie n'inclut pas de conditions susceptibles de refuser les demandes. Pour plus d'informations, consultez Comment puis-je résoudre les erreurs 403 Access Denied (Accès refusé) à partir d'Amazon S3 ? Pour définir les autorisations avec le moindre privilège pour le compartiment S3, consultez How to define least-privileged permissions for actions called by AWS services.

Mettre à jour votre stratégie de clé AWS KMS

Si vos données source sont chiffrées ou si votre requête Athena écrit des résultats chiffrés à l'aide d'une clé AWS KMS, veillez sur les points suivants :

  • La stratégie de l'utilisateur IAM autorise les actions AWS KMS nécessaires.
  • La stratégie de la clé AWS KMS permet l'accès à l'utilisateur.

Voici un exemple de stratégie de clé KMS AWS qui autorise toutes les actions KMS à tous les utilisateurs de l'ID de compte 1111222233334444 :

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

Veillez à mettre à jour cette stratégie en fonction de votre cas d'utilisation. Pour plus d'informations, consultez Utilisation des stratégies clés dans AWS KMS et Autorisations sur les données chiffrées dans Amazon S3.

Assurez-vous que le propriétaire du compartiment S3 a accès aux objets

Par défaut, un objet S3 appartient au compte AWS qui l'a chargé. C'est le cas même si le compartiment est détenu par un autre compte. Si d'autres comptes peuvent charger des objets dans le compartiment, vérifiez alors à quel compte appartiennent les objets auxquels les utilisateurs ne peuvent pas accéder. Vous pouvez vérifier le propriétaire de l'objet en exécutant la commande GetObjectAcl.

Si le propriétaire du compartiment S3 et le propriétaire de l'objet sont différents, le propriétaire de l'objet peut vous accorder le contrôle total de l'objet. Le propriétaire de l'objet peut le faire en exécutant la commande PutObjectAcl avec le paramètre bucket-owner-full-control. Pour modifier la propriété de l'objet par le compte propriétaire du compartiment S3, exécutez la commande de l'interface de ligne de commande AWS (AWS CLI) cp à partir du compte du compartiment pour copier l'objet sur lui-même.

Remarque : en cas d'erreurs lors de l'exécution de commandes depuis AWS CLI, assurez-vous d'utiliser la version d'AWS CLI la plus récente.

Pour plus d'informations, consultez Pourquoi ne puis-je pas accéder à un objet qui a été téléchargé sur mon compartiment Amazon S3 par un autre compte AWS ?

Vérifiez que la stratégie AWS Glue Data Catalog autorise l'accès à l'utilisateur/au rôle IAM

Si vous disposez d'une stratégie AWS Glue Data Catalogexistante, assurez-vous qu'elle autorise l'accès à l'utilisateur/au rôle IAM. Par exemple, si vous disposez de la stratégie suivante dans votre catalogue de données, l'utilisateur IAM athena_user se voit refuser l'accès au catalogue de données :

{
    "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:*"
            ]
        }
    ]
}

Pour des exemples de stratégies, consultez les exemples de stratégie de contrôle d'accès basé sur les ressources AWS Glue.

Avec la stratégie ci-dessus dans le catalogue de données, les requêtes Athena exécutées par l'utilisateur peuvent échouer avec l'erreur suivante :

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

Assurez-vous également que l'utilisateur/le rôle IAM qui exécute les requêtes dispose des autorisations requises pour accéder aux ressources AWS Glue. Pour une la liste complète des autorisations AWS Glue requises, consultez la stratégie gérée AmazonAthenaFullAccess. Assurez-vous que les actions AWS Glue requises ne sont pas refusées par la stratégie de ressources du catalogue de données. Pour plus d'informations, consultez Accès précis aux bases de données et aux tables dans le catalogue de données AWS Glue.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?