

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 のクロスアカウントアクセスを設定するには、2 つの AWS アカウントにサインインしながらタスクを完了します。
+ **`AccountA`** – これは、Amazon EMR Serverless アプリケーションを作成した AWS アカウントです。クロスアカウントアクセスを設定する前に、このアカウントで以下の準備をします。
  + ジョブを実行する Amazon EMR Serverless アプリケーション。
  + アプリケーションでジョブを実行するために必要な許可を持つジョブ実行ロール。詳細については、[Amazon EMR Serverless のジョブランタイムロール](security-iam-runtime-role.md) を参照してください。
+ **`AccountB`** – これは、Amazon EMR Serverless ジョブがアクセスする S3 バケットを含む AWS アカウントです。

## 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 のクロスアカウントアクセスを設定するもう 1 つの方法は、 AWS Security Token Service (AWS STS) の `AssumeRole`アクションを使用することです。 AWS STS は、ユーザーの権限が制限された一時的な認証情報をリクエストできるグローバルウェブサービスです。`AssumeRole` で作成した一時的なセキュリティ認証情報を使用して、EMR Serverless と Amazon S3 に API コールを行うことができます。

次の手順は、引き受けたロールを使用して EMR Serverless からクロスアカウント S3 データにアクセスする方法を示しています。

1. Amazon S3 バケット (*クロスアカウントバケット*) を `AccountB` に作成します。詳細については、「*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. *クロスアカウントバケット*にアクセスできる `Cross-Account-Role-B` IAM ロールを `AccountB` に作成します。

   1. にサインイン AWS マネジメントコンソール し、[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. 以下のポリシーステートメントに示すように、*クロスアカウントバケット*の S3 バケットにアクセスするための `Cross-Account-Role-B` の許可を指定する IAM ポリシーを作成します。IAM ポリシーを `Cross-Account-Role-B` にアタッチします。詳細については、「*IAM ユーザーガイド*」の「[IIAM ポリシーを作成する](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 アクセスが必要な場合は、クロスアカウントの DynamoDB テーブルにアクセスするための許可を指定する IAM ポリシーを作成します。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. 次のポリシードキュメントを追加します。これにより、`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. を引き受けるアクセス`AssumeRole`許可を `Job-Execution-Role-A`に付与`AccountA`します AWS STS `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>

1 つの引き受けたロールを使用して、アカウント内のすべての S3 リソースにアクセスします。また、Amazon EMR 6.11 以降では、別々のクロスアカウント S3 バケットにアクセスするときに引き受けるための複数の IAM ロールを設定します。

**Topics**
+ [1 つの引き受けたロールを使用して S3 リソースにアクセスする](#jobs-s3-access-how-to-assumed-role-single)
+ [複数の引き受けたロールを使用して S3 リソースにアクセスする](#jobs-s3-access-how-to-assumed-role-multiple)

### 1 つの引き受けたロールを使用して S3 リソースにアクセスする
<a name="jobs-s3-access-how-to-assumed-role-single"></a>

**注記**  
1 つの引き受けたロールを使用するようにジョブを設定すると、ジョブ全体のすべての S3 リソースが `entryPoint` スクリプトを含むそのロールを使用します。

1 つの引き受けたロールを使用してアカウント 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"
            }
        }]
    }'
```

------