

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

# Amazon EMR ステップのランタイムロール
<a name="emr-steps-runtime-roles"></a>

*ランタイムロール*は、Amazon EMR クラスターにジョブまたはクエリを送信するときに指定できる AWS Identity and Access Management (IAM) ロールです。Amazon EMR クラスターに送信するジョブまたはクエリは、ランタイムロールを使用して Amazon S3 のオブジェクトなどの AWS リソースにアクセスします。Amazon EMR では、Spark ジョブと Hive ジョブ用のランタイムロールを指定できます。

 Amazon SageMaker AI で Amazon EMR クラスターに接続するとき、および Amazon EMR Studio ワークスペースを EMR クラスターにアタッチするときに、ランタイムロールを指定することもできます。詳細については、「[onnect to an Amazon EMR cluster from SageMaker AI Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/connect-emr-clusters.html)」および「[ランタイムロールを使用して EMR Studio Workspace を実行する](emr-studio-runtime.md)」を参照してください。

以前は、Amazon EMR クラスターは、クラスターの起動に使用したインスタンスプロファイルにアタッチされた IAM ポリシーに基づくアクセス許可で、Amazon EMR ジョブまたはクエリを実行していました。つまり、ポリシーには、Amazon EMR クラスターで実行されるすべてのジョブとクエリに対するすべてのアクセス許可の統合を含める必要がありました。ランタイムロールを使用すると、クラスターの Amazon EMR インスタンスプロファイルを共有する代わりに、各ジョブまたはクエリのアクセスコントロールを個別に管理できるようになりました。

ランタイムロールを持つ Amazon EMR クラスターでは、データレイクに対する Spark、Hive、Presto ジョブとクエリに、 AWS Lake Formation ベースのアクセスコントロールを適用することもできます。と統合する方法の詳細については AWS Lake Formation、「」を参照してください[Amazon EMR を と統合する AWS Lake Formation](emr-lake-formation.md)。

**注記**  
Amazon EMR ステップのランタイムロールを指定すると、送信するジョブまたはクエリは、ランタイムロールにアタッチされたポリシーで許可されている AWS リソースにのみアクセスできます。これらのジョブやクエリは、クラスターの EC2 インスタンス上のインスタンスメタデータサービスにアクセスしたり、クラスターの EC2 インスタンスプロファイルを使用して AWS リソースにアクセスしたりすることはできません。

## ランタイムロールで Amazon EMR クラスターを起動するための前提条件
<a name="emr-steps-runtime-roles-configure"></a>

**Topics**
+ [ステップ 1: Amazon EMR でセキュリティ設定を設定する](#configure-security)
+ [ステップ 2: Amazon EMR クラスターの EC2 インスタンスプロファイルを設定する](#configure-ec2-profile)
+ [ステップ 3: 信頼ポリシーを設定する](#configure-trust-policy)

### ステップ 1: Amazon EMR でセキュリティ設定を設定する
<a name="configure-security"></a>

次の JSON 構造を使用して、 AWS Command Line Interface (AWS CLI) でセキュリティ設定を作成し、 `EnableApplicationScopedIAMRole`を に設定します`true`。セキュリティ設定の詳細については、「[セキュリティ設定を使用して Amazon EMR クラスターセキュリティをセットアップする](emr-security-configurations.md)」を参照してください。

```
{
    "AuthorizationConfiguration":{
        "IAMConfiguration":{
            "EnableApplicationScopedIAMRole":true
        }
    }
}
```

インターネット経由で転送されるデータがプレーンテキストではなく暗号化されるように、セキュリティ設定では転送時の暗号化オプションを常に有効にすることが推奨されます。SageMaker Runtime Studio または EMR Studio からランタイムロールを使用して Amazon EMR クラスターに接続しない場合は、これらのオプションをスキップできます。データ暗号化を設定するには、「[データ暗号化の設定](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-create-security-configuration.html#emr-security-configuration-encryption)」を参照してください。

または、[AWS マネジメントコンソール](https://console.aws.amazon.com/emr/home#/securityConfigs)を使用して、カスタム設定でセキュリティ設定を作成することもできます。

### ステップ 2: Amazon EMR クラスターの EC2 インスタンスプロファイルを設定する
<a name="configure-ec2-profile"></a>

Amazon EMR クラスターは、Amazon EC2 インスタンスプロファイルロールを使用してランタイムロールを引き受けます。Amazon EMR ステップでランタイムロールを使用するには、インスタンスプロファイルロールとして使用する予定の IAM ロールに次のポリシーを追加します。IAM ロールにポリシーを追加する、または既存のインラインポリシーや管理ポリシーを編集するには、「[IAM ID のアクセス許可の追加および削除](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)」を参照してください。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowRuntimeRoleUsage",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Resource": [
        "arn:aws:iam::123456789012:role/EMRRuntimeRole"
      ]
    }
  ]
}
```

------

### ステップ 3: 信頼ポリシーを設定する
<a name="configure-trust-policy"></a>

ランタイムロールとして使用する予定の各 IAM ロールについて、以下の信頼ポリシーを設定します。`EMR_EC2_DefaultRole` は、ご使用のインスタンスプロファイルロールに置き換えてください。IAM ロールの信頼ポリシーを変更するには、「[ロールの信頼ポリシーの変更](https://docs.aws.amazon.com//IAM/latest/UserGuide/roles-managingrole-editing-console.html)」を参照してください。

```
{
    "Sid":"AllowAssumeRole",
    "Effect":"Allow",
    "Principal":{
        "AWS":"arn:aws:iam::<AWS_ACCOUNT_ID>:role/EMR_EC2_DefaultRole"
    },
    "Action":[
             "sts:AssumeRole",
             "sts:TagSession"
            ]
}
```

## ロールベースのアクセスコントロールで Amazon EMR クラスターを起動する
<a name="emr-steps-runtime-roles-launch"></a>

設定が完了したら、「[ステップ 1: Amazon EMR でセキュリティ設定を設定する](#configure-security)」のセキュリティ設定を使用して Amazon EMR クラスターを起動できます。Amazon EMR ステップでランタイムロールを使用するには、リリースラベル `emr-6.7.0` 以降を使用し、クラスターアプリケーションとして Hive、Spark、またはその両方を選択します。CloudWatchAgent は、EMR 7.6 以上のランタイムロールクラスターでサポートされています。SageMaker AI Studio から接続するには、リリース `emr-6.9.0` 以降を使用し、クラスターアプリケーションとして Livy、Spark、Hive、または Presto を選択します。クラスターを起動する手順については、「[Amazon EMR クラスターのセキュリティ設定を指定する](emr-specify-security-configuration.md)」を参照してください。

### Amazon EMR ステップを使用して Spark ジョブを送信する
<a name="launch-spark"></a>

以下は、Apache Spark に含まれている HdfsTest サンプルの実行方法の例を示します。この API 呼び出しは、指定された Amazon EMR ランタイムロールが `S3_LOCATION` にアクセスできる場合にのみ成功します。

```
RUNTIME_ROLE_ARN=<runtime-role-arn>
S3_LOCATION=<s3-path>
REGION=<aws-region>
CLUSTER_ID=<cluster-id>

aws emr add-steps --cluster-id $CLUSTER_ID \
--steps '[{ "Name": "Spark Example", "ActionOnFailure": "CONTINUE", "Jar":"command-runner.jar","Args" : ["spark-example","HdfsTest", "$S3_LOCATION"] }]' \
--execution-role-arn $RUNTIME_ROLE_ARN \
--region $REGION
```

**注記**  
Amazon EMR クラスターへの SSH アクセスを無効にし、Amazon EMR `AddJobFlowSteps` API のみがクラスターにアクセスできるようにすることが推奨されます。

### Amazon EMR ステップを使用して Hive ジョブを送信する
<a name="launch-hive"></a>

次の例では、Apache Hive と Amazon EMR のステップを使用して、`QUERY_FILE.hql` ファイルを実行するジョブを送信します。このクエリは、指定されたランタイムロールがクエリファイルの Amazon S3 パスにアクセスできる場合にのみ成功します。

```
RUNTIME_ROLE_ARN=<runtime-role-arn>
REGION=<aws-region>
CLUSTER_ID=<cluster-id>

aws emr add-steps --cluster-id $CLUSTER_ID \
--steps '[{ "Name": "Run hive query using command-runner.jar - simple select","ActionOnFailure":"CONTINUE", "Jar": "command-runner.jar","Args" :["hive -
f","s3://DOC_EXAMPLE_BUCKET/QUERY_FILE.hql"] }]' \
--execution-role-arn $RUNTIME_ROLE_ARN \
--region $REGION
```

### SageMaker AI Studio ノートブックからランタイムロールを使用して Amazon EMR クラスターに接続する
<a name="sagemaker"></a>

SageMaker AI Studio から Amazon EMR クラスターで実行するクエリに Amazon EMR ランタイムロールを適用できます。これを行うには、次のステップを実行します。

1. 「[Launch Amazon SageMaker AI Studio]()」の手順に従って、SageMaker AI Studio を作成します。

1. SageMaker AI Studio UI で、サポートされているカーネルを使用してノートブックを開始します。例えば、PySpark カーネルを使用して SparkMagic イメージを開始します。

1. SageMaker AI Studio で Amazon EMR クラスターを選択し、**[接続]** を選択します。

1. ランタイムロールを選択し、**[接続]** を選択します。

これにより、選択した Amazon EMR ランタイムロールで Amazon EMR クラスターに接続するためのマジックコマンドを含む SageMaker AI ノートブックセルが作成されます。ノートブックセルでは、ランタイムロールと Lake Formation ベースのアクセスコントロールを使用して、クエリを入力および実行できます。より詳細な例については、「[Apply fine-grained data access controls with AWS Lake Formation and Amazon EMR from Amazon SageMaker AI Studio](https://aws.amazon.com/blogs/machine-learning/apply-fine-grained-data-access-controls-with-aws-lake-formation-and-amazon-emr-from-amazon-sagemaker-studio)」を参照してください。

### Amazon EMR ランタイムロールへのアクセスを制御する
<a name="role-access"></a>

条件キー `elasticmapreduce:ExecutionRoleArn` を使用して、ランタイムロールへのアクセスを制御できます。次のポリシーでは、IAM プリンシパルが `Caller` という名前の IAM ロール、または文字列 `CallerTeamRole` で始まる任意の IAM ロールをランタイムロールとして使用することを許可します。

**重要**  
次の例に示すように、`AddJobFlowSteps` または `GetClusterSessionCredentials` API を呼び出すためのアクセス権限を発信者に付与する場合は、`elasticmapreduce:ExecutionRoleArn` コンテキストキーに基づいて条件を作成する必要があります。

```
{
    "Sid":"AddStepsWithSpecificExecRoleArn",
    "Effect":"Allow",
    "Action":[
        "elasticmapreduce:AddJobFlowSteps"
    ],
    "Resource":"*",
    "Condition":{
        "StringEquals":{
            "elasticmapreduce:ExecutionRoleArn":[
                "arn:aws:iam::<AWS_ACCOUNT_ID>:role/Caller"
            ]
        },
        "StringLike":{
            "elasticmapreduce:ExecutionRoleArn":[
                "arn:aws:iam::<AWS_ACCOUNT_ID>:role/CallerTeamRole*"
            ]
        }
    }
}
```

### ランタイムロールと Amazon EMR クラスターの間に信頼を確立する
<a name="external-id"></a>

Amazon EMR は、ランタイムロール認可が有効になっている各セキュリティ設定に対して、一意の識別子 `ExternalId` を生成します。この認可により、すべてのユーザーが自分に属するクラスターで使用できる一連のランタイムロールを所有できるようになります。例えば、企業では、各部門がそれぞれの外部 ID を使用して、所有する一連のランタイムロールの信頼ポリシーを更新できます。

外部 ID は、次の例に示すように Amazon EMR の `DescribeSecurityConfiguration` API を使用して確認できます。

```
aws emr describe-security-configuration --name 'iamconfig-with-lf'{"Name": "iamconfig-with-lf",
    "SecurityConfiguration":
        "{\"AuthorizationConfiguration\":{\"IAMConfiguration\":{\"EnableApplicationScopedIAMRole\
        ":true,\"ApplicationScopedIAMRoleConfiguration\":{\"PropagateSourceIdentity\":true,\"Exter
        nalId\":\"FXH5TSACFDWUCDSR3YQE2O7ETPUSM4OBCGLYWODSCUZDNZ4Y\"}},\"Lake
        FormationConfiguration\":{\"AuthorizedSessionTagValue\":\"Amazon EMR\"}}}",
    "CreationDateTime": "2022-06-03T12:52:35.308000-07:00"
}
```

外部 ID の使用方法については、「 [AWS リソースへのアクセスを第三者に付与するときに外部 ID を使用する方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html)」を参照してください。

### 監査
<a name="audit-source-identity"></a>

IAM ロールを使用してエンドユーザーが実行するアクションをモニタリングおよび制御するには、ソース ID 機能を有効にします。ソース ID の詳細については、「[引き受けたロールで実行されるアクションのモニタリングと制御](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor)」を参照してください。

ソース ID を追跡するには、次のように、セキュリティ設定で `ApplicationScopedIAMRoleConfiguration/PropagateSourceIdentity` を `true` に設定します。

```
{
    "AuthorizationConfiguration":{
        "IAMConfiguration":{
            "EnableApplicationScopedIAMRole":true,
            "ApplicationScopedIAMRoleConfiguration":{
                "PropagateSourceIdentity":true
            }
        }
    }
}
```

`PropagateSourceIdentity` を `true` に設定すると、Amazon EMR は呼び出し側の認証情報からのソース ID を、ランタイムロールで作成したジョブまたはクエリのセッションに適用します。呼び出し側の認証情報にソース ID が存在しない場合、Amazon EMR はソース ID を設定しません。

このプロパティを使用するには、次のように、インスタンスプロファイルに `sts:SetSourceIdentity` アクセス許可を付与します。

```
{ // PropagateSourceIdentity statement
    "Sid":"PropagateSourceIdentity",
    "Effect":"Allow",
    "Action":"sts:SetSourceIdentity",
    "Resource":[
        <runtime-role-ARN>
    ],
    "Condition":{
        "StringEquals":{
            "sts:SourceIdentity":<source-identity>
        }
    }
}
```

また、`AllowSetSourceIdentity` ステートメントをランタイムロールの信頼ポリシーに追加する必要があります。

```
{ // AllowSetSourceIdentity statement
    "Sid":"AllowSetSourceIdentity",
    "Effect":"Allow",
    "Principal":{
        "AWS":"arn:aws:iam::<AWS_ACCOUNT_ID>:role/EMR_EC2_DefaultRole"
    },
    "Action":[
        "sts:SetSourceIdentity",
        "sts:AssumeRole"
    ],
    "Condition":{
        "StringEquals":{
            "sts:SourceIdentity":<source-identity>
        }
    }
}
```

## その他の考慮事項
<a name="emr-steps-runtime-roles-considerations"></a>

**注記**  
Amazon EMR リリース `emr-6.9.0` では、SageMaker AI Studio から Amazon EMR クラスターに接続する際に断続的な障害が発生することがあります。この問題に対処するには、クラスターの起動時にブートストラップアクションを使用してパッチをインストールします。パッチの詳細については、「[Amazon EMR release 6.9.0 known issues](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-690-release.html#emr-690-relnotes)」を参照してください。

さらに、Amazon EMR のランタイムロールを設定する際には、次の点を考慮してください。
+ Amazon EMR は、すべての商用 AWS リージョンでランタイムロールをサポートしています。
+ Amazon EMR ステップでは、リリース `emr-6.7.0` 以降を使用する場合、ランタイムロールを使用した Apache Spark および Apache Hive のジョブをサポートします。
+ SageMaker AI Studio では、リリース `emr-6.9.0` 以降を使用する場合、ランタイムロールを使用した Spark、Hive、および Presto のクエリをサポートします。
+ SageMaker AI の以下のノートブックカーネルでは、ランタイムロールをサポートします。
  + DataScience – Python 3 カーネル
  + DataScience 2.0 – Python 3 カーネル
  + DataScience 3.0 – Python 3 カーネル
  + SparkAnalytics 1.0 – SparkMagic および PySpark カーネル
  + SparkAnalytics 2.0 – SparkMagic および PySpark カーネル
  + SparkMagic – PySpark カーネル
+ Amazon EMR では、クラスター作成時にのみ `RunJobFlow` を使用するステップをサポートします。この API はランタイムロールをサポートしていません。
+ Amazon EMR では、高可用性用に設定したクラスターでのランタイムロールをサポートしていません。
+ Amazon EMR リリース 7.5.0 以降、ランタイムロールは、Spark Live UIs、Spark History Server、YARN NodeManager、YARN ResourceManager などの Spark および YARN ユーザーインターフェイス (UI) の表示をサポートしています。これらの UI に移動することにより、ユーザー名とパスワードプロンプトが表示されます。ユーザー名とパスワードは、EMR GetClusterSessionCredentials API を使用して生成できます。API の使用の詳細については、「[GetClusterSessionCredentials](https://docs.aws.amazon.com/emr/latest/APIReference/API_GetClusterSessionCredentials.html)」を参照してください。

  EMR GetClusterSessionCredentials API の使用方法の例を以下に示します:

  ```
  aws emr  get-cluster-session-credentials --cluster-id <cluster_ID> --execution-role-arn <IAM_role_arn>
  ```
+ `command-runner.jar` JAR ファイルでコマンドを実行するときは、Bash コマンド引数をエスケープする必要があります。

  ```
  aws emr add-steps --cluster-id <cluster-id> --steps '[{"Name":"sample-step","ActionOnFailure":"CONTINUE","Jar":"command-runner.jar","Properties":"","Args":["bash","-c","\"aws s3 ls\""],"Type":"CUSTOM_JAR"}]' --execution-role-arn <IAM_ROLE_ARN>
  ```

  加えて、スクリプトランナーでコマンドを実行するときは、Bash コマンド引数をエスケープする必要があります。以下は、エスケープ文字を含む Spark プロパティの設定を示すサンプルです:

  ```
  "\"--conf spark.sql.autoBroadcastJoinThreshold=-1\""
  ```
+ ランタイムロールは、HDFS や HMS などのクラスター上のリソースへのアクセスの制御をサポートしていません。
+ ランタイムロールは docker/container をサポートしていません。