Pourquoi mon application Amazon EMR échoue-t-elle et renvoie une exception AmazonS3Exception HTTP 403 « Access Denied (Accès refusé)» ?

Date de la dernière mise à jour : 03/05/2022

Lorsque j'envoie une application à un cluster Amazon EMR, elle échoue avec une exception AmazonS3Exception HTTP 403 « Access Denied (Accès refusé) » :

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=

Solution

Si les autorisations ne sont pas correctement configurées, vous pouvez recevoir une erreur « Access Denied (Accès refusé) » sur Amazon EMR ou Amazon Simple Storage Service (Amazon S3).

Tout d'abord, vérifiez les informations d'identification ou le rôle spécifiés dans votre code d'application

Exécutez la commande suivante sur le nœud principal du cluster EMR. Remplacez s3://doc-example-bucket/abc/ par votre chemin Amazon S3.

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

Si cette commande aboutit, les informations d'identification ou le rôle spécifiés dans votre code d'application sont à l'origine de l'erreur « Access Denied (Accès refusé) ». Vérifiez que votre application utilise les informations d'identification attendues, ou assume le rôle attendu, et qu'elle a accès au chemin Amazon S3. Vérifiez que le rôle dispose d'autorisations sur le chemin Amazon S3 en assumant le rôle AWS Identity and Access Management (IAM) à l'aide de l'AWS CLI. Ensuite, effectuez un exemple de demande vers le chemin S3.

Si cette commande échoue, vérifiez que vous utilisez la version la plus récente de l'AWS Command Line Interface (AWS CLI). Vérifiez ensuite les éléments suivants pour résoudre l'erreur « Access Denied » (Accès refusé) :

    Vérifier la politique du rôle de profil d'instance Amazon EC2

    Si le profil d'instance Amazon Elastic Compute Cloud (Amazon EC2) ne dispose pas des autorisations de lecture et d'écriture requises sur les compartiments S3, vous pouvez obtenir l'erreur « Access Denied (Accès refusé) ».

    Remarque : Par défaut, les applications héritent de l'accès Amazon S3 du rôle IAM pour le profil d'instance Amazon EC2. Assurez-vous que les politiques IAM attachées à ce rôle autorisent les opérations S3 requises sur les compartiments source et de destination.

    Pour résoudre ce problème, vérifiez si vous disposez de l'autorisation de lecture requise en exécutant la commande suivante :

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

    Le résultat peut être similaire à ce qui suit :

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

    -ou-

    Exécutez la commande suivante :

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

    Le résultat peut être similaire à ce qui suit :

    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=

    Assurez-vous que le rôle de profil d'instance possède les autorisations de lecture et d'écriture requises pour les compartiments S3. Par exemple, les actions S3 de la politique IAM suivante fournissent l'accès en lecture et en écriture requis au compartiment S3 doc-example-bucket :

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

    Vérifier le rôle IAM pour le mappage des rôles EMRFS

    Si vous utilisez une configuration de sécurité pour spécifier des rôles IAM pour EMRFS, alors vous utilisez des mappages de rôle. Votre application hérite des autorisations S3 du rôle IAM en fonction de la configuration de mappage des rôles.

    La politique IAM attachée à ces rôles doit disposer des autorisations S3 requises sur les compartiments source et de destination. Pour spécifier des rôles IAM pour les demandes EMRFS adressées à Amazon S3, reportez-vous à Configurer une configuration de sécurité avec des rôles IAM pour EMRFS.

    Vérifier la politique de point de terminaison d'un VPC Amazon S3

    Si la table de routage de sous-réseau du cluster EMR comporte une route vers un point de terminaison d'un VPC Amazon S3, vérifiez que la politique de point de terminaison autorise les opérations Amazon S3 requises.

    Pour vérifier et modifier la politique de point de terminaison à l'aide de la CLI :

    Exécutez la commande suivante pour vérifier la politique de point de terminaison. Remplacez vpce-xxxxxxxx par votre ID de VPC.

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

    Si nécessaire, exécutez la commande suivante pour charger une politique de point de terminaison modifiée. Remplacez l'ID de VPC et le chemin d'accès au fichier JSON.

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

    Pour vérifier et modifier la politique de point de terminaison à l'aide de la console Amazon VPC :

    1. Ouvrez la console Amazon VPC.
    2. Dans le panneau de navigation, choisissez Endpoints (Points de terminaison).
    3. Sélectionnez le point de terminaison Amazon S3 (celui qui se trouve sur la table de routage de sous-réseau du cluster EMR). Ensuite, choisissez l'onglet Policy (Stratégie) pour vérifier la stratégie de point de terminaison.
    4. Pour ajouter les actions Amazon S3 requises, choisissez Edit Policy (Modifier la politique).

    Vérifier les politiques de compartiment source et de destination S3

    Les politiques de compartiment spécifient les actions qui sont autorisées ou refusées pour les principaux. Les politiques de compartiment source et de destination doivent autoriser le rôle de profil d'instance EC2 ou le rôle IAM mappé à effectuer les opérations Amazon S3 requises.

    Pour vérifier et modifier les politiques de compartiment à l'aide de la CLI :

    Exécutez la commande suivante pour vérifier une politique de compartiment. Remplacez doc-example-bucket par le nom du compartiment source ou de destination.

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

    Si nécessaire, exécutez la commande suivante pour charger une politique de compartiment modifiée. Remplacez le nom du compartiment et le chemin d'accès au fichier JSON.

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

    Pour vérifier et modifier les politiques de compartiment à l'aide de la console Amazon S3 :

    1. Ouvrez la console Amazon S3.
    2. Choisissez le compartiment.
    3. Sélectionnez l'onglet Permissions (Autorisations).
    4. Choisissez Bucket Policy (Politique de compartiment) pour vérifier et modifier la stratégie de compartiment.

    Accès aux compartiments S3 d'un autre compte

    Important : si votre application accède à un compartiment S3 qui appartient à un autre compte AWS, le propriétaire du compte doit autoriser votre rôle IAM sur la politique de compartiment.

    Par exemple, la politique de compartiment suivante accorde à tous les rôles et utilisateurs IAM du compte emr-account un accès complet à 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*"
          ]
        }
      ]
    }