Amazon EMR ステップのランタイムロール - Amazon EMR

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

Amazon EMR ステップのランタイムロール

ランタイムロールは、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 クラスターにアタッチするときに、ランタイムロールを指定することもできます。詳細については、SageMaker AI Studio から Amazon EMR クラスターに接続する」および「」を参照してくださいランタイムロールを使用して EMR Studio Workspace を実行する

以前は、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

注記

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

ランタイムロールで Amazon EMR クラスターを起動するための前提条件

ステップ 1: Amazon EMR でセキュリティ設定を設定する

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

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

インターネット経由で転送されるデータがプレーンテキストではなく暗号化されるように、セキュリティ設定では転送時の暗号化オプションを常に有効にすることが推奨されます。SageMaker Runtime Studio または EMR Studio からランタイムロールを使用して Amazon EMR クラスターに接続しない場合は、これらのオプションをスキップできます。データ暗号化を設定するには、「データ暗号化の設定」を参照してください。

または、AWS Management Consoleを使用して、カスタム設定でセキュリティ設定を作成することもできます。

ステップ 2: Amazon EMR クラスターの EC2 インスタンスプロファイルを設定する

Amazon EMR クラスターは、Amazon EC2 インスタンスプロファイルロールを使用してランタイムロールを引き受けます。Amazon EMR ステップでランタイムロールを使用するには、インスタンスプロファイルロールとして使用する予定の IAM ロールに次のポリシーを追加します。IAM ロールにポリシーを追加する、または既存のインラインポリシーや管理ポリシーを編集するには、「IAM ID のアクセス許可の追加および削除」を参照してください。

JSON
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowRuntimeRoleUsage", "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:TagSession" ], "Resource": [ "runtime-role-ARN" ] } ] }

ステップ 3: 信頼ポリシーを設定する

ランタイムロールとして使用する予定の各 IAM ロールについて、以下の信頼ポリシーを設定します。EMR_EC2_DefaultRole は、ご使用のインスタンスプロファイルロールに置き換えてください。IAM ロールの信頼ポリシーを変更するには、「ロールの信頼ポリシーの変更」を参照してください。

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

ロールベースのアクセスコントロールで Amazon EMR クラスターを起動する

設定が完了したら、「ステップ 1: Amazon EMR でセキュリティ設定を設定する」のセキュリティ設定を使用して 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 クラスターのセキュリティ設定を指定する」を参照してください。

Amazon EMR ステップを使用して Spark ジョブを送信する

以下は、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","HadoopJarStep": { "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 ジョブを送信する

次の例では、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","HadoopJarStep": { "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 クラスターに接続する

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

  1. Amazon SageMaker AI Studio を起動する」の手順に従って SageMaker AI Studio を作成します。

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

  3. SageMaker AI Studio で Amazon EMR クラスターを選択し、Connect を選択します。

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

これにより、選択した 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」を参照してください。

Amazon EMR ランタイムロールへのアクセスを制御する

条件キー 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 クラスターの間に信頼を確立する

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 を使用する方法」を参照してください。

監査

IAM ロールを使用してエンドユーザーが実行するアクションをモニタリングおよび制御するには、ソース ID 機能を有効にします。ソース ID の詳細については、「引き受けたロールで実行されるアクションのモニタリングと制御」を参照してください。

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

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

PropagateSourceIdentitytrue に設定すると、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> } } }

追加の考慮事項

注記

Amazon EMR リリース ではemr-6.9.0、SageMaker AI Studio から Amazon EMR クラスターに接続すると、断続的な障害が発生する可能性があります。この問題に対処するには、クラスターの起動時にブートストラップアクションを使用してパッチをインストールします。パッチの詳細については、「Amazon EMR release 6.9.0 known issues」を参照してください。

さらに、Amazon EMR のランタイムロールを設定する際には、次の点を考慮してください。

  • Amazon EMR は、すべての商用 AWS リージョンでランタイムロールをサポートしています。

  • Amazon EMR ステップでは、リリース emr-6.7.0 以降を使用する場合、ランタイムロールを使用した Apache Spark および Apache Hive のジョブをサポートします。

  • リリース emr-6.9.0以降を使用する場合、SageMaker AI Studio はランタイムロールを持つ 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) の表示をサポートしています。これらの UIs に移動すると、ユーザー名とパスワードプロンプトが表示されます。ユーザー名とパスワードは、EMR GetClusterSessionCredentials API を使用して生成できます。API の使用の詳細については、GetClusterSessionCredentials」を参照してください。

    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\n--conf spark.cradle.RSv2Mode.enabled=true\""
  • ランタイムロールは、HDFS や HMS などのクラスター上のリソースへのアクセスの制御をサポートしていません。