0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ジョブネットを想定してAWS Step Functions の再実行パターンを試してみた(1)シンプル編

Posted at

AWS Step Functions で再実行ができるようになったので、ジョブネットのエラー対応をどれだけ実現できるか試してみます。まずはシンプルなステートマシンを使用して確認します。

想定するジョブネット

説明をわかりやすくするために、用語は以下の通りとします。

実行する処理をジョブと呼びます。ジョブはシェルスクリプトで実装されていて、EC2上で稼働する前提とします。そして、複数のジョブをつなげて実行する塊をジョブネットと呼びます。

本記事で想定するジョブネットは以下とします。

image.png

ジョブネット再実行のパターン

本記事では以下の基本的な3パターンの実装を試みてみます。結論としてパターン1とパターン3は Step Functions の再実行機能を用いて簡単に手動再実行できますが、パターン2はあらかじめステートマシンの定義を工夫して自動処理としておくなどの対応が必要です。

  1. 異常終了したジョブから再実行
  2. 異常終了したジョブの次から再実行
  3. 異常終了したジョブが含まれるジョブネット全体を再実行

image.png
image.png
image.png

実装の概要

aws-samples の amazon-stepfunctions-ssm-waitfortasktoken を利用した SfnRunCommandByInstanceIds を用いて Steps Functions に以下のようなステートマシンを定義しました。

image.png

{
  "Comment": "This is a test state machine by yki",
  "StartAt": "StartAutomationWaitForCallBack (Job 1)",
  "States": {
    "StartAutomationWaitForCallBack (Job 1)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ssm:startAutomationExecution.waitForTaskToken",
      "Parameters": {
        "DocumentName": "SfnRunCommandByInstanceIds",
        "Parameters": {
          "InstanceIds": [
            "i-xxxxxxxxxxxxxxxxxx"
          ],
          "taskToken.$": "States.Array($$.Task.Token)",
          "workingDirectory": [
            "/home/ec2-user/sample-batch/"
          ],
          "Commands": [
            "./do-some1.sh"
          ]
        }
      },
      "Next": "StartAutomationWaitForCallBack (Job 2)"
    },
    "StartAutomationWaitForCallBack (Job 2)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ssm:startAutomationExecution.waitForTaskToken",
      "Parameters": {
        "DocumentName": "SfnRunCommandByInstanceIds",
        "Parameters": {
          "InstanceIds": [
            "i-xxxxxxxxxxxxxxxxxx"
          ],
          "taskToken.$": "States.Array($$.Task.Token)",
          "workingDirectory": [
            "/home/ec2-user/sample-batch/"
          ],
          "Commands": [
            "./do-some2.sh"
          ]
        }
      },
      "Next": "StartAutomationWaitForCallBack (Job 3)"
    },
    "StartAutomationWaitForCallBack (Job 3)": {
      "Type": "Task",
      "Resource": "arn:aws:states:::aws-sdk:ssm:startAutomationExecution.waitForTaskToken",
      "Parameters": {
        "DocumentName": "SfnRunCommandByInstanceIds",
        "Parameters": {
          "InstanceIds": [
            "i-xxxxxxxxxxxxxxxxxx"
          ],
          "taskToken.$": "States.Array($$.Task.Token)",
          "workingDirectory": [
            "/home/ec2-user/sample-batch/"
          ],
          "Commands": [
            "./do-some3.sh"
          ]
        }
      },
      "End": true
    }
  }
}

エラーなく実行できることも確認しました。
image.png
image.png

なお、使用しているシェルは以下のように filetest2というファイルがあるとエラーを返すように実装しています。

#!/bin/bash
if [ $# -ne 0 ]; then
        echo "引数は$#個です" 1>&2
        echo "引数を指定してはいけません" 1>&2
        exit 1
fi
for i in {1..3} ; do
        echo "Doing Something #2" ${i}
        sleep 1
done
if [ -f ./filetest2 ]; then
        exit 1
fi
exit 0

パターン1:異常終了したジョブから再実行

これが今回できるようになったパターンですね。ジョブ2をエラーとするために touch /home/ec2-user/sample-batch/filetest2 でファイルを作ってから上記のステートマシンを実行します。

想定通りジョブ2がエラーとなりました。
image.png
image.png

ここでリカバリ対応としてrm /home/ec2-user/sample-batch/filetest2をしてから、ステートマシンに対してリドライブを指示します。リドライブはマネジメントコンソールの以下の画面から行います。

image.png
以下のような確認ダイアログが表示されます。確かにジョブ2から再実行と表示されています。
image.png
ちなみに、同じくマネジメントコンソールの以下の部分からもリドライブが可能です。
image.png

無事にジョブ2の再実行とジョブ3の実行が行われました。
image.png
image.png

パターン2:異常終了したジョブの次から再実行

前述の通り、リドライブをするとジョブ2も再実行されてしまうので事後対応はできません。 事前に Step functions のステートマシン定義にエラーをキャッチして次のアクションに進むように定義をしておく必要があります。
image.png
具体的にはジョブ2のアクションの「エラーをキャッチ」の設定で "Statues.TaskFailed" をキャッチして次のアクションであるジョブ3に進むよう定義しておきます。
image.png
image.png

この定義を行っておくと、ジョブ2がエラーとなる状態でステートマシンを実行しても、ステートマシン全体としては成功となりますが、ジョブ2のアクションは「キャッチされたエラー」として表示されます。
image.png
image.png

ただ、この設定をステートマシンにしてしまうとリドライブができません。現時点では実行したい処理のエラー対応要件によって使い分けるしかないかと思います。

パターン3:異常終了したジョブが含まれるジョブネット全体を再実行

これは以前から実現できていました。単純に新たにステートマシンを実行することとなります。先ほどと同じくジョブ2がエラー停止した状態とした上で、マネジメントコンソールの "Recovery"の "Start New Execution" から再度ステートマシン全体を実行可能です。
image.png

新たに実行を開始する画面が表示されるため「実行を開始」をクリックします。
image.png

なお、この方法だと「失敗」ステータスとなった実行は失敗のまま残ることとなります。
image.png

本記事では AWS Step Functions の再実行パターンをシンプルなステートマシンを用いて確認してみました。リドライブができることでこれまで以上に Step Functions の用途が広がることになると思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?