¿Por qué se produce un error en la aplicación de Amazon EMR y aparece AmazonS3Exception HTTP 403 “Access Denied” (Acceso denegado)?

Última actualización: 03-05-2022

Al enviar una aplicación a un clúster de Amazon EMR, se produce un error HTTP 403 “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=

Resolución

Si los permisos no están configurados correctamente, es posible que reciba un error “Access Denied” (Acceso denegado) en Amazon EMR o Amazon Simple Storage Service (Amazon S3).

Primero, compruebe las credenciales o el rol especificados en el código de la aplicació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). Confirme que su aplicación utiliza las credenciales esperadas o asume el rol esperado y que tiene acceso a la ruta de Simple Storage Service (Amazon S3). Verifique que el rol tenga permisos para la ruta de Simple Storage Service (Amazon S3) al asumir el rol de AWS Identity and Access Management (IAM) mediante la CLI de AWS. A continuación, realice una solicitud de ejemplo a la ruta de 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

    Si el perfil de instancias de Amazon Elastic Compute Cloud (EC2) no tiene los permisos de lectura y escritura necesarios en los buckets de S3, es posible que aparezca el error “Access Denied” (Acceso denegado).

    Nota: de forma predeterminada, las aplicaciones heredan el acceso a Simple Storage Service (Amazon S3) del rol de IAM para el perfil de instancias de Amazon EC2. Asegúrese de que las políticas de IAM asociadas a este rol permiten las operaciones de S3 requeridas en los buckets de origen y destino.

    Para solucionar este problema, verifique si tiene el permiso de lectura necesario mediante la ejecución del siguiente comando:

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

    La salida puede tener el siguiente aspecto:

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

    -o bien-

    Ejecute el siguiente comando:

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

    La salida puede tener el siguiente aspecto:

    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=

    Asegúrese de que el rol del perfil de instancias tiene los permisos de lectura y escritura necesarios para los buckets de S3. Por ejemplo, las acciones de S3 en la siguiente política de IAM proporcionan el acceso de lectura y escritura necesario al bucket de 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/*"
          ]
        }
      ]
    }

    Verifique el rol de IAM que corresponde a la asignación del rol de EMRFS

    Si utiliza una configuración de seguridad para especificar los roles de IAM para EMRFS, entonces está utilizando la asignaciones de roles. La aplicación hereda los permisos de S3 del rol de IAM en función de la configuración de asignación de roles.

    Por lo tanto, la política de IAM asociada a estos roles debe tener los permisos de S3 necesarios en los buckets de origen y destino. Para especificar los roles de IAM para las solicitudes de EMRFS a Simple Storage Service (Amazon S3), consulte Establecer una configuración de seguridad con roles de IAM para EMRFS.

    Verificar la política de punto de conexión de VPC de Simple Storage Service (Amazon S3)

    Si la tabla de enrutamiento de la subred del clúster de EMR tiene una ruta a un punto de conexión de VPC de Simple Storage Service (Amazon S3), confirme que la política de punto de conexión permite las operaciones necesarias de Simple Storage Service (Amazon S3).

    Para comprobar y modificar la política de puntos de conexión mediante la CLI:

    Ejecute el siguiente comando para revisar la política de punto de conexión. Reemplace vpce-xxxxxxxx por el ID de la VPC.

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

    Si es necesario, ejecute el siguiente comando para cargar una política del punto de conexión modificada. Sustituya el ID de la VPC y la ruta del archivo JSON.

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

    Para comprobar y modificar la política de puntos de conexión mediante la consola de Amazon VPC:

    1. Abra la consola de Amazon VPC.
    2. En el panel de navegación, elija Endpoints (Puntos de conexión).
    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 Simple Storage Service (Amazon S3), elija Edit Policy (Editar política).

    Comprobar las políticas de bucket de origen y destino de S3

    Las políticas de bucket especifican las acciones permitidas o denegadas para las entidades principales. Las políticas de los buckets de origen y destino deben permitir que el rol del perfil de instancias de EC2 o el rol de IAM asignado lleven a cabo las operaciones necesarias de Simple Storage Service (Amazon S3).

    Para comprobar y modificar las políticas de bucket mediante la 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. Sustituya el nombre del bucket y la ruta del archivo JSON.

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

    Para comprobar y modificar las políticas de bucket mediante la consola de Simple Storage Service (Amazon S3):

    1. Abra la consola de Simple Storage Service (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

    Importante: 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*"
          ]
        }
      ]
    }