

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從 EMR Serverless 存取另一個 AWS 帳戶中的 S3 資料
<a name="jobs-s3-access"></a>

您可以從一個 AWS 帳戶執行 Amazon EMR Serverless 任務，並將其設定為存取屬於另一個 AWS 帳戶的 Amazon S3 儲存貯體中的資料。此頁面說明如何從 EMR Serverless 設定 S3 的跨帳戶存取。

在 EMR Serverless 上執行的任務可以使用 S3 儲存貯體政策或擔任的角色，從不同的 AWS 帳戶存取 Amazon S3 中的資料。

## 先決條件
<a name="jobs-s3-access-prerequisites"></a>

若要設定 Amazon EMR Serverless 的跨帳戶存取權，請在登入兩個 AWS 帳戶時完成任務：
+ **`AccountA`** – 這是 AWS 您已建立 Amazon EMR Serverless 應用程式的帳戶。在您設定跨帳戶存取之前，請在此帳戶中備妥下列項目：
  + 您要執行任務的 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 B從 存取 中的 S3 儲存貯體account A，請將下列政策連接至 中的 S3 儲存貯體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/*"
      ]
    }
  ]
}
```

------

如需使用 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 跨帳戶存取權的另一種方法是使用 AWS Security Token Service (AWS STS) 中的 `AssumeRole`動作。 AWS STS 是一種全域 Web 服務，可讓您為使用者請求暫時、有限權限的登入資料。您可以使用使用 建立的臨時安全登入資料，對 EMR Serverless 和 Amazon S3 進行 API 呼叫`AssumeRole`。

下列步驟說明如何使用擔任的角色從 EMR Serverless 存取跨帳戶 S3 資料：

1. 在 中建立 Amazon S3 儲存貯體、*cross-account-bucket*體`AccountB`。如需詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[建立儲存貯](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)體。如果您想要跨帳戶存取 DynamoDB，也請在 中建立 DynamoDB 資料表`AccountB`。如需詳細資訊，請參閱《Amazon [ DynamoDB 開發人員指南》中的建立 DynamoDB 資料表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)。 * DynamoDB *

1. 在 `Cross-Account-Role-B` 中建立可存取*cross-account-bucket*體的 `AccountB` IAM 角色。

   1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

   1. 選擇**角色**，並建立一個新角色 `Cross-Account-Role-B`。如需如何建立 IAM 角色的詳細資訊，請參閱《[IAM 使用者指南》中的建立 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)。

   1. 建立 IAM 政策，指定 `Cross-Account-Role-B`存取*cross-account-bucket* S3 儲存貯體的許可，如下列政策陳述式所示。然後，將 IAM 政策附接至 `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 政策附接至 `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. 選取**編輯信任關係**。

   1. 新增下列政策文件。這可讓 `Job-Execution-Role-A`中的 `AccountA` 擔任該`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"
            }
        }]
    }'
```

------