[新機能]Step Functionsでステートマシンのアップデートが可能になりました

2017.11.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

皆さんLambdaしていますか?

今回はStep Functionsでステートマシンのアップデートが可能になったので使ってみたいと思います。

アップデート内容

Step Functionsが新しくUpdateStateMachine APIをサポートしました。

これまでは、一度作成したステートマシンは内容を変更することができず、ターゲットのLambdaの変更やロジックの変更を行う場合には、ステートマシンをコピーして変更する必要がありました。

その際、ステートマシンのARNも変更されるため、ステートマシンをターゲットとしているシステム側も変更が必須でした。

このAPIのサポートにより、ステートマシンのコードやRoleを変更でき、ARNを変更せずにアップデートすることが可能になりました!

コンソールでの操作

今回は事前にステートマシンを用意しています。

ダッシュボードでは右上のボタンに「Edit」が追加されていることが確認できます。

また、ステートマシンの詳細画面でも「Edit state machine」が表示されました。こちらから変更してみます。

IAM Roleとコードを変更することができます。ここではState名とResultを変更し、合わせて開始するState名も変更しました。反映は右上の「Update」か、実行も伴う「Update and start execution」でできます。今回はついでに実行してみます。

「新しい実行」の画面に来ましたが、この段階で既にUpdateは完了しているようです。続けて実行します。

実行結果から、ステートマシンが更新されていることが確認できました。

なお、引き続き古い実行結果の履歴を確認することもできました。

AWSCLIでの操作

AWSCLIでも今回のアップデートに対応しています。

確認しているバージョンは以下のとおりです。

$ aws --version
aws-cli/1.11.187 Python/2.7.10 Darwin/16.7.0 botocore/1.7.45

ヘルプを見てみます。

$ aws stepfunctions update-state-machine help
...中略...
SYNOPSIS
            update-state-machine
          --state-machine-arn <value>
          [--definition <value>]
          [--role-arn <value>]
          [--cli-input-json <value>]
          [--generate-cli-skeleton <value>]

update-state-machineでは--state-machine-arnが必須パラメータになります。

変更するために、元のコード(definition)を取得します。

$ aws stepfunctions describe-state-machine --state-machine-arn arn:aws:states:ap-northeast-1:000000000000:stateMachine:update_test | jq -r ".definition"
$ cat definition.json
{
  "Comment": "A Hello World example of the Amazon States Language using a Pass state",
  "StartAt": "Updated",
  "States": {
    "Updated": {
      "Type": "Pass",
      "Result": "You can update states!",
      "End": true
    }
  }
}

取得した内容を更新し、update-state-machineで更新します。

# 現状のdefinitionの取得
$ aws stepfunctions describe-state-machine --state-machine-arn arn:aws:states:ap-northeast-1:000000000000:stateMachine:update_test | jq -r ".definition" > definition.json
$ vi definition.json
$ cat definition.json
{
  "Comment": "A Hello World example of the Amazon States Language using a Pass state",
  "StartAt": "Updated",
  "States": {
    "Updated": {
      "Type": "Pass",
      "Result": "You can update states!",
      "End": true
    }
  }
}

# definitionの変更
$ cp definition.json definition_update.json
$ vi definition_update.json
$ diff -u definition.json definition_update.json
--- definition.json	2017-11-16 11:54:08.000000000 +0900
+++ definition_update.json	2017-11-16 11:59:45.000000000 +0900
@@ -4,7 +4,7 @@
   "States": {
     "Updated": {
       "Type": "Pass",
-      "Result": "You can update states!",
+      "Result": "You can update states by AWSCLI!",
       "End": true
     }
   }

# アップデート
$ aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:ap-northeast-1:000000000000:stateMachine:update_test --definition file://definition_update.json
{
    "updateDate": 1510804243.433
}

# 実行
$ aws stepfunctions start-execution --state-machine-arn arn:aws:states:ap-northeast-1:000000000000:stateMachine:update_test
{
    "startDate": 1510804300.9,
    "executionArn": "arn:aws:states:ap-northeast-1:000000000000:execution:update_test:7607d910-b59a-46ee-b885-c7f227824249"
}

# 結果
$ aws stepfunctions describe-execution --execution-arn arn:aws:states:ap-northeast-1:000000000000:execution:update_test:7607d910-b59a-46ee-b885-c7f227824249
{
    "status": "SUCCEEDED",
    "startDate": 1510804300.9,
    "name": "7607d910-b59a-46ee-b885-c7f227824249",
    "executionArn": "arn:aws:states:ap-northeast-1:000000000000:execution:update_test:7607d910-b59a-46ee-b885-c7f227824249",
    "stateMachineArn": "arn:aws:states:ap-northeast-1:000000000000:stateMachine:update_test",
    "stopDate": 1510804300.959,
    "output": "\"You can update states by AWSCLI!\"",
    "input": "{}"
}

update-state-machineから更新でき、実行結果が更新されていることが確認できました。

おわりに

今回のアップデートにより、StepFunctionsでの開発が捗りそうです!

ぜひ活用していきましょう!