

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

# 設定 Amazon EMR on EKS 的跨帳戶存取權
<a name="security-cross-account"></a>

您可設定 Amazon EMR on EKS 的跨帳戶存取權。跨帳戶存取可讓某個 AWS 帳戶的使用者執行 Amazon EMR on EKS 任務，並存取屬於另一個 AWS 帳戶的基礎資料。

## 先決條件
<a name="security-cross-account-prereq"></a>

若要設定 Amazon EMR on EKS 的跨帳戶存取權，您將在登入下列 AWS 帳戶時完成任務：
+ `AccountA` - 您已透過在 EKS 叢集上註冊 Amazon EMR 命名空間來建立 Amazon EMR on EKS 虛擬叢集 AWS 的帳戶。
+ `AccountB` - 包含您希望 Amazon EMR on EKS 任務存取的 Amazon S3 儲存貯體或 DynamoDB 資料表 AWS 的帳戶。

您必須先在 AWS 帳戶中備妥下列項目，才能設定跨帳戶存取：
+ 您想要在其中執行作業的 `AccountA` 中的 Amazon EMR on EKS 虛擬叢集。
+ `AccountA` 中的作業執行角色，它具有在虛擬叢集中執行作業所需的許可。如需詳細資訊，請參閱[建立作業執行角色](creating-job-execution-role.md)及[搭配使用作業執行角色與 Amazon EMR on EKS](iam-execution-role.md)。

## 如何存取跨帳戶 Amazon S3 儲存貯體或 DynamoDB 資料表
<a name="security-cross-account-steps"></a>

若要設定 Amazon EMR on EKS 的跨帳戶存取權，請完成以下步驟。

1. 在 `AccountB` 中建立 Amazon S3 儲存貯體 `cross-account-bucket`。如需詳細資訊，請參閱[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)。如果想要擁有對 DynamoDB 的跨帳戶存取權，也可以在 `AccountB` 中建立 DynamoDB 資料表。如需詳細資訊，請參閱[建立 DynamoDB 資料表](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)。

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

   1. 登入 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 使用者指南》中的[建立新政策](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 使用者指南》中的[建立 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:us-east-1:*:table/CrossAccountTable"
            ],
            "Sid": "AllowDYNAMODB"
          }
        ]
      }
      ```

------

1. 編輯 `Cross-Account-Role-B` 角色的信任關係。

   1. 若要設定角色的信任關係，請在 IAM 主控台中為「步驟 2：`Cross-Account-Role-B`」中建立的角色選擇**信任關係**索引標籤。

   1. 選取**編輯信任關係**。

   1. 新增下列政策文件，它允許 `AccountA` 中的 `Job-Execution-Role-A` 擔任此 `Cross-Account-Role-B` 角色。

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

****  

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

------

1. 在 `AccountA` 中對 `Job-Execution-Role-A` 授予 STS Assume role 許可以擔任 `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::*:role/Cross-Account-Role-B"
            ],
            "Sid": "AllowSTSAssumerole"
          }
        ]
      }
      ```

------

1. 對於 Amazon S3 存取，請在將作業提交至 Amazon EMR on EKS 時，設定下列 `spark-submit` 參數 (`spark conf`)。
**注意**  
依預設，EMRFS 會使用作業執行角色從作業中存取 S3 儲存貯體。但是，當 `customAWSCredentialsProvider` 設定為 `AssumeRoleAWSCredentialsProvider` 時，EMRFS 會使用您透過 `ASSUME_ROLE_CREDENTIALS_ROLE_ARN` 指定的對應角色而非 `Job-Execution-Role-A` 來進行 Amazon S3 存取。
   + `--conf spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider`
   + `--conf spark.kubernetes.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::{{AccountB}}:role/Cross-Account-Role-B \`
   + `--conf spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::{{AccountB}}:role/Cross-Account-Role-B \`
**注意**  
您必須在作業 Spark 組態中為執行程式和驅動程式 `env` 設定 `ASSUME_ROLE_CREDENTIALS_ROLE_ARN`。

   對於 DynamoDB 跨帳戶存取權，必須設定 `--conf spark.dynamodb.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider`。

1. 如下列範例所示，透過跨帳戶存取權執行 Amazon EMR on EKS 作業。

   ```
   aws emr-containers start-job-run \
   --virtual-cluster-id 123456 \
   --name myjob \
   --execution-role-arn execution-role-arn \
   --release-label emr-6.2.0-latest \
   --job-driver '{"sparkSubmitJobDriver": {"entryPoint": "entryPoint_location", "entryPointArguments": ["arguments_list"], "sparkSubmitParameters": "--class <main_class> --conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1 --conf spark.hadoop.fs.s3.customAWSCredentialsProvider=com.amazonaws.emr.AssumeRoleAWSCredentialsProvider --conf spark.kubernetes.driverEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::{{AccountB}}:role/Cross-Account-Role-B --conf spark.executorEnv.ASSUME_ROLE_CREDENTIALS_ROLE_ARN=arn:aws:iam::{{AccountB}}:role/Cross-Account-Role-B"}} ' \
   --configuration-overrides '{"applicationConfiguration": [{"classification": "spark-defaults", "properties": {"spark.driver.memory": "2G"}}], "monitoringConfiguration": {"cloudWatchMonitoringConfiguration": {"logGroupName": "log_group_name", "logStreamNamePrefix": "log_stream_prefix"}, "persistentAppUI":"ENABLED",  "s3MonitoringConfiguration": {"logUri": "s3://my_s3_log_location" }}}'
   ```