のべラボ.blog

謙虚に、臆せず、さぼらずにブログを書く

AWS Step Functions から Amazon ECS のタスクを実行する

今回は、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が 新しいロールを作成」とあるので良さそうです。

https://cdn-ak.f.st-hatena.com/images/fotolife/n/neob/20220626/20220626081703.png

しかし、実はそうではないのですが、敢えてこのまま続けます。

ステートマシンの作成を完了します。

その後、実行の開始 ボタンを選択して、ステートマシンを実行してみましょう。

ステートマシンの実行は失敗します!

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"
        }
    ]
}

ポリシーを追加したら、再度ステートマシンを実行してみて下さい。

今度は、うまく動きましたね。

https://cdn-ak.f.st-hatena.com/images/fotolife/n/neob/20220716/20220716210806.png

ECSのコンソールでも動作していることが確認できます。

https://cdn-ak.f.st-hatena.com/images/fotolife/n/neob/20220717/20220717084808.png

成功を確認したら、ECSのコンソールからタスクを停止して下さい。(コストを考慮しての停止です。)

AWS Step Functions の ECS のタスクを実行するステートマシンを作成すること自体は非常に簡単に行えますが、IAMロールについては自動作成に頼るよりも、あらかじめ必要なIAMロールを作成しておく方が良さそうですね!