はじめに
AWSハンズオン for Beginnersシリーズとして提供されている「Step Functions 入門 - ビジュアルツールを使ってローコードにワークフローを作成する」を実施した際のメモです。前回の記事でもStep Functionsに関するハンズオンを記載しました。そこではStep FunctionとLambdaと連携したり、エラーハンドリング、Mapステートを使用してステートマシンの連続実行などを体験することができました。今回のハンズオンでは前回使用しなかった機能(Choiceステート, Parallelステート, Waitステート, 入出力の受け渡し)を使ってより実践的なアプリケーションを作成します。
なお、「Step Functionsとは何か」「使用するとどんなメリットがあるか」「ユースケースは何か」についての説明は前回の記事をご覧ください。
アジェンダ
- 今回のハンズオンのシナリオ/構成の紹介 + AWS Step Functions の基本
- ステートマシーンの作成 + 「アクション」を使ってみる
- Input の受け取り + Choice ステートを使ってみる
- Parallel ステートで処理を並列に実行する
- Output の調整 + DB(Amazon DynamoDB)の更新
- Parallel ステートのもう一方の実装 - テキストを音声化する
- ステートで「タスクが終わるまで待つ」を実装する
- 音声ファイルの出力先情報を DynamoDB テーブルに格納する
- リソースの削除 + まとめ + Next Action 案
はまったところ
2.ステートマシーンの作成+「アクション」を使ってみるで、APIパラメータ作成時「Parameters.Key.Key : Value is mandatory.」というエラーダイアログが表示され、エラーの修正をするか、そのまま続行するか聞かれました。
APIパラメータに指定したJsonはデフォルトで入力されていたものです。また、ハンズオンで入力するものに変更しても同様の現象が発生しました。原因はわかりませんでしたが、以下のツイート内容の通り、エラーを無視して続行できるため、気にしないようにしました。
メモ
APIパラメータ可変項目の参照指定
入力Jsonのキーに対応する値をステートマシンのアクションで使用したい場合、APIパラメータの値に「$.」をつけ、入力Jsonに対応するパスを指定します。また、Jsonパスを指定する場合、キー名の後ろに「.$」をつける必要もあります。例えば、ステートの入力となるJsonが {"ArticleID":"0001"} で、DynamoDBのGetItemアクションで入力の "0001" を使用する場合、APIパラメータは以下のように記述します。
{
"TableName": "Article",
"Key": {
"ArticleID": {
"S.$": "$.ArticleID"
}
}
}
ステート間で情報を共有する
ステート間で情報を共有する機能があります。例えば、アクションが2つ連続しているステートマシンがあり、1つ目のアクションのステップ入力を2つ目のアクションで参照したい時に使用します。アクションのステップ入力となったJsonをステップ出力に含めることができます。(アクションで「出力」を選択し、Combine original input with resultを選択。出力Jsonを内包するキー名を入力する)
Waitステートについて
本ハンズオンではテキスト読み上げ(音声化)サービスであるAmazon Pollyを使用します。Pollyの音声化は非同期に行われるため、Pollyが入力テキストを音声ファイルに変換する処理が完了する前に、ステートマシンが終了してしまう可能性があります。本ハンズオンではこの問題への対応としてWaitステートを使用しています。Pollyの処理は音声化リクエスト毎に管理されており、処理の状態をステータスで表しています。例えば、処理中であればscheduled、処理が完了したらcompletedなどです。Waitステートでこのステータスを監視し、completedでなければ、指定したステートを再実行させるという設定が簡単にできます。
ハンズオンの感想
AWSサービスを複数、並列に実行して結果を取得するという少し複雑なアプリケーションをGUI上で簡単に作成することができました。APIパラメータのJsonの書き方やステート間の情報共有機能については慣れる必要がありますが、意外に楽にできたのは驚きました。前回と今回のハンズオンでStep Functionsの機能をほとんど体験することができましたが、Lambdaとの連携がまだしっくりきていません。これについては本ハンズオンで紹介されていた別のハンズオンで腹落ちさせようと思います。