Mon application Amazon EMR échoue avec une exception AmazonS3Exception HTTP 403 « Access Denied » (Accès refusé)

Date de la dernière mise à jour : 21/11/2019

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=

Brève description

Cette erreur indique que l'application a tenté d'effectuer une opération Amazon Simple Storage Service (Amazon S3) qui a échoué en raison d'un problème lié à l'un des éléments suivants :

  • Informations d'identification ou rôle spécifiées dans votre code d'application
  • Stratégie attachée au rôle de profil d'instance Amazon Elastic Compute Cloud (Amazon EC2)
  • Stratégie de point de terminaison d'un VPC Amazon S3
  • Stratégies de compartiment source et de destination Amazon S3

Résolution

Exécutez la commande suivante sur le nœud maître du cluster EMR. Remplacez s3://awsexamplebucket/abc/ par votre chemin Amazon S3.

aws s3 ls s3://awsexamplebucket/abc/

Si cette commande aboutit, elle indique que les informations d'identification ou le rôle spécifiés dans votre code d'application sont responsables de l'erreur « Accès refusé ». Les informations d'identification ou le rôle doivent avoir accès au chemin d'accès Amazon S3.

Si cette commande échoue, vérifiez les éléments suivants pour résoudre l'erreur « Accès refusé » :

Vérifier la stratégie pour le rôle de profil d'instance Amazon EC2

Par défaut, les applications héritent de l'accès Amazon S3 du rôle AWS Identity and Access Management (IAM) pour le profil d'instance Amazon EC2. Les stratégies IAM attachées à ce rôle doivent autoriser les opérations Amazon S3 requises sur les compartiments source et de destination.

Si vous utilisez le mappage de rôle EMRFS, votre application hérite des autorisations Amazon S3 du rôle IAM pour l'utilisateur qui a envoyé l'application. Cet utilisateur IAM doit disposer d'une stratégie IAM qui autorise les opérations Amazon S3 requises sur les compartiments source et de destination.

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

Si la table de routage du sous-réseau du cluster EMR comporte une route vers un 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. Vous pouvez utiliser l'interface de ligne de commande AWS (AWS CLI) ou la console Amazon VPC pour vérifier et modifier la stratégie de point de terminaison.

AWS CLI :

Exécutez la commande suivante pour vérifier la stratégie de point de terminaison. Remplacez vpce-9f28e4f6 par votre ID de VPC.

aws ec2 describe-vpc-endpoints --vpc-endpoint-ids "vpce-9f28e4f6"

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

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

Console Amazon VPC :

1.    Ouvrez la console Amazon VPC.

2.    Dans le volet de navigation, sélectionnez« Endpoints » (Points de terminaison).

3.    Sélectionnez le point de terminaison Amazon S3 (celui qui se trouve sur la table de routage du sous-réseau du cluster EMR), puis choisissez l'onglet « Policy » (Stratégie) pour vérifier la stratégie du point de terminaison.

4.    Pour ajouter les actions Amazon S3 requises, choisissez « Edit Policy » (Modifier la stratégie).

Vérification des stratégies de compartiment S3

Lesstratégies de compartiment spécifient les actions qui sont autorisées ou refusées pour quels mandataires. Les stratégies de compartiment pour les compartiments 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. Vous pouvez utiliser l'interface de ligne de commande AWS (AWS CLI) ou la console Amazon S3 pour vérifier et modifier les stratégies de compartiment.

AWS CLI :

Exécutez la commande suivante pour vérifier une stratégie de compartiment. Remplacez awsexamplebucket par le nom du compartiment source ou de destination.

aws s3api get-bucket-policy --bucket awsexamplebucket

Si nécessaire, exécutez la commande suivante pour charger une stratégie de compartiment modifiée. Dans l'exemple, remplacez le nom du compartiment et le chemin d'accès au fichier JSON.

aws s3api put-bucket-policy --bucket awsexamplebucket --policy file://policy.json

Console Amazon S3 :

1.    Ouvrez la console Amazon S3.

2.    Choisissez le compartiment.

3.    Sélectionnez l’onglet Permissions (Autorisations).

4.    Choisissez « Bucket Policy » (Stratégie de compartiment) pour vérifier et modifier la stratégie de compartiment.

Accès aux compartiments S3 d'un autre compte

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 stratégie de compartiment. Par exemple, la stratégie de compartiment suivante accorde à tous les rôles et utilisateurs IAM du compte emr un accès complet à s3 ://awsexamplebucket/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:::awsexamplebucket"
            ],
            "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:::awsexamplebucket"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "myfolder/*"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::emr-account:root"
                ]
            },
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::awsexamplebucket/myfolder/*",
                "arn:aws:s3:::awsexamplebucket/myfolder*"
            ]
        }
    ]
}