はじめに
みなさんこんにちは。お久しぶりです。
最近、業務で久しぶりにAWS Step Functions(以下「Step Functions」)を使うことになったので、復習もかねてAWS公式の「AWS Step Functions 入門ハンズオン」をやってみることにしました。
今回はその「AWS Step Functions 入門ハンズオン」に関するお話しです。
「AWS Step Functions 入門ハンズオン」とは
AWS公式が提供する「AWS Hands-on for Beginners」シリーズ1のStep Function編で、Step Functionsについて下記の操作を行いながら、Step Functionsの基本的な機能・操作を理解しようというハンズオンです。
- DynamoDBから文章データを取得する
- 文章データを取得できた場合のみ、下記の処理を並列で実施する(できなかった場合はそこで終了)
- 文章データの内容をAmazon Translateで英訳し、英訳した文章をDynamoDBに登録する
- 文章データの内容をAmazon Pollyで音声データにし、音声データの保存先(S3バケット)の情報をDynamoDBに登録する
ハンズオンのアジェンダ
ハンズオンの正式なアジェンダは以下の通りです。
- 今回のハンズオンのシナリオ/構成の紹介 + AWS Step Functions の基本
- ステートマシーンの作成 + 「アクション」を使ってみる
- Input の受け取り + Choice ステートを使ってみる
- Parallel ステートで処理を並列に実行する
- Output の調整 + DB(Amazon DynamoDB)の更新
- Parallel ステートのもう一方の実装 - テキストを音声化する
- ステートで「タスクが終わるまで待つ」を実装する
- 音声ファイルの出力先情報を DynamoDB テーブルに格納する
- リソースの削除 + まとめ + Next Action 案
上記アジェンダはすべて公式Youtube動画&公式資料を見ながら実施できるので、初めてでもわかりやすい内容です。
またどの章も各章の動画自体は短いので(10分弱)、学ぶべきポイントをコンパクトに学べるようになっています。
なお事前にAWSアカウント作成が必要なので、AWSアカウントを持ってない人は先に作成しておいてください。(検証用の一時的アカウントなどは払い出されない)2
やってみた感想
良かった点
Step Functionの基本的な使い方を学べる
Step Functions でステートマシンを作成する際の基本である「アクション(各AWSサービスを利用する機能)」や「フロー(条件分岐・並列処理などのロジックを定義する機能)」の使い方を学ぶことができます。3
またステートマシン編集環境であるWorkflow Studioを操作するためWorkflow Studio、Workflow Studioの操作に慣れることもできます。(ちなみにこのハンズオンではマネジメントコンソールを使用しますが、VS CodeでもWorkflow Studioでステートマシンを編集可能です)
Amazon TranslateやAmazon Pollyについても知ることができる
このハンズオンではAmazon TranslateやAmazon Pollyも取り扱うため、普段触れることが少ない(と思う)これらのサービスについて知ることもできます。
ハンズオン内で「Amazon TranslateやAmazon PollyのAPIドキュメントを調べる」という作業があるため、それを通してそれらの機能を知ることができますし、ハンズオンが終わった後で「Amazon TranslateやAmazon Pollyを自分でもいろいろ触ってみようかな」というきっかけになるかもしれません。
注意する点
ちょっと内容が古い
このハンズオンの作成が2021年12月という事もあり、動画の内容が古いものになっています。
そのため、マネジメントコンソールのUIや操作手順で、一部現在のものとは異なるものがあるため、注意が必要です。
「JSONata」や「変数」について学べない
先ほど説明した通り、内容が古いものになっていることもあり、最近サポートされた「JSONata」や「変数」についてはこのハンズオンでは学べません。この点は注意が必要です。(特にJSONataはとても便利なので、個人的にはそろそろハンズオンをアップデートして頂けると嬉しいです)
なおJSONataや変数については、こちらのサイトが参考になります。
- JSONata:JSONata Documentation
- 変数:
参考情報:ハンズオンの内容をJSONataで記載する
「注意する点」で記載の通り、このハンズオンではJSONataは扱っていません。
しかし現在はJSONataで記載するのが基本なので(デフォルトの「ステートマシンクエリ言語」もJSONata)「このハンズオンの内容をJSONataではどう書くか」を記載したいと思います。(一部「変数」も扱います)
※記載がない章は、特にJSONataでの記載が必要ない章になります
3.Input の受け取り + Choice ステートを使ってみる
「DynamoDB GetItem」ブロックの「APIパラメータ」
以下のように記載
{
"TableName": "Article",
"Key": {
"ArticleID": {
"S": "{% $states.input.ArticleID %}"
}
}
}
ちなみにハンズオンではDynamoDB関連ブロックの「統合タイプ」に「AWS SDK」を設定してますが「最適化」でも問題ないです。(指定する引数は同じ)
「Choice」ブロックの「Rule #1」の「Condition」
{% $exists($states.input.Item) %}
と記載
4.Parallel ステートで処理を並列に実行する
「TranslateText」ブロックの「引数と出力」の「Text」
"{% $states.input.Item.Detail.S %}"
と記載
5.Output の調整 + DB(Amazon DynamoDB)の更新
「TranslateText」ブロックの「引数と出力」の「出力」
以下のように記載
{
"Item": "{% $states.input.Item %}",
"Result": "{% $states.result%}"
}
「DynamoDB UpdateItem」ブロックの「引数と出力」の「引数」
以下のように記載(「ArticleID」と「:EnglishVersionRef」がポイント)
{
"TableName": "article",
"Key": {
"ArticleID": {
"S": "{% $states.input.Item.ArticleID.S %}"
}
},
"UpdateExpression": "SET EnglishVersion = :EnglishVersionRef",
"ExpressionAttributeValues": {
":EnglishVersionRef": {
"S": "{% $states.input.Result.TranslatedText %}"
}
}
}
6.Parallel ステートのもう一方の実装 - テキストを音声化する
「StartSpeechSynthesisTask」ブロックの「引数と出力」の「Text」
{% $states.input.Item.Detail.S %}
と記載
7.ステートで「タスクが終わるまで待つ」を実装する
「Choice」ブロックの「Rule #1」の「Condition」
{% $contains($states.input.TaskStatus, 'completed') %}
と記載({% $states.input.TaskStatus = 'completed' %}
でもOKだと思う)
「変数」の利用
また「TaskId」と「ArticleID」はハンズオンでは数珠つなぎのように渡していますが、ここは「変数」機能を使うと楽です。
「StartSpeechSynthesisTask」ブロックの「変数」に以下のように設定します。(変数名はルールに沿っていれば何でもいいです。)
{
"varArticleId": "{% $states.input.Item.ArticleID.S %}",
"varTaskId": "{% $states.result.SynthesisTask.TaskId %}"
}
そして「GetSpeechSynthesisTask」ブロックの「引数と出力」の「Text」に {% $varTaskId %}
と設定すればOKです。
8.音声ファイルの出力先情報を DynamoDB テーブルに格納する
「DynamoDB UpdateItem」ブロックの「引数と出力」の「引数」
以下のように記載(「ArticleID」と「:S3URLRef」がポイント)
{
"TableName": "article",
"Key": {
"ArticleID": {
"S": "{% $varArticleId %}"
}
},
"UpdateExpression": "SET S3URL = :S3URLRef",
"ExpressionAttributeValues": {
":S3URLRef": {
"S": "{% $SynthesisTask.OutputUri %}"
}
}
}
「ArticleID」は先ほど「StartSpeechSynthesisTask」ブロックの「変数」に設定した「varArticleId」を使用しています。
このように「変数」を使用する事で、わざわざ数珠つなぎをしなくても、他のブロックの値を参照できるようになります。
宣伝
今週10/11(土)に金沢・近江町市場で「JAWS Festa 2025」が開催されます!
そしてその中で業務効率化をさらに加速させる、ノーコードツールとStep Functionsのハイブリッド化というタイトルで、ノーコードツールおよびStep Functionを使用した業務効率化やStep Functionsの効果的な使用方法などについてお話しさせていただきますので、よろしくお願いいたします。
それでは、今回はこの辺で。