Step Functions で ECS タスク(Fargate)を定期実行してみる

Step Functions を使えば ECS タスクの実行に失敗しても自動的にリトライできます
2022.03.25

アノテーション株式会社の hato です。

Step Functions を使って ECS タスク(Fargate)の実行失敗時にリトライを行う定期実行の仕組みを構築します。

ECS タスクの定期実行

ECS タスクを定期実行する方法として EventBridge ルールを使用した「スケジュールされたタスク」があります。

スケジュールされたタスク - Amazon Elastic Container Service

スケジュールされたタスクは、手軽に規則的な間隔やcron式を使用した柔軟なスケジュールを設定できますが、注意点としてタスクの実行が失敗してもリトライされません。 *1

タスクの実行に失敗した場合や、そもそもタスクの起動中にエラーが発生してしまった場合に、リトライを行いたい場合は Step Functions など別の方法を考える必要があります。

Step Functions のエラー処理では、リトライ回数に限らず、リトライを行うエラーや待機時間を柔軟に設定できます。

Step Functions の設定項目

  • ErrorEquals:リトライを行うエラー
  • IntervalSeconds:リトライ時の待機時間
  • MaxAttempts:リトライの最大回数
  • BackoffRate:リトライ間隔の増加乗数

参考:Step Functions のエラー処理 - AWS Step Functions

やってみた

構成図

事前準備として、ECS クラスターやタスク定義、サブネットは用意しておきます。
準備が完了したら、以下手順を進めてきます。

Step Functions コンソール を開き、「ステートマシンの作成」をクリックします。

「コードでワークロードを記述」を選択します。

定義(赤枠で囲った部分)に、次のコードを参考に ECS タスクを起動するフローを入力します。

{
    "Comment": "Example of executing an ECS task",
    "StartAt": "Run an ECS Task",
    "States": {
      "Run an ECS Task": {
        "Type": "Task",
        "Resource": "arn:aws:states:::ecs:runTask.sync",
        "Parameters": {
          "LaunchType": "FARGATE",
          "Cluster": "<クラスター ARN>",
          "TaskDefinition": "<タスク定義 ARN>:<リビジョン番号>",
          "NetworkConfiguration": {
            "AwsvpcConfiguration": {
              "Subnets": [
                "<サブネットID>"
              ],
              "SecurityGroups": [
                "<セキュリティグループID>"
              ],
              "AssignPublicIp": "ENABLED"
            }
          }
        },
        "Retry": [
          {
            "ErrorEquals": [
              "States.ALL"
            ],
            "IntervalSeconds": 1,
            "MaxAttempts": 2,
            "BackoffRate": 3
          }
        ],
        "End": true
      }
    }
  }

「次へ」をクリックします。

「ステートマシン名」に任意の名前を入力し、「ステートマシンの作成」を選択します。

「ステートマシンは正常に作成されました」と表示されたことを確認します。

EventBridge の作成

「アクション」から「EventBridge(CloudWatch イベント)ルールを作成」を選択します。

「名前」に任意の名前を入力し、「スケジュール」を選択します。「次へ」をクリックします。

実行間隔となるスケジュールパターンを入力し、「次へ」をクリックします。

「AWS のサービス」、「Step Functions ステートマシン」、作成したステートマシンの順に選択し、「次へ」をクリックします。

「次へ」をクリックします。

「ルールの作成」をクリックします。

「正常に作成しました」と表示されたことを確認します。

実際の挙動

EventBridgeで設定したタイミングになると、自動的にECSタスクが起動します。

タスクが正常に終了した場合、一度だけ実行されます。

タスクの実行時にエラーが発生した場合、Retryフィールドの設定に応じてリトライが実行されます。

参考資料

最後に

この記事が誰かのお役にたてば幸いです。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

脚注

  1. EventBridge ルールの再試行ポリシーはタスクの実行結果ではなく、RunTask APIの処理結果が対象