AWS Step Functionsのネストされたステートマシン実行は同期と非同期で必要な権限が異なる

こんにちは。サービスグループの武田です。AWS Step Functionsのネストされたステートマシンを呼び出す際にハマった状況とその対策を紹介します。
2021.10.25

こんにちは。サービスグループの武田です。

AWS Step Functionsのステートマシンでは、タスク状態から異なるステートマシンを呼び出すことができます。これを ステートマシンのネスト と呼んでいます。

さてネストされたステートマシンを呼び出す方法として同期非同期のオプションがあります。実は同期呼び出しの場合、追加の権限が必要となるのですが、そのことを知らなかったためハマりました。まずはその手順を再現してみます。

ハマった手順

呼び出されるサブステートマシンと、それを呼び出すメインステートマシンを定義していきます。また呼び出し方法として非同期呼び出しするステートマシンを作成します。

サブステートマシンの定義

呼び出されることになるステートマシンを作成します。名前はSubStateMachineとし、ウィザードにしたがってIAMロールも新しく作成します。ステートマシンは10秒待つだけのシンプルなものです。

作成できました。

メインステートマシンの定義

SubStateMachineを実行するステートマシンを作成します。名前はMainStateMachineとし、こちらもIAMロールは新しく作成します。

作成できました。

試しに実行してみると、問題なく完了します。

同期呼び出しするように変更

さてここまでの手順は問題ありません。問題となるのはこの次です。先ほど作成したMainStateMachineのステートマシン実行を同期呼び出しに変更してみます。

具体的にはResourceにsyncを追加します。

"Resource": "arn:aws:states:::states:startExecution",

"Resource": "arn:aws:states:::states:startExecution.sync",

変更できたら保存します。……が、できません!

原因と対策

先ほどのエラーですが、なぜエラーとなったのか原因が画面上からは分かりません。ドキュメントを読むなどして判明したのは、同期呼び出しをするためには非同期呼び出しの権限セットに、追加の権限が必要だということでした。詳細は参考リンクをご覧ください。

このエラーを出ないようにするためには2つの対策が考えられます。

  1. 新しいIAMロールを自動生成する
  2. 作成済みのロールに手動で権限を追加する

簡単なのは1で、ウィザード上でラジオボタンを変更して保存するだけです。

手動の場合は次の権限をStatementに追加します。[[region]][[accountId]]は自身の環境に合わせて変更してください。

{
    "Effect": "Allow",
    "Action": [
        "states:DescribeExecution",
        "states:StopExecution"
    ],
    "Resource": "*"
},
{
    "Effect": "Allow",
    "Action": [
        "events:PutTargets",
        "events:PutRule",
        "events:DescribeRule"
    ],
    "Resource": [
        "arn:aws:events:[[region]]:[[accountId]]:rule/StepFunctionsGetEventsForStepFunctionsExecutionRule"
    ]
}

まとめ

同期呼び出しをする場合には非同期呼び出しに追加の権限が必要でした。検証で試行錯誤する際に落とし穴となりそうですので覚えておくときっと役に立つでしょう。あとドキュメントはちゃんと読みましょうね。

参考リンク