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

Última actualización: 20 de diciembre de 2021

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=

Descripción corta

Este error indica que la aplicación intentó realizar una operación de Amazon Simple Storage Service (Amazon S3) que falló debido a un problema con uno de los siguientes elementos:

  • Las credenciales o el rol especificado en el código de la aplicación
  • La política asociada al rol de perfil de instancias de Amazon Elastic Compute Cloud (Amazon EC2)
  • El rol de AWS Identity and Access Management (IAM) para el sistema de archivos de EMR (EMRFS)
  • La política del punto de enlace de la VPC de Amazon S3
  • Las políticas de los buckets 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 instancia 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. Es posible que aparezca el error “Acceso denegado” si el perfil de la instancia EC2 (rol de servicio para las instancias EC2 del clúster) no tiene los permisos de lectura y escritura necesarios en los buckets de S3.

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 instancia 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

Cuando se utiliza una configuración de seguridad para especificar los roles de IAM para EMRFS, se establecen asignaciones de roles. Cada asignación de rol especifica un rol de IAM que corresponde a los identificadores. Estos identificadores determinan la base del acceso a Amazon S3 a través de EMRFS. Los identificadores pueden ser usuarios, grupos o prefijos de Amazon S3 que indican una ubicación de datos.

Cuando EMRFS realiza una solicitud a Amazon S3, y esta coincide con la base de acceso, EMRFS hace que las instancias EC2 del clúster asuman el rol de IAM correspondiente para la solicitud. Los permisos de IAM asociados a ese rol se aplican en lugar de los permisos de IAM asociados al rol de servicio para las instancias EC2 del clúster. 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.

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. 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 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-xxxxxxxx" --policy-document file://policy.json

Consola de Amazon VPC:

  1. Abra la consola de Amazon VPC.
  2. En el panel de navegación, elija 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 las entidades 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 asignado 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

Nota: Si recibe errores al ejecutar comandos de AWS CLI, asegúrese de que utiliza la versión más reciente de AWS CLI.

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