サーバーレスワークフローのスケジューリング

AWS Step Functions と Amazon CloudWatch を使用

AWS アカウント内のリソースについて、オペレーションに関係したイベントに対する応答を自動化することにより、AWS クラウドインフラストラクチャにおけるオペレーションのオーバーヘッドを軽減できることがあります。実際の例として、DevOps エンジニアや IT マネージャーは、パッチ管理ETL ジョブデータ同期セキュリティを自動化できます。

これを達成するために、時間ベースのスケジュールでサーバーレスワークフローを実行します。Amazon CloudWatch Events では、AWS リソースに関する変更と通知を記述したほぼリアルタイムのシステムイベントのストリームを配信します。このストリームから、特定のイベントを AWS Step Functions にルーティングし、ステートマシンを呼び出してさらに処理を実行できます。AWS Step Functions では、複数のサービスをサーバーレスのワークフローに整理できるため、自動化プロセスをすばやく構築し更新できます。

このチュートリアルでは、Step Functions を使用して CloudWatch イベントに応答するサーバーレスワークフローをスケジューリングします。最初に、AWS Step Functions を使用して非常にシンプルなステートマシンを作成します。次に、Amazon CloudWatch Events を使用して、1 分間隔でステートマシンを実行するルールを設定します。このチュートリアルでは時間ベースのスケジュールでワークフローを呼び出しますが、これを応用してイベントを生成する AWS の他のサービスと統合することもできます。

このチュートリアルでは、AWS Step FunctionsAmazon CloudWatch を使用します。どちらのサービスも AWS 無料利用枠に含まれています。

このチュートリアルには AWS アカウントが必要です

Step Functions と CloudWatch に対する追加料金は発生しません。このチュートリアルで作成するリソースは無料利用枠の対象です。 

無料利用枠の詳細 >>


ステップ 1:AWS Identity and Access Management (IAM) ロールを作成する

AWS Step Functions ではコードを実行し、他の AWS リソース (Amazon S3 バケットに保存されたデータなど) にアクセスできます。セキュリティを維持するために、AWS Identity and Access Management (IAM) を使用して Step Functions にこれらのリソースへのアクセス権限を与える必要があります。


a.AWS マネジメントコンソールを別ウィンドウで開きます。このステップバイステップガイドは開いたままにしておいてください。画面が読み込まれたら、ユーザー名とパスワードを入力して作業を開始します。次に、検索バーに「IAM」と入力し、表示された [IAM] を選択してサービスコンソールを開きます。

01a
01a

(クリックして拡大)


b.  [ロール] をクリックして、[ロールの作成] を選択します。

01b
01b

(クリックして拡大)


c.[信頼されたエンティティの種類を選択] ページの [AWS サービス] にあるリストから [Step Functions] を選択し、[次のステップ: アクセス権限] をクリックします。

01c
01c

(クリックして拡大)


d.[Attached アクセス権限ポリシー] ページで、[次のステップ: 確認] をクリックします。

01d
01d

(クリックして拡大)


e.[確認] ページで [ロール名] に「step_functions_basic_execution」と入力し、[ロールの作成] をクリックします。

01e
01e

(クリックして拡大)


f.新しい IAM ロールが作成されます。

01f
01f

(クリックして拡大)


ステップ 2:AWS Step Functions のステートマシンを作成する

このステップでは、「Pass 状態」を使用する、独立して実行されるシンプルなステートマシンを作成します。Pass 状態は単に入力を出力に渡すだけで、いかなる作業も実行しません。

実際のシナリオでは、必要な任意の作業をサーバーレスワークフローで実行させることができます。例えば、複数の Lambda 関数を組み合わせて、タスクの実行、意思決定などを行うことができます。ただし、このチュートリアルではシンプルなワークフローのみを作成します。


a.AWS Step Functions コンソールを開きます。Step Functions では、事前に定義されたさまざまなステートマシンがテンプレートとして利用できます。このチュートリアルでは、「Hello World」テンプレートを使用してステートマシンを作成します。[ステートマシンの作成] ページで [テンプレート] を選択し、[Hello world] を選択します。

02c
02c

(クリックして拡大)


b.[詳細] セクションでステートマシンの [名前] に「ScheduledWorkflow」と入力し、[IAM ロール] で [既存のロールを使用する] を選択します。[既存の IAM ロール] で、作成した IAM ロール「step_functions_basic_execution」を選択します。

02d
02d

(クリックして拡大)


c.Step Functions によって、ステートマシンの名前が自動的に入力されます。また、[ステートマシンの定義] パネルには、Amazon ステート言語でステートマシンの説明が入力されます。ステートマシンの定義方法についての詳細は、ステートマシン構造をご覧ください。

ここで、ステートマシンに簡単な変更を加えます。

行 2 および行 5 の「HelloWorld」を「Do Something」に置き換えます。
行 7 の「Hello World!」を「Work complete!」に置き換えます。

次に、ビジュアルワークフローの横の更新ボタンをクリックして変更を反映させます。それに伴ってステートマシンの図も更新されます。

02e
02e

(クリックして拡大)


d.[ステートマシンの作成] をクリックします。ステートマシンを実行する準備ができました。

02f
02f

(クリックして拡大)


ステップ 3:Amazon CloudWatch Events のルールを作成する

ステートマシンを作成した後、スケジュールに沿ってステートマシンを実行する Amazon CloudWatch Events のルールを作成できます。Amazon CloudWatch Events では、アマゾン ウェブ サービス (AWS) リソースの変更を記述した、システムイベントのほぼリアルタイムのストリームを配信します。すぐに設定できる簡単なルールを使用して、ルールに一致したイベントを 1 つ以上のターゲット関数またはストリームにルーティングできます。


a.別のブラウザタブを開きます。検索バーに「CloudWatch」と入力して、CloudWatch Events のコンソールを開きます。

03a
03a

(クリックして拡大)


b.[イベント] を選択し、[ルールの作成] をクリックします。 

03b
03b

(クリックして拡大)


c.[ステップ 1: ルールの作成] ページが表示されます。[イベントソース] セクションで、[スケジュール] を選択します。[一定の速度] に「1」と入力します。[分] は選択されたままにします。

03c
03c

(クリックして拡大)


d.[ターゲット] セクションで、[ターゲットの追加] を選択します。ドロップダウンの一覧から [Step Functions ステートマシン] を選択し、「ScheduledWorkflow」ステートマシンを選択します。

[入力の設定] をクリックし、[一致したイベント] を選択します。これにより、ステートマシンのインスタンスが実行されるたびに、CloudWatch Event の詳細が入力として Step Functions に渡されます。

[この特定のリソースに対して新しいロールを作成する] を選択し、[設定の詳細] をクリックします。

03d
03d

(クリックして拡大)


e.[ステップ 2: ルールの詳細を設定する] ページが表示されます。ルールの [名前] に「execute_state_machine」と入力します。[状態] は [有効] にチェックを入れたままにします。次に、[ルールの作成] をクリックします。

ルールが作成され、[ルール] ページが表示されるようになります。ここにすべての CloudWatch Events のルールが列挙されます。

これで、ステートマシンが 1 分間隔で実行されるようになりました。

03e
03e

(クリックして拡大)


ステップ 4:ステートマシンの入出力の処理方法をカスタマイズする

次に、ステートマシンの入出力の処理方法をカスタマイズします。情報が状態から状態へどのように流れるかを理解し、このデータをフィルタリングおよび操作する方法を学ぶことで、AWS Step Functions で効果的にワークフローを設計して実装できます。


a.Step Functions のコンソールに戻ると、「ScheduledWorkflow」ステートマシンが引き続き表示されているはずです。[編集] をクリックします。

04a
04a

(クリックして拡大)


b.[ステートマシンの定義] ウィンドウで、ステートマシンの行 7 を確認します。Pass 状態の Result フィールドでは、次の状態に渡す出力を指定しています。ステートマシンの状態は 1 つであるため、「Work complete!」メッセージはワークフローの End 状態に渡されます。

Step Functions の Pass 状態は、単に入力を出力に渡すだけであることを思い出してください。ResultPath フィールドを使用することで、状態の出力を変更できます。具体的には、出力を、状態の入力から生成した結果 (例: Task 状態の Lambda 関数からの出力など) に置き換えることができます。

状態の入力に結果を追加するには、行 7 の後に以下の新しい行を追加します。

"ResultPath": "$.taskresult",

これによって、ステートマシンの実行を呼び出した CloudWatch イベントの詳細に、Pass 状態の出力 (この場合は「Work complete!」) が追加されます。詳細は、Step Functions の入出力処理をご覧ください。

04b
04b

(クリックして拡大)


c.[保存] をクリックします。

04c
04c

(クリックして拡大)


ステップ 5:ワークフローが意図したとおりに動作しているか確認する

CloudWatch Events ルールを有効にしたため、CloudWatch によってステートマシンワークフローの実行が 1 分間隔でトリガーされます。このステップではワークフローの実行を観察し、CloudWatch イベントの詳細が Step Functions によってキャプチャされているか確認します。


a.Step Functions のコンソールに戻り、ページ上部のパンくずリストで「ScheduledWorkflow」をクリックします。

05a
05a

(クリックして拡大)


b.[実行] では、CloudWatch Events によってトリガーされた実行を確認できます。更新ボタンをクリックしてウィンドウを更新すると、ステートマシンの新しい実行が表示されます。少なくともワークフローの 2 つのインスタンスがトリガーされるまで、数分待ってください。

05b
05b

(クリックして拡大)


c.実行の 1 つを右クリックし、ブラウザの新しいタブでリンクを開きます。ステートマシンの他の実行についても同じ作業を繰り返します。

各タブで [ビジュアルワークフロー] ペインの「Do Something」状態をクリックすると、右側の [ステップの詳細] ペインに表示されます。

[入力] をクリックすると、該当する CloudWatch のイベントの詳細を確認できます。「id」や「time」フィールドが、各イベントで異なっていることに注意してください。

05c
05c

(クリックして拡大)


d.各タブで、[ステップの詳細] パネルの [出力] を展開します。入力に「Do Something」状態の出力が追加されていることが確認できます。

05d
05d

(クリックして拡大)


ステップ 6:リソースを削除する

このステップでは、AWS Step Functions と Amazon CloudWatch のリソースを削除します。

重要: あまり使用されていないリソースを終了することは、コストを削減するためのベストプラクティスです。リソースを終了しないと、料金が発生する場合があります。


a.各ステートマシンの実行を表示していたタブを閉じます。[Step Functions] ウィンドウの上部にある [ステートマシン] をクリックします。

06a
06a

(クリックして拡大)


b.[ステートマシン] ウィンドウで、このチュートリアルのために作成したステートマシンを選択し、[削除] をクリックします。ダイアログボックスで [ステートマシンの削除] をクリックしてアクションを承認します。処理中の実行がすべて完了したことが Step Functions により確認されると、1~2 分でステートマシンが削除されます。

06b
06b

(クリックして拡大)


c.次に、Amazon CloudWatch Events のルールを削除します。CloudWatch コンソールで [アクション] > [削除] の順にクリックします。もう一度 [削除] をクリックして削除を承認します。

06c
06c

(クリックして拡大)


d.[サービス] をクリックし、検索バーに「IAM」と入力して IAM コンソールに移動します。

06d

(クリックして拡大)


e.[ロール] をクリックします。

06e
06e

(クリックして拡大)


f.このチュートリアル用に作成した IAM ロールを両方とも選択し、[ロールの削除] をクリックします。ダイアログボックスで [はい、削除します] をクリックして削除を承認します。

これで、AWS マネジメントコンソールからサインアウトすることができます。

06f
06f

(クリックして拡大)


お疲れ様でした。

サーバーレスワークフローの 1 分間隔での実行を正常にスケジューリングできました。
AWS Step Functions では、繰り返しのタスク実行を検証および監査し、継続的に実行されているか確認できます。AWS Step Functions と Amazon CloudWatch Events を組み合わせることで、日/週/月ごとのタスクを自動化することや、特定の条件下で Step Functions ワークフローの実行をトリガーすることができます。