この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
お疲れ様です、第三システム部の岡野です。よろしくお願いします。
今回は、AWS Step Functionsを学ぶために公式ハンズオンに取り組んだ内容について記そうと思います。
参照サイト:AWS Hands-on for BeginnersAWS Step Functions 入門 – ビジュアルツールを使ってローコードにワークフローを作成する
手順
01 今回のハンズオンのシナリオ/構成の紹介 + AWS Step Functions の基本
サーバーのプロビジョニング(必要なものを準備すること)や管理なしでワークフローを実行できるサービスです。Step Functions Workflow Studioという機能を使うことで、GUIで使いたい機能を組み合わせることができるのが特徴だと思いました。
02 ステートマシーンの作成 + 「アクション」を使ってみる
今回は「ワークフローを視覚的に設計」で作成します。Step Functionsからステートマシーンをクリックするとデフォルトで上記の項目が選択されているので「次へ」をクリックします。
「ステップ 2: ワークフローを設計」というページに移動します。ここから使いたいアクション(AWSの様々な機能)やフロー(処理の状態)を組み合わせてGUIでステートマシンを作成します。
まず、左のフローをクリックし、Passを「最初の状態をここにドラッグ」にドラッグします。その後、Pass以外の場所をクリックし、全体の設計を表示し、TimeoutSecondsに30と入力します。これは無限ループを防ぐためです。入力後、次へをクリックします。
先ほどGUIで作成したステートマシンのAmazon States Language (ASL)での定義が表示されます。次へをクリックします。
ステートマシンの名前を変更します。今回は「OKNH4BStateMachine」とします。その他の設定はデフォルトのままで右下の「ステートマシンの作成」をクリックします。
ステートマシンが作成されました。内容が正しいか確認するために「実行の開始」をクリックします。
こちらでも「実行の開始」をクリックします。
実行結果が表示されます。Passをクリックすると右側にどのような入力や出力があったかを確認することができます。
その後、DynamoDBに移動します。テーブルの作成をクリックし、テーブル名にArticle、パーティションキーにArticleIDと入力します。それら以外はデフォルトのままで右下の「テーブルの作成」をクリックします。
作成が完了した後、左側の「項目を探索」をクリックし、Articleを選択します。その後「項目を作成」をクリックします。
値に0001と入力します。その後、新しい属性の追加から文字列をクリックします。項目が追加されるので属性名にDetailを、値に説明を入力します。
先ほどと同じ要領でもう一つ項目を追加します。以下の画像のようになります。
Step Functionsのページに戻り、先ほど作成したステートマシンであるOKNH4BStateMachineを選択し、編集をクリックします。右側のWorkflow Studioをクリックし編集画面に移動します。Passをクリックした状態でDeleteキーを押すか。右クリックで状態を削除をクリックして削除します。
左側の検索欄にDynamoDBと入力し、DynamoDBのアクションリストを表示します。リストからGetItemをクリックし、「最初の状態をここにドラッグ」にドラッグします。統合タイプをAWS SDKに変更します。(動画内のIntegration typeに相当します。)
API パラメータの編集をします。 "MyDynamoDBTable"を "Article"に、"Column"を" ArticleID"に変更します。また、"MyEntry"を"0001"に変更します。その後、適用して終了をクリックし、保存をクリックします。
ひとつ前の画面に戻り、実行を開始をクリックします。その後、もう一度実行を開始をクリックします。
実行の結果、失敗となりました。原因を調べるため赤くなっているDynamoDBのステートをクリックします。
文章からDynamoDBにアクセスする権限がないから失敗したことが読み取れます。
ひとつ前の画面に戻り、IAM ロール ARNの下のURLをクリックします。
IAM ロール設定画面に移動するので、許可を追加→ポリシーをアタッチをクリックします。
検索欄にdynamodbと入力し、AmazonDynamoDBFullAccessにチェックを入れポリシーのアタッチをクリックします。
もう一度Step Functionsのページに戻り、実行すると成功しました。ArticleIDで直接指定した0001の情報が出力されたことがわかります。
03 Input の受け取り + Choice ステートを使ってみる
現在の状態では、直接指定したものしか表示されないのでStep Functionsを変更します。Workflow Studioで編集をし、 "S": "0001"を"S.$": "$.ArticleID"に変更します。
実行の開始で"ArticleID": "0001"として実行してみます。
情報の取得が出来ました。
また、現在情報のないものがを取得しようとするとどうなるかを確認します。今回は”ArticleID”: “0009”を取得してみます。
情報がないので当然取得できません。
きちんと情報が取得できている場合は出力に"Item":という項目があります。これを利用して情報が取得できたか否かで分岐するようにします。
Workflow Studioに戻り、左のフローをクリックし、choiceをDynamoDB GetItemの下にドラッグします。
その後、左側にSuccess、右側にFailをドラッグします。
Rule#1の鉛筆マークをクリックし編集します。
Add conditionsをクリックし、Variableに$.Itemを、Operatorにis presentを入力します。これで$.Itemが存在するときに成功するということになります。また、状態名をChoice – Item is presentに変更します。
"ArticleID": "0002"で実行をすると成功しました。
存在しない"ArticleID": "0009"で実行をすると失敗しました。
特定の項目があるかどうかで成果を判断する際はchoiceを使えばよいことがわかりました。
04 Parallel ステートで処理を並列に実行する
Workflow StudioのSuccessを削除し、代わりにフローからParallelをドラッグします。するとParallelの下に項目が表示されるので、右側にフローのPassを、左側にアクションのTranslateTextをドラッグします。
TranslateTextをクリックし"SourceLanguageCode": "ja","TargetLanguageCode": "en", "Text": "こんにちは"と変更します。
実行前にIAMでTranslateReadOnlyのポリシーをアタッチします。その後、 "ArticleID": "0001"で実行すると"こんにちは"が"Hi"と訳されて出力されます。
"Text": "こんにちは"を"Text.$": "$.Item.Detail.S"に変更します。Item配下のDetail配下のSを参照するということです。
変更後に"ArticleID": "0001"で実行すると"0001"の文章が英訳されて出力されます。
05 Output の調整 + DB(Amazon DynamoDB)の更新
Workflow StudioでTranslateTextの下にDynamoDB UpdateItemをドラッグします。その後DynamoDB UpdateItemををクリックし、状態名をDynamoDB UpdateItem – EnglishVersionに変更します。さらに、
{
"TableName": "Article",
"Key": {
"ArticleID": {
"S": "0001"
}
},
"UpdateExpression": "SET EnglishVersion = :EnglishVersionRef",
"ExpressionAttributeValues": {
":myValueRef": {
"S": "Hello"
}
}
}
と変更し、"ArticleID": "0001"で実行します。
0001を指定してかつHelloを入力するようにしていることをDynamoDBで確認します。
TranslateTextを編集します。
Workflow StudioのTranslateTextをクリックし、出力をクリックします。その後ResultPath を使用して~の横のチェックを入れ、空欄に$.Resultを入力します。
"ArticleID": "0001"で実行するとArticleIDが取得されていることがわかりました。
Workflow StudioのDynamoDB UpdateItemをクリックし、"S": "$.0001"を"S.$": "$.Item.ArticleID.S"に変更します。また、 "S": "Hello"を"S.$": "$.Result.TranslatedText"に変更します。
"ArticleID": "0001"で実行した後DynamoDBを確認するとEnglishVersionに翻訳された結果が加わります。
まとめ
様々な機能を視覚的に組み合わせるので使いやすいと思いました。オリジナルの作品も作りやすそうなので挑戦したいと思います。