今回は、AWS Step Functions で Amazon ECS のタスクを実行するシンプルなステートマシンを作成していきます。
すでに Fargate で動作可能な ECS クラスターや ECS タスク定義、 ECS タスク実行ロール、VPCのサブネットやセキュリティグループは用意している前提です。
ステートマシンで ECS クラスターやタスク定義の ARN の指定が必要になるので、メモしておきます。次に挙げているのは例です。
ECS クラスターの ARN
arn:aws:ecs:ap-northeast-1:000000000000:cluster/test-cluster
ECS タスク定義の ARN
arn:aws:ecs:ap-northeast-1:000000000000:task-definition/python-web-hello:1
事前に ECS クラスターでタスクが実行できることを確認しておきましょう。
確認ができたら、AWS Step Functions のステートマシンを作成していきます。
今回は Workflow Builder を使用して、標準タイプのステートマシンを作成します。
この図で示している③の API パラメータ で、Cluster に ECS クラスターの ARN を、TaskDefinition に ECS タスク定義の ARN を指定するわけですが、実際は、それらの指定だけでは動作しません。
次の例に示すように、タスクを動作させる Fargate の配置先となる VPC サブネットや、セキュリティグループの ID も必要です。
それらを指定するための NetworkConfiguration 部分は Workflow Studio ではデフォルトで生成されないので注意しましょう。
{ "LaunchType": "FARGATE", "Cluster": "arn:aws:ecs:ap-northeast-1:000000000000:cluster/test-cluster", "TaskDefinition": "arn:aws:ecs:ap-northeast-1:000000000000:task-definition/python-web-hello:1", "NetworkConfiguration": { "AwsvpcConfiguration": { "AssignPublicIp": "DISABLED", "SecurityGroups": [ "sg-0c0abc379ab3abfab" ], "Subnets": [ "subnet-0abc000ab00ab0", "subnet-1abc011ab10ab2", ] } } }
API パラメータが入力出来たら、 次へ ボタンを 2回選択します。
アクセス許可 セクションでは、新しいロールの作成 を選びます。
これは、「ステートマシンの定義と詳細設定に基づいて、Step Fucntionsが 新しいロールを作成」とあるので良さそうです。
しかし、実はそうではないのですが、敢えてこのまま続けます。
ステートマシンの作成を完了します。
その後、実行の開始 ボタンを選択して、ステートマシンを実行してみましょう。
ステートマシンの実行は失敗します!
RunTaskのステートの例外の情報を見てみましょう。
エラー ECS.AccessDeniedException 原因 User: arn:aws:sts::000000000000:assumed-role/StepFunctions-MyStateMachine-role-e4865d7b/CPOWNuVYmrftNqvlpPKDpWuiEvWJfAsi is not authorized to perform: iam:PassRole on resource: arn:aws:iam::000000000000:role/ecsTaskExecutionRole because no identity-based policy allows the iam:PassRole action (Service: AmazonECS; Status Code: 400; Error Code: AccessDeniedException; Request ID: acbdd742-e0b2-4b53-937b-68be10c7c864; Proxy: null)
ECSのタスク実行ロールを passRole するポリシーが許可されていないことが原因ですね。
ステートマシン作成時に、自動的に新しいロールを作る設定の説明では「ステートマシンの定義と詳細設定に基づいて、Step Fucntionsが 新しいロールを作成」と記載されていたのですが、ECSのタスク実行ロールの passRole を許可するポリシーは、作成されるロールに設定してくれないのです。
そのため、このエラーメッセージで表示されている IAMロールに対して、次のポリシーを追加で許可しましょう。 (AWS アカウントID部分は、環境に合わせて変更して下さい。)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::000000000000:role/ecsTaskExecutionRole" } ] }
ポリシーを追加したら、再度ステートマシンを実行してみて下さい。
今度は、うまく動きましたね。
ECSのコンソールでも動作していることが確認できます。
成功を確認したら、ECSのコンソールからタスクを停止して下さい。(コストを考慮しての停止です。)
AWS Step Functions の ECS のタスクを実行するステートマシンを作成すること自体は非常に簡単に行えますが、IAMロールについては自動作成に頼るよりも、あらかじめ必要なIAMロールを作成しておく方が良さそうですね!