Step Functions で Amazon EMR Serverless アプリケーションを作成および管理する - AWS Step Functions

Step Functions で Amazon EMR Serverless アプリケーションを作成および管理する

Step Functions を使用して EMR Serverless でアプリケーションを作成、開始、停止、削除する方法について説明します。このページでは、サポートされている API を一覧表示し、一般的なユースケースを実行するための Task 状態の例を示します。

Step Functions で AWS サービスと統合することについては、「 サービスとの統合」および「Step Functions でサービス API にパラメータを渡す」を参照してください。

最適化された EMR Serverless 統合の主な機能
  • 最適化された EMR Serverless サービス統合には、基になる EMR Serverless API をラップする API のカスタマイズされたセットがあります。このカスタマイズにより、最適化された EMR Serverless 統合は AWS SDK サービス統合とは大きく異なるものになります。

  • さらに、最適化された EMR Serverless 統合は ジョブの実行 (.sync) 統合パターンをサポートします。

  • タスクトークンのコールバックまで待機する 統合パターンはサポートされていません

EMR Serverless サービス統合 API

AWS Step Functions を EMR Serverless と統合するために、以下の 6 つの EMR Serverless サービス統合 API を使用できます。これらのサービス統合 API は、対応する EMR Serverless API に似ていますが、渡されるフィールドと返される応答にいくつかの違いがあります。

各 EMR Serverless サービス統合 API と対応する EMR Serverless API の違いを次の表に示します。

EMR Serverless サービス統合 API 対応する EMR Serverless API 差異

createApplication

アプリケーションを作成します。

EMR Serverless はサービスリンクロールとして知られる IAM ロールの一意のタイプにリンクされています。createApplicationcreateApplication.sync が機能するには、サービスリンクロール AWSServiceRoleForAmazonEMRServerless を作成するために必要なアクセス許可が設定されている必要があります。IAM アクセス許可ポリシーに追加できるステートメントなど、詳細については、「EMR Serverless のサービスにリンクされたロールの使用」を参照してください。

CreateApplication なし

createApplication.sync

アプリケーションを作成します。

CreateApplication

EMR Serverless API と EMR Serverless サービス統合 API のリクエストとレスポンスには違いはありません。ただし、createApplication.sync はアプリケーションが CREATED 状態に達するまで待機します。

startApplication

指定されたアプリケーションを起動し、設定されている場合はアプリケーションの初期容量を初期化します。

StartApplication

EMR Serverless API レスポンスにはデータは含まれませんが、EMR Serverless サービス統合 API レスポンスには以下のデータが含まれます。

{ "ApplicationId": "string" }

startApplication.sync

指定されたアプリケーションを起動し、設定されている場合は初期容量を初期化します。

StartApplication

EMR Serverless API レスポンスにはデータは含まれませんが、EMR Serverless サービス統合 API レスポンスには以下のデータが含まれます。

{ "ApplicationId": "string" }

また、startApplication.sync はアプリケーションが STARTED 状態に達するまで待機します。

stopApplication

指定されたアプリケーションを停止し、設定されている場合は初期容量を解放します。アプリケーションを停止する前に、スケジュールされたジョブと実行中のジョブをすべて完了またはキャンセルする必要があります。

StopApplication

EMR Serverless API レスポンスにはデータは含まれませんが、EMR Serverless サービス統合 API レスポンスには以下のデータが含まれます。

{ "ApplicationId": "string" }

stopApplication.sync

指定されたアプリケーションを停止し、設定されている場合は初期容量を解放します。アプリケーションを停止する前に、スケジュールされたジョブと実行中のジョブをすべて完了またはキャンセルする必要があります。

StopApplication

EMR Serverless API レスポンスにはデータは含まれませんが、EMR Serverless サービス統合 API レスポンスには以下のデータが含まれます。

{ "ApplicationId": "string" }

また、stopApplication.sync はアプリケーションが STOPPED 状態に達するまで待機します。

DeleteApplication

アプリケーションを削除します アプリケーションを削除するには、そのアプリケーションが STOPPED または CREATED 状態になっている必要があります。

DeleteApplication

EMR Serverless API レスポンスにはデータは含まれませんが、EMR Serverless サービス統合 API レスポンスには以下のデータが含まれます。

{ "ApplicationId": "string" }

deleteApplication.sync

アプリケーションを削除します アプリケーションを削除するには、そのアプリケーションが STOPPED または CREATED 状態になっている必要があります。

DeleteApplication

EMR Serverless API レスポンスにはデータは含まれませんが、EMR Serverless サービス統合 API レスポンスには以下のデータが含まれます。

{ "ApplicationId": "string" }

また、stopApplication.sync はアプリケーションが TERMINATED 状態に達するまで待機します。

startJobRun

ジョブ実行を開始します。

StartJobRun なし

startJobRun.sync

ジョブ実行を開始します。

StartJobRun

EMR Serverless API と EMR Serverless サービス統合 API のリクエストとレスポンスには違いはありません。ただし、startJobRun.sync はアプリケーションが SUCCESS 状態に達するまで待機します。

cancelJobRun

ジョブ実行をキャンセルします。

CancelJobRun なし

cancelJobRun.sync

ジョブ実行をキャンセルします。

CancelJobRun

EMR Serverless API と EMR Serverless サービス統合 API のリクエストとレスポンスには違いはありません。ただし、cancelJobRun.sync はアプリケーションが CANCELLED 状態に達するまで待機します。

EMR サーバーレス統合のユースケース

最適化された EMR Serverless サービス統合では、アプリケーションを 1 つ作成して、そのアプリケーションを使用して複数のジョブを実行することをお勧めします。例えば、1 つのステートマシンに、同じアプリケーションを使用する複数の startJobRun リクエストを含めることができます。以下の Task ワークフロー状態 状態の例は、API EMR Serverless を Step Functions と統合するユースケースを示しています。EMR Serverless のその他のユースケースの情報については、「Amazon EMR Serverless とは」を参照してください。

ヒント

EMR Serverless と統合して複数のジョブを実行するステートマシンの例を AWS アカウント にデプロイするには、「EMR Serverless ジョブを実行する」を参照してください。

他の AWS のサービスで Step Functions を使用して IAM アクセス許可を設定する方法については、「Step Functions が統合サービスの IAM ポリシーを生成する方法」を参照してください。

以下のユースケースの例で斜体で示されているテキストを、リソース固有の情報に置き換えてください。例えば、yourApplicationId を EMR Serverless アプリケーションの ID (00yv7iv71inak893 など) に置き換えてください。

アプリケーションの作成

次のタスクステートの例では、createApplication.sync サービス統合 API を使用してアプリケーションを作成しています。

"Create_Application": { "Type": "Task", "Resource": "arn:aws:states:::emr-serverless:createApplication.sync", "Parameters": { "Name": "MyApplication", "ReleaseLabel": "emr-6.9.0", "Type": "SPARK" }, "End": true }

アプリケーションの起動

次のタスク状態の例では、startApplication.sync サービス統合 API を使用してアプリケーションを起動します。

"Start_Application": { "Type": "Task", "Resource": "arn:aws:states:::emr-serverless:startApplication.sync", "Parameters": { "ApplicationId": "yourApplicationId" }, "End": true }

アプリケーションの停止

次のタスク状態の例では、stopApplication.sync サービス統合 API を使用してアプリケーションを停止します。

"Stop_Application": { "Type": "Task", "Resource": "arn:aws:states:::emr-serverless:stopApplication.sync", "Parameters": { "ApplicationId": "yourApplicationId" }, "End": true }

アプリケーションの削除

次のタスク状態の例では、deleteApplication.sync サービス統合 API を使用してアプリケーションを削除します。

"Delete_Application": { "Type": "Task", "Resource": "arn:aws:states:::emr-serverless:deleteApplication.sync", "Parameters": { "ApplicationId": "yourApplicationId" }, "End": true }

アプリケーションでのジョブの開始

次のタスク状態の例では、startJobRun.sync サービス統合 API を使用してアプリケーションでジョブを開始します。

"Start_Job": { "Type": "Task", "Resource": "arn:aws:states:::emr-serverless:startJobRun.sync", "Parameters": { "ApplicationId": "yourApplicationId", "ExecutionRoleArn": "arn:aws:iam::123456789012:role/myEMRServerless-execution-role", "JobDriver": { "SparkSubmit": { "EntryPoint": "s3://<amzn-s3-demo-bucket>/sample.py", "EntryPointArguments": ["1"], "SparkSubmitParameters": "--conf spark.executor.cores=4 --conf spark.executor.memory=4g --conf spark.driver.cores=2 --conf spark.driver.memory=4g --conf spark.executor.instances=1" } } }, "End": true }

アプリケーションでのジョブのキャンセル

次のタスク状態の例では、cancelJobRun.sync サービス統合 API を使用してアプリケーション内のジョブをキャンセルします。

"Cancel_Job": { "Type": "Task", "Resource": "arn:aws:states:::emr-serverless:cancelJobRun.sync", "Parameters": { "ApplicationId.$": "$.ApplicationId", "JobRunId.$": "$.JobRunId" }, "End": true }

Amazon EMR Serverless を呼び出すための IAM ポリシー

コンソールを使用してステートマシンを作成すると、必要な最小特権を持つステートマシンの実行ロールがStep Functions によって自動的に作成されます。自動生成されたこれらの IAM ロールは、ステートマシンを作成する AWS リージョン で有効です。

以下のテンプレート例では、ステートマシンの定義におけるリソースに基づき、AWS Step Functions による IAM ポリシーの生成方法を示しています。詳細については、Step Functions が統合サービスの IAM ポリシーを生成する方法およびStep Functions でサービス統合パターンを検出するを参照してください。

IAM ポリシーを作成するときは、ポリシーにワイルドカードを含めないことをお勧めします。セキュリティのベストプラクティスとして、ポリシーの範囲をできるだけ絞り込む必要があります。動的ポリシーは、ランタイム中に特定の入力パラメータが不明な場合にのみ使用してください。

さらに、管理者ユーザーが非管理者ユーザーに、ステートマシンを実行するための実行ロールを付与する場合には注意が必要です。自分でポリシーを作成する場合は、実行ロールに PassRole ポリシーを含めることをお勧めします。また、実行ロールには aws:SourceARN および aws:SourceAccount のコンテキストキーを追加することをお勧めします。

EMR Serverless と Step Functions の統合の場合の IAM ポリシーの例

CreateApplication の IAM ポリシーの例

以下は、CreateApplication が Task ワークフロー状態 状態でのステートマシンの IAM ポリシーの例です。

注記

アカウントで初めてアプリケーションを作成するときには、IAM ポリシーで CreateServiceLinkedRole 許可を指定する必要があります。それ以降、この許可を追加する必要はありません。CreateServiceLinkedRole の詳細については、https://docs.aws.amazon.com/IAM/latest/APIReference/ の「CreateServiceLinkedRole」を参照してください。

以下のポリシーは、静的リソースと動的リソースで同じです。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:CreateApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/*" ] }, { "Effect": "Allow", "Action": [ "emr-serverless:GetApplication", "emr-serverless:DeleteApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessApplicationRule" ] }, { "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "arn:aws:iam::{{accountId}}:role/aws-service-role/ops.emr-serverless.amazonaws.com/AWSServiceRoleForAmazonEMRServerless*", "Condition": { "StringLike": { "iam:AWSServiceName": "ops.emr-serverless.amazonaws.com" } } } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:CreateApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/*" ] }, { "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "arn:aws:iam::{{accountId}}:role/aws-service-role/ops.emr-serverless.amazonaws.com/AWSServiceRoleForAmazonEMRServerless*", "Condition": { "StringLike": { "iam:AWSServiceName": "ops.emr-serverless.amazonaws.com" } } } ] }

StartApplication の IAM ポリシーの例

静的リソース

以下は、StartApplication が Task ワークフロー状態 状態で、ステートマシンを使用する場合の静的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StartApplication", "emr-serverless:GetApplication", "emr-serverless:StopApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessApplicationRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StartApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]" ] } ] }
動的リソース

以下は、StartApplication がTask ワークフロー状態 状態で、ステートマシンを使用する場合の動的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StartApplication", "emr-serverless:GetApplication", "emr-serverless:StopApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessApplicationRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StartApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] } ] }

StopApplication の IAM ポリシーの例

静的リソース

以下は、StopApplication が Task ワークフロー状態 状態で、ステートマシンを使用する場合の静的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StopApplication", "emr-serverless:GetApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessApplicationRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StopApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]" ] } ] }
動的リソース

以下は、StopApplication が Task ワークフロー状態 状態で、ステートマシンを使用する場合の動的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StopApplication", "emr-serverless:GetApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessApplicationRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StopApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] } ] }

DeleteApplication の IAM ポリシーの例

静的リソース

以下は、DeleteApplication が Task ワークフロー状態 状態で、ステートマシンを使用する場合の静的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:DeleteApplication", "emr-serverless:GetApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessApplicationRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:DeleteApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]" ] } ] }
動的リソース

以下は、DeleteApplication が Task ワークフロー状態 状態でステートマシンを使用する場合の動的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:DeleteApplication", "emr-serverless:GetApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessApplicationRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:DeleteApplication" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] } ] }

StartJobRun の IAM ポリシーの例

静的リソース

以下は、StartJobRun が Task ワークフロー状態 状態で、ステートマシンを使用する場合の静的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StartJobRun" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]" ] }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "[[jobExecutionRoleArn]]" ], "Condition": { "StringEquals": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "emr-serverless:GetJobRun", "emr-serverless:CancelJobRun" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]/jobruns/*" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessJobRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StartJobRun" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]" ] }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "[[jobExecutionRoleArn]]" ], "Condition": { "StringEquals": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } } ] }
動的リソース

以下は、StartJobRun がTask ワークフロー状態 状態で、ステートマシンを使用する場合の動的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StartJobRun", "emr-serverless:GetJobRun", "emr-serverless:CancelJobRun" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "[[jobExecutionRoleArn]]" ], "Condition": { "StringEquals": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessJobRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:StartJobRun" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "[[jobExecutionRoleArn]]" ], "Condition": { "StringEquals": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } } ] }

CancelJobRun の IAM ポリシーの例

静的リソース

以下は、CancelJobRun が Task ワークフロー状態 状態で、ステートマシンを使用する場合の静的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:CancelJobRun", "emr-serverless:GetJobRun" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]/jobruns/[[jobRunId]]" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessJobRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:CancelJobRun" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/[[applicationId]]/jobruns/[[jobRunId]]" ] } ] }
動的リソース

以下は、CancelJobRun が Task ワークフロー状態 状態で、ステートマシンを使用する場合の動的リソースの IAM ポリシーの例です。

Run a Job (.sync)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:CancelJobRun", "emr-serverless:GetJobRun" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] }, { "Effect": "Allow", "Action": [ "events:PutTargets", "events:PutRule", "events:DescribeRule" ], "Resource": [ "arn:aws:events:{{region}}:{{accountId}}:rule/StepFunctionsGetEventsForEMRServerlessJobRule" ] } ] }
Request Response
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "emr-serverless:CancelJobRun" ], "Resource": [ "arn:aws:emr-serverless:{{region}}:{{accountId}}:/applications/*" ] } ] }