

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 从 EMR Serverless 访问另一个 AWS 账户中的 S3 数据
<a name="jobs-s3-access"></a>

您可以从一个 AWS 账户运行 Amazon EMR 无服务器任务，并将其配置为访问属于另一个账户的 Amazon S3 存储桶中的数据。 AWS 本页介绍了如何配置从 EMR Serverless 对 S3 的跨账户访问。

在 EMR Serverless 上运行的任务可以使用 S3 存储桶策略或代入的角色从其他账户访问 Amazon S3 中的数据。 AWS 

## 先决条件
<a name="jobs-s3-access-prerequisites"></a>

要为 Amazon EMR Serverless 设置跨账户访问权限，请在登录两个账户的同时完成任务： AWS 
+ **`AccountA`**：这是您在其中创建 Amazon EMR Serverless 应用程序的 AWS 账户。在设置跨账户访问之前，请在此账户中做好以下准备：
  + Amazon EMR Serverless 应用程序，在其中运行作业。
  + 作业执行角色，拥有在应用程序中运行作业所需的权限。有关更多信息，请参阅[Amazon EMR Serverless 的作业运行时角色](security-iam-runtime-role.md)。
+ **`AccountB`**：该 AWS 账户包含您希望 Amazon EMR Serverless 作业访问的 S3 存储桶。

## 使用 S3 存储桶策略访问跨账户 S3 数据
<a name="jobs-s3-access-how-to-s3-bucket-policy"></a>

要从 account A 访问 account B 中的 S3 存储桶，请将以下策略附加到 account B 中的 S3 存储桶。

------
#### [ 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/*"
      ]
    }
  ]
}
```

------

有关使用 S3 存储桶策略进行 S3 跨账户访问的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[示例 2：存储桶所有者授予跨账户存储桶权限](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)。

## 使用代入角色跨账户访问 S3 数据
<a name="jobs-s3-access-how-to-assumed-role"></a>

为 Amazon EMR Serverless 设置跨账户访问权限的另一种方法是使用 () `AssumeRole` 中的 AWS Security Token Service 操作。AWS STS AWS STS 是一项全球 Web 服务，允许您为用户申请临时的、权限有限的证书。您可以使用通过 `AssumeRole` 创建的临时安全凭证对 EMR Serverless 和 Amazon S3 进行 API 调用。

以下步骤说明了如何使用代入角色从 EMR Serverless 跨账户访问 S3 数据：

1. 创建 Amazon S3 存储桶，即 `AccountB` 中的 *cross-account-bucket*。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)。如果您希望跨账户访问 DynamoDB，还请在 `AccountB` 中创建 DynamoDB 表。有关更多信息，请参阅《Amazon DynamoDB 开发人员指南》**中的[创建 DynamoDB 表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)。

1. 在 `AccountB` 中创建 `Cross-Account-Role-B` IAM 角色，以便可以访问 *cross-account-bucket*。

   1. 登录 AWS 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

   1. 选择 **Roles (角色)** 并创建新角色：`Cross-Account-Role-B`。有关如何创建 IAM 角色的更多信息，请参阅《IAM 用户指南》中的[创建 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)。

   1. 创建 IAM policy 来指定针对 `Cross-Account-Role-B` 的权限以访问 *cross-account-bucket* S3 存储桶，如以下策略声明所示。然后将 IAM policy 附加到 `Cross-Account-Role-B`。有关更多信息，请参阅《IAM 用户指南》**中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

------
#### [ 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"
       }
     ]
   }
   ```

------

   如果需要访问 DynamoDB，请创建 IAM 策略，指定跨账户访问 DynamoDB 表的权限。然后将 IAM policy 附加到 `Cross-Account-Role-B`。有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon DynamoDB：允许访问特定表](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_specific-table.html)。

   以下是允许访问 DynamoDB 表 `CrossAccountTable` 的策略。

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

****  

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

------

1. 编辑 `Cross-Account-Role-B` 角色的信任关系。

   1. 要配置角色的信任关系，请在 IAM 控制台中为您在步骤 2 中创建的 `Cross-Account-Role-B` 角色选择**信任关系**选项卡。

   1. 选择 **Edit Trust Relationship (编辑信任关系)**。

   1. 添加以下策略文档。这允许 `AccountA` 中的 `Job-Execution-Role-A` 代入 `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. 授`Job-Execution-Role-A``AccountA`予假设 AWS STS `AssumeRole`权限`Cross-Account-Role-B`。

   1. 在 AWS 账户的 IAM 控制台中`AccountA`，选择`Job-Execution-Role-A`。

   1. 添加以下 `Job-Execution-Role-A` 策略语句以便对 `Cross-Account-Role-B` 角色执行 `AssumeRole` 操作。

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

****  

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

------

## 代入角色示例
<a name="jobs-s3-access-how-to-assumed-role-examples"></a>

使用单个代入角色访问账户中的所有 S3 资源，或者在 Amazon EMR 6.11 及更高版本中，配置多个 IAM 角色，以便在跨账户访问不同的 S3 存储桶时代入。

**Topics**
+ [使用单个代入角色访问 S3 资源](#jobs-s3-access-how-to-assumed-role-single)
+ [使用多个代入角色访问 S3 资源](#jobs-s3-access-how-to-assumed-role-multiple)

### 使用单个代入角色访问 S3 资源
<a name="jobs-s3-access-how-to-assumed-role-single"></a>

**注意**  
如果将作业配置为使用单个代入角色，整个作业中的所有 S3 资源都将使用该角色，包括 `entryPoint` 脚本。

如果您想使用单个代入角色访问账户 B 中的所有 S3 资源，请指定以下配置：

1. 将 EMRFS 配置 `fs.s3.customAWSCredentialsProvider` 指定为 `com.amazonaws.emr.AssumeRoleAWSCredentialsProvider`。

1. 对于 Spark，使用 `spark.emr-serverless.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` 和 `spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` 指定驱动程序和执行程序的环境变量。

1. 对于 Hive，使用 `hive.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN`、`tez.am.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` 和 `tez.task.emr-serverless.launch.env.ASSUME_ROLE_CREDENTIALS_ROLE_ARN` 指定 Hive 驱动程序、Tez 应用程序主进程和 Tez 任务容器的环境变量。

以下示例展示了如何使用代入角色启动具有跨账户访问权限的 EMR Serverless 作业运行。

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

以下示例展示了如何使用代入角色启动有权跨账户访问 S3 的 EMR Serverless 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.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 ]

以下示例展示了如何使用代入角色启动有权跨账户访问 S3 的 EMR Serverless 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",
                "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"
            }
        }]
    }'
```

------

### 使用多个代入角色访问 S3 资源
<a name="jobs-s3-access-how-to-assumed-role-multiple"></a>

在 EMR Serverless 6.11.0 及更高版本中，配置多个 IAM 角色，以便在访问不同的跨账户存储桶时代入。如果要使用账户 B 中的不同代入角色访问不同的 S3 资源，请在启动作业运行时使用以下配置：

1. 将 EMRFS 配置 `fs.s3.customAWSCredentialsProvider` 指定为 `com.amazonaws.emr.serverless.credentialsprovider.BucketLevelAssumeRoleCredentialsProvider`。

1. 指定 EMRFS 配置 `fs.s3.bucketLevelAssumeRoleMapping`，定义从 S3 存储桶名称到账户 B 中要代入的 IAM 角色的映射。该值的格式为 `bucket1->role1;bucket2->role2`。

例如，使用 `arn:aws:iam::AccountB:role/Cross-Account-Role-B-1` 访问存储桶 `bucket1`，使用 `arn:aws:iam::AccountB:role/Cross-Account-Role-B-2` 访问存储桶 `bucket2`。以下示例展示了如何通过多个代入角色启动具有跨账户访问权限的 EMR Serverless 作业运行。

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

以下示例展示了如何使用多个代入角色来创建 EMR Serverless 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 ]

以下示例展示了如何使用多个代入角色来创建 EMR Serverless 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"
            }
        }]
    }'
```

------