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

Lecture de 7 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 les autorisations ne sont pas configurées correctement, le message d’erreur « Accès refusé » peut s’afficher dans Amazon EMR ou Amazon Simple Storage Service (Amazon S3). L’erreur ressemble au message suivant :

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 tout d’abord les informations d’identification ou le rôle spécifiés dans le code de l’application

Exécutez la commande suivante sur le nœud principal du cluster EMR. Remplacez s3://doc-example-bucket/abc/ par le 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 le code de l’application sont à l’origine de l’erreur « Accès refusé ». Vérifiez que l’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 est autorisé à accéder au chemin Amazon S3 en assumant le rôle IAM (Gestion des identités et des accès AWS) à l’aide de l’AWS CLI. Envoyez ensuite 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’interface de la ligne de commande AWS (AWS CLI). Vérifiez ensuite les points suivants pour résoudre l’erreur « Accès refusé » :

Vérifier la politique 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 alors 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 politiques IAM associées à ce rôle autorisent bien les opérations S3 requises pour les compartiments source et de destination.

Pour résoudre ce problème et savoir si vous disposez de l’autorisation de lecture requise, exécutez la commande suivante :

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

La sortie peut ressembler à 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

La sortie peut ressembler à 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=

Vérifiez que le rôle du profil d’instance dispose des 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 pour le 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 mappage des rôles EMRFS dans le cadre du rôle IAM

Le mappage des rôles s’effectue lorsque vous utilisez une configuration de sécurité pour spécifier des rôles IAM pour EMRFS. Votre application hérite des autorisations S3 du rôle IAM en fonction de la configuration du mappage des rôles.

La politique IAM associée à ces 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éfinition d’une configuration de sécurité avec des rôles IAM pour EMRFS.

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

Si la table de routage des sous-réseaux du cluster EMR contient un routage vers le point de terminaison d’un VPC Amazon S3, vérifiez que la politique relative aux points de terminaison autorise les opérations Amazon S3 requises.

Pour vérifier et modifier la politique relative aux points de terminaison à l’aide de la CLI, procédez comme suit :

Exécutez la commande suivante pour vérifier la politique relative aux points de terminaison. Remplacez vpce-xxxxxxxx par l’ID de votre VPC.

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

Si nécessaire, exécutez la commande suivante pour charger une politique relative aux points de terminaison modifiée. Remplacez l’ID du VPC et le chemin du fichier JSON.

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

Pour vérifier et modifier la politique relative aux points de terminaison à l’aide de la console Amazon VPC, procédez comme suit :

  1. Ouvrez la console Amazon VPC.
  2. Dans le volet de navigation, choisissez Points de terminaison.
  3. Sélectionnez un point de terminaison Amazon S3 (celui qui figure dans la table de routage des sous-réseaux du cluster EMR). Choisissez ensuite l’onglet Politique pour consulter la politique du point de terminaison.
  4. Pour ajouter les actions Amazon S3 requises, choisissez Modifier la politique.

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

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

Pour vérifier et modifier les politiques relatives aux compartiments à l’aide de la CLI, procédez comme suit :

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 du fichier JSON.

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

Pour vérifier et modifier les politiques relatives aux compartiments à l’aide de la console Amazon S3, procédez comme suit :

  1. Ouvrez la console Amazon S3.
  2. Choisissez un compartiment.
  3. Sélectionnez l’onglet Autorisations.
  4. Choisissez Politique de compartiment pour vérifier et modifier la politique relative au compartiment.

Accès aux compartiments S3 depuis un autre compte

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 politique de compartiment.

Par exemple, la politique 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 OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans