Mi aplicación de Amazon EMR no funciona y se muestra la excepción HTTP 403 “Access Denied” (Acceso denegado) AmazonS3Exception

Última actualización 15 de diciembre de 2020

Cuando envío una aplicación a un clúster de Amazon EMR, la aplicación tiene un error con una excepción HTTP 403 “Access Denied” (Acceso denegado) AmazonS3Exception:

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=

Descripción corta

Este error indica que la aplicación intentó efectuar una operación de Amazon Simple Storage Service (Amazon S3) que no se pudo completar por un problema con uno de los siguientes elementos:

  • Credenciales o rol especificados en el código de su aplicación
  • Política adjunta al rol de perfil de instancias de Amazon Elastic Compute Cloud (Amazon EC2)
  • Política de punto de enlace de la VPC de Amazon S3
  • Políticas de bucket de origen y destino de Amazon S3

Resolución

Ejecute el siguiente comando en el nodo maestro del clúster de EMR. Sustituya s3://doc-example-bucket/abc/ por la ruta de Amazon S3.

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

Si este comando se ejecuta correctamente, las credenciales o el rol especificado en el código de su aplicación causan el error “Access Denied” (Acceso denegado). Las credenciales o el rol deben tener acceso a la ruta de Amazon S3.

Si este comando tiene un error, confirme que utiliza la versión más reciente de AWS Command Line Interface (AWS CLI). A continuación, verifique lo siguiente para resolver el error “Access Denied” (Acceso denegado):

Verifique la política del rol de perfil de instancias de Amazon EC2

De forma predeterminada, las aplicaciones heredan el acceso a Amazon S3 del rol de AWS Identity and Access Management (IAM) para el perfil de instancias de Amazon EC2. Las políticas de IAM adjuntas a este rol deben permitir las operaciones necesarias de Amazon S3 en los buckets de origen y destino.

Si utiliza el mapeo de roles de EMRFS, su aplicación hereda los permisos de Amazon S3 del rol de IAM para el usuario que envió la solicitud. Este usuario de IAM debe tener una política de IAM que permita las operaciones necesarias de Amazon S3 en los buckets de origen y destino.

Verifique la política de punto de enlace de la VPC de Amazon S3

Si la tabla de enrutamiento de la subred del clúster de EMR tiene una ruta a un punto de enlace de la VPC de Amazon S3, confirme que la política de punto de enlace permite las operaciones necesarias de Amazon S3. Puede utilizar AWS CLI o la consola de Amazon VPC para verificar y modificar la política del punto de enlace.

AWS CLI:

Ejecute el siguiente comando para revisar la política de punto de enlace. Sustituya vpce-9f28e4f6 por el ID de la VPC.

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

Si es necesario, ejecute el siguiente comando para cargar una política del punto de enlace modificada. En el ejemplo, sustituya el ID de la VPC y la ruta del archivo JSON.

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

Consola de Amazon VPC:

  1. Abra la consola de Amazon VPC.
  2. En el panel de navegación, elija Endpoints (Puntos de enlace).
  3. Seleccione el punto de enlace de Amazon S3 (el que está en la tabla de enrutamiento de la subred del clúster de EMR). A continuación, elija la pestaña Policy (Política) para revisar la política de punto de enlace.
  4. Para agregar las acciones necesarias de Amazon S3, elija Edit Policy (Editar política).

Verifique las políticas de bucket de S3

Las políticas de bucket especifican las acciones permitidas o denegadas para los elementos principales. Las políticas de los buckets de origen y destino deben permitir que el rol del perfil de instancias EC2 o el rol de IAM mapeado lleve a cabo las operaciones necesarias de Amazon S3. Puede utilizar AWS CLI o la consola de Amazon S3 para verificar y modificar las políticas de bucket.

AWS CLI:

Ejecute el siguiente comando para revisar la política de bucket. Sustituya doc-example-bucket por el nombre del bucket de origen o destino.

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

Si es necesario, ejecute el siguiente comando para cargar una política de bucket modificada. En el ejemplo, sustituya el nombre del bucket y la ruta del archivo JSON.

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

Consola de Amazon S3:

  1. Abra la consola de Amazon S3.
  2. Elija el bucket.
  3. Haga clic en la pestaña Permissions (Permisos).
  4. Elija Bucket Policy (Política de bucket) para revisar y modificar la política de bucket.

Acceso a los buckets de S3 en otra cuenta

Si su aplicación accede a un bucket de S3 que pertenece a otra cuenta de AWS, el propietario de la cuenta debe permitir su rol de IAM en la política de bucket. Por ejemplo, la siguiente política de bucket da a todos los roles y usuarios de IAM de emr-account acceso completo a 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*"
            ]
        }
    ]
}