Passer au contenu

Pour quelles raisons mon application Amazon EMR échoue-t-elle avec une exception AmazonS3Exception HTTP 403 « Accès refusé » ?

Lecture de 6 minute(s)
0

Lorsque j’exécute une application sur un cluster Amazon EMR, l’application échoue avec une exception AmazonS3Exception HTTP 403 « Accès refusé ».

Résolution

Si vous ne configurez pas correctement les autorisations, le message d’erreur « Accès refusé » peut s’afficher dans Amazon EMR ou Amazon Simple Storage Service (Amazon S3).

Exemple de message d'erreur :

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=

Vérifier les informations d'identification ou le rôle IAM spécifié dans votre code d’application

Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.

Exécutez la commande ls sur le nœud primaire du cluster Amazon EMR :

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

Remarque : Remplacez s3://doc-example-bucket/abc/ par le chemin Amazon S3.

Si la commande précédente aboutit, les informations d'identification ou le rôle AWS Identity and Access Management (IAM) sont à l'origine de l'erreur Accès refusé.

Afin de résoudre ce problème, procédez comme suit :

  1. Vérifiez que votre application utilise les informations d'identification attendues ou endosse le rôle IAM attendu.
  2. Pour vérifier que le rôle est autorisé à accéder au chemin Amazon S3, utilisez l'interface de ligne de commande AWS pour endosser le rôle IAM. Puis, envoyez un exemple de requête vers le chemin S3.

Vérifier la stratégie relative au 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 pour les compartiments S3, l’erreur Accès refusé peut survenir.

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 stratégies IAM associées à ce rôle autorisent bien les opérations S3 requises pour les compartiments source et de destination.

Pour vérifier si vous disposez de l'autorisation de lecture requise, exécutez la commande ls :

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

Exemple de résultat :

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

Exemple de résultat :

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=

Vérifiez que le rôle du profil d’instance dispose des autorisations de lecture et d’écriture requises pour les compartiments S3.

Exemple de stratégie 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/*"
      ]
    }
  ]
}

Vérifier le mappage des rôles EMRFS dans le cadre du rôle IAM

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

La stratégie IAM associée aux rôles doit disposer des autorisations S3 requises pour les compartiments source et de destination. Pour spécifier des rôles IAM pour les requêtes EMRFS adressées à Amazon S3, consultez la section Définir une configuration de sécurité avec des rôles IAM pour EMRFS.

Vérifier la stratégie relative aux points de terminaison d’un VPC Amazon S3

Si la table de routage des sous-réseaux du cluster EMR utilise une route vers le point de terminaison d’un VPC Amazon S3, vérifiez que la stratégie de point de terminaison autorise les opérations Amazon S3 requises.

Utiliser l’interface de ligne de commande AWS

Exécutez le commentaire de l'interface de ligne de commande describe-vpc-endpoints pour vérifier la stratégie de point de terminaison :

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

Remarque : Remplacez vpce-######## par votre ID de VPC.

Exécutez la commande modify-vpc-endpoint pour modifier la stratégie de point de terminaison :

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

Remarque : Remplacez --vpc-endpoint-id et le chemin du fichier JSON.

Utiliser la console Amazon VPC

Procédez comme suit :

  1. Ouvrez la console Amazon VPC.
  2. Dans le volet de navigation, sélectionnez Points de terminaison.
  3. Sélectionnez le point de terminaison Amazon S3 qui figure dans la table de routage des sous-réseaux du cluster EMR.
  4. Sélectionnez l’onglet Stratégie.
  5. Sélectionnez Modifier la stratégie.

Vérifier les stratégies relatives aux compartiments source et de destination S3

Les stratégies de compartiment spécifient les actions autorisées ou refusées des principaux. Les stratégies de compartiment source et de destination doivent autoriser le rôle du profil d’instance S3 ou le rôle IAM mappé à effectuer les opérations Amazon S3 requises.

Pour modifier les stratégies de compartiment, utilisez l'interface de ligne de commande AWS ou la console Amazon S3.

Utiliser l’interface de ligne de commande AWS

Exécutez la ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-policy.html) commande [ get-bucket-policy pour obtenir la stratégie de compartiment :

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

Remarque : Remplacez doc-example-policy par le nom du compartiment source ou de destination.

Modifiez la stratégie, puis enregistrez-la dans un fichier JSON.

Puis, exécutez la commande put-bucket-policy pour ajouter la stratégie modifiée au compartiment :

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

Remarque : Remplacez le nom du compartiment et le chemin du fichier JSON.

Utiliser la console Amazon S3

Pour obtenir des instructions, consultez la section Ajout d’une stratégie de compartiment à l'aide de la console Amazon S3.

Important : Si votre application a accès à un compartiment S3 qui appartient à un autre compte AWS, le propriétaire du compte doit autoriser votre rôle IAM dans la stratégie de compartiment.

Par exemple, la stratégie de compartiment suivante donne à tous les rôles IAM et à tous les utilisateurs de 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*"
      ]
    }
  ]
}

Informations connexes

Pour quelles raisons ma tâche Spark ou Hive sur Amazon EMR échoue-t-elle avec une exception AmazonS3Exception HTTP 503 « Service indisponible » ?

Pour quelles raisons mon application Amazon EMR échoue-t-elle avec une exception AmazonS3Exception HTTP 404 « Introuvable » ?

Réponses relatives aux erreurs

Comment puis-je résoudre les erreurs 403 Access Refusé provenant d’Amazon S3 ?

AWS OFFICIELA mis à jour il y a 2 ans