

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Acceso a los datos de S3 en otra AWS cuenta desde EMR Serverless
<a name="jobs-s3-access"></a>

Puede ejecutar trabajos de Amazon EMR Serverless desde una AWS cuenta y configurarlos para acceder a los datos de los buckets de Amazon S3 que pertenezcan a otra cuenta. AWS En esta página se describe cómo configurar el acceso entre cuentas a S3 desde EMR sin servidor.

Los trabajos que se ejecutan en EMR Serverless pueden utilizar una política de bucket de S3 o un rol asumido para acceder a los datos de Amazon S3 desde una cuenta diferente. AWS 

## Requisitos previos
<a name="jobs-s3-access-prerequisites"></a>

Para configurar el acceso multicuenta a Amazon EMR Serverless, complete las tareas con la sesión iniciada en dos cuentas: AWS 
+ **`AccountA`**: esta es la cuenta de AWS en la que ha creado una aplicación Amazon EMR sin servidor. Antes de configurar el acceso entre cuentas tenga preparado en su cuenta lo siguiente:
  + Una aplicación de Amazon EMR sin servidor en la que desee ejecutar los trabajos.
  + Un rol de ejecución de trabajos que tenga los permisos necesarios para ejecutar trabajos en la aplicación. Para obtener más información, consulta [Roles en tiempo de ejecución de trabajo para Amazon EMR sin servidor](security-iam-runtime-role.md).
+ **`AccountB`**: esta es la cuenta de AWS que contiene el bucket de S3 al que desea que accedan sus trabajos de Amazon EMR sin servidor. 

## Uso de una política de buckets de S3 para acceder a los datos de S3 entre cuentas
<a name="jobs-s3-access-how-to-s3-bucket-policy"></a>

Para acceder al bucket de S3 en account B desde account A, adjunte la siguiente política al bucket de S3 en account B.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ExamplePermissions1",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket-name"
      ]
    },
    {
      "Sid": "ExamplePermissions2",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket-name/*"
      ]
    }
  ]
}
```

------

Para obtener más información acerca del acceso entre cuentas de S3 con políticas de bucket de S3, consulte [Ejemplo 2: propietario del bucket que concede permisos de bucket entre cuentas](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html) en la *Guía del usuario de Amazon Simple Storage Service*.

## Uso de un rol asumido para acceder a los datos de S3 entre cuentas
<a name="jobs-s3-access-how-to-assumed-role"></a>

Otra forma de configurar el acceso multicuenta para Amazon EMR Serverless es con `AssumeRole` la acción de AWS Security Token Service ().AWS STS AWS STS es un servicio web global que le permite solicitar credenciales temporales con privilegios limitados para los usuarios. Puede realizar llamadas de API a EMR sin servidor y Amazon S3 con las credenciales de seguridad temporales que usted crea con `AssumeRole`.

Los siguientes pasos ilustran cómo utilizar un rol asumido para acceder a los datos de S3 entre cuentas desde EMR sin servidor: 

1. Cree un bucket de Amazon S3, *cross-account-bucket*, en la `AccountB`. Para obtener más información, consulte [Creación de un bucket](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html) en la *Guía del usuario de Amazon Simple Storage Service*. Si desea tener acceso entre cuentas a DynamoDB, también puede crear una tabla de DynamoDB en la `AccountB`. Para obtener más información, consulte [Creación de una tabla de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html) en la *Guía para desarrolladores de Amazon DynamoDB*.

1. Cree un rol de IAM `Cross-Account-Role-B` en la `AccountB` que pueda acceder a *cross-account-bucket*.

   1. Inicie sesión en la consola de IAM Consola de administración de AWS y ábrala en. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)

   1. Elija **Roles** y, a continuación, cree un nuevo rol: `Cross-Account-Role-B`. Para obtener más información acerca de cómo crear un rol de IAM, consulte [Creación de roles de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html) en la Guía del usuario de IAM.

   1. Cree una política de IAM que especifique los permisos del `Cross-Account-Role-B` para acceder al bucket de S3 *cross-account-bucket*, tal como se muestra en la siguiente instrucción de política. Adjunte la política de IAM al `Cross-Account-Role-B`. Para obtener más información, consulte [Creación de políticas de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) en la *Guía del usuario de IAM*.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "s3:*"
         ],
         "Resource": [
           "arn:aws:s3:::cross-account-bucket",
           "arn:aws:s3:::cross-account-bucket/*"
         ],
         "Sid": "AllowS3"
       }
     ]
   }
   ```

------

   Si requiere acceso a DynamoDB, cree una política de IAM que especifique los permisos para acceder a la tabla de DynamoDB entre cuentas. Adjunte la política de IAM al `Cross-Account-Role-B`. Para obtener más información, consulte [Amazon DynamoDB: permite el acceso a una determinada tabla](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_specific-table.html) en la *Guía del usuario de IAM*.

   A continuación, se presenta una política para acceder a una tabla de DynamoDB `CrossAccountTable`.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "dynamodb:*"
         ],
         "Resource": [
           "arn:aws:dynamodb:*:123456789012:table/CrossAccountTable"
         ],
         "Sid": "AllowDYNAMODB"
       }
     ]
   }
   ```

------

1. Edite la relación de confianza del rol `Cross-Account-Role-B`.

   1. Para configurar la relación de confianza del rol, elija la pestaña **Relaciones de confianza** en la consola de IAM para el rol `Cross-Account-Role-B` creado en el paso 2.

   1. Seleccione **Editar la relación de confianza**.

   1. Añada el siguiente documento de política. Esto permite que `Job-Execution-Role-A` en `AccountA` asuma el rol `Cross-Account-Role-B`.

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "sts:AssumeRole"
            ],
            "Resource": "arn:aws:iam::123456789012:role/Job-Execution-Role-A",
            "Sid": "AllowSTSAssumerole"
          }
        ]
      }
      ```

------

1. Otorgue `Job-Execution-Role-A` `AccountA` el AWS STS `AssumeRole` permiso para asumir`Cross-Account-Role-B`.

   1. En la consola de IAM de la AWS cuenta`AccountA`, seleccione`Job-Execution-Role-A`.

   1. Agregue la siguiente instrucción de política al `Job-Execution-Role-A` para denegar la acción `AssumeRole` en el rol `Cross-Account-Role-B`.

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "sts:AssumeRole"
            ],
            "Resource": [
              "arn:aws:iam::123456789012:role/Cross-Account-Role-B"
            ],
            "Sid": "AllowSTSAssumerole"
          }
        ]
      }
      ```

------

## Ejemplos de roles asumidos
<a name="jobs-s3-access-how-to-assumed-role-examples"></a>

Use un solo rol asumido para acceder a todos los recursos de S3 de una cuenta o, con Amazon EMR 6.11 y versiones posteriores, configure varios roles de IAM para asumirlos al acceder a diferentes buckets de S3 entre cuentas.

**Topics**
+ [Acceso a los recursos de S3 con un rol asumido](#jobs-s3-access-how-to-assumed-role-single)
+ [Acceso a los recursos de S3 con varios roles asumidos](#jobs-s3-access-how-to-assumed-role-multiple)

### Acceso a los recursos de S3 con un rol asumido
<a name="jobs-s3-access-how-to-assumed-role-single"></a>

**nota**  
Al configurar un trabajo para usar un único rol asumido, todos los recursos de S3 del trabajo usan ese rol, incluido el script de `entryPoint`.

Si desea utilizar un único rol asumido para acceder a todos los recursos de S3 de la cuenta B, especifique las siguientes configuraciones:

1. Especifique la configuración `fs.s3.customAWSCredentialsProvider` para `com.amazonaws.emr.AssumeRoleAWSCredentialsProvider` de EMRFS.

1. En el caso de Spark, utilice `spark.emr-serverless.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` y `spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` para especificar las variables de entorno del controlador y los ejecutores.

1. Para Hive, utilice `hive.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN`, `tez.am.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` y `tez.task.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` para especificar las variables de entorno en el controlador Hive, el maestro de aplicaciones de Tez y los contenedores de tareas de Tez.

Los siguientes ejemplos muestran cómo usar un rol asumido para iniciar una ejecución de un trabajo EMR sin servidor con acceso entre cuentas.

------
#### [ Spark ]

El siguiente ejemplo muestra cómo usar un rol asumido para iniciar la ejecución de un trabajo de EMR sin servidor Spark con acceso entre cuentas a S3.

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "entrypoint_location",
            "entryPointArguments": [":argument_1:", ":argument_2:"],
            "sparkSubmitParameters": "--conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1"
        }
    }' \
     --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "spark-defaults",
            "properties": {
                "spark.hadoop.fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.AssumeRoleAWSCredentialsProvider",
                "spark.emr-serverless.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B",
                "spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B"
            }
        }]
    }'
```

------
#### [ Hive ]

El siguiente ejemplo muestra cómo usar un rol asumido para iniciar la ejecución de un trabajo de EMR sin servidor Hive con acceso entre cuentas a S3.

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "hive": {
            "query": "query_location",
            "parameters": "hive_parameters"
        }
    }' \
    --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "hive-site",
            "properties": {
                "fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.serverless.credentialsprovider.AssumeRoleAWSCredentialsProvider",
                "hive.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B",
                "tez.am.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B",
                "tez.task.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN": "arn:aws:iam::AccountB:role/Cross-Account-Role-B"
            }
        }]
    }'
```

------

### Acceso a los recursos de S3 con varios roles asumidos
<a name="jobs-s3-access-how-to-assumed-role-multiple"></a>

Con las versiones 6.11.0 y posteriores de EMR sin servidor, configure varios roles de IAM para que los asuma al acceder a diferentes buckets entre cuentas. Si desea acceder a diferentes recursos de S3 con diferentes roles asumidos en la cuenta B, utilice las siguientes configuraciones al iniciar la ejecución del trabajo:

1. Especifique la configuración `fs.s3.customAWSCredentialsProvider` para `com.amazonaws.emr.serverless.credentialsprovider.BucketLevelAssumeRoleCredentialsProvider` de EMRFS.

1. Especifique la configuración `fs.s3.bucketLevelAssumeRoleMapping` de EMRFS para definir la asignación desde el nombre del bucket de S3 hasta el rol de IAM que se va a asumir en la cuenta B. El formato del valor debe ser `bucket1->role1;bucket2->role2`.

Por ejemplo, use `arn:aws:iam::AccountB:role/Cross-Account-Role-B-1` para acceder al bucket `bucket1` y use `arn:aws:iam::AccountB:role/Cross-Account-Role-B-2` para acceder al bucket `bucket2`. Los siguientes ejemplos muestran cómo iniciar una ejecución de trabajo de EMR sin servidor con acceso entre cuentas a través de varios roles asumidos.

------
#### [ Spark ]

El siguiente ejemplo muestra cómo usar varios roles asumidos para crear la ejecución de un trabajo de EMR sin servidor Spark.

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "sparkSubmit": {
            "entryPoint": "entrypoint_location",
            "entryPointArguments": [":argument_1:", ":argument_2:"],
            "sparkSubmitParameters": "--conf spark.executor.cores=4 --conf spark.executor.memory=20g --conf spark.driver.cores=4 --conf spark.driver.memory=8g --conf spark.executor.instances=1"
        }
    }' \
     --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "spark-defaults",
            "properties": {
                "spark.hadoop.fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.serverless.credentialsprovider.BucketLevelAssumeRoleCredentialsProvider",
                "spark.hadoop.fs.s3.bucketLevelAssumeRoleMapping": "bucket1->arn:aws:iam::AccountB:role/Cross-Account-Role-B-1;bucket2->arn:aws:iam::AccountB:role/Cross-Account-Role-B-2"
            }
        }]
    }'
```

------
#### [ Hive ]

Los siguientes ejemplos muestran cómo usar varios roles asumidos para crear la ejecución de un trabajo de EMR sin servidor Hive.

```
aws emr-serverless start-job-run \
    --application-id application-id \
    --execution-role-arn job-role-arn \
    --job-driver '{
        "hive": {
            "query": "query_location",
            "parameters": "hive_parameters"
        }
    }' \
    --configuration-overrides '{
        "applicationConfiguration": [{
            "classification": "hive-site",
            "properties": {
                "fs.s3.customAWSCredentialsProvider": "com.amazonaws.emr.serverless.credentialsprovider.AssumeRoleAWSCredentialsProvider",
                "fs.s3.bucketLevelAssumeRoleMapping": "bucket1->arn:aws:iam::AccountB:role/Cross-Account-Role-B-1;bucket2->arn:aws:iam::AccountB:role/Cross-Account-Role-B-2"
            }
        }]
    }'
```

------