![[2026年版]AWS Step Functionsを利用したローコード画像分類ワークフロー構築ハンズオン](https://devio2024-media.developers.io/image/upload/f_auto,q_auto,w_3840/v1772289844/user-gen-eyecatch/ket5naoa0cpqvrcqmbcx.jpg)
[2026年版]AWS Step Functionsを利用したローコード画像分類ワークフロー構築ハンズオン
こんにちは、臼田です。
みなさん、AWSの勉強してますか?(挨拶
今回はAWS上のサーバレスサービスやAIサービスを組み合わせて1つの動く仕組みを実現するハンズオンコンテンツを作りましたので紹介します。
ハンズオン概要
このハンズオンではAmazon S3に動物の画像をアップロードして、その画像が犬なのか?、あるいは猫なのか?をAmazon Rekognitionを利用して分類して保存先を分けるという仕組みをAmazon Step Functionsを利用して構築します。構成図は以下のようになります。

このハンズオンを利用する方はこの構成図だけでパッとどのようなものかイメージできないかもしれませんが、ゆっくり説明していきますので安心してください。
主にAWSの基本的な使い方はわかっていて、いろんなサービスを触ってみたい方やサーバレスサービスの組み合わせ方を学びたい方を対象としたハンズオンです。
自由に利用できるAWSアカウントを所持しており、操作するためのIAMの設定など基本的な準備ができていればこの手順を実行できます。
ハンズオン手順
ハンズオンの大まかな手順は以下のとおりです。
- S3バケットの作成
- IAMロールの作成
- Step Functions ステートマシンの作成
- EventBridgeルールの作成
- 動作テスト
- クリーンアップ
1. S3バケットの作成
AWSマネジメントコンソールを開き、検索欄からAmazon S3を開きます。ちなみに、開いている画面の右上で現在のリージョンが確認できるので、常に適切なリージョンで操作しているかは気にしましょう。今回のハンズオンでは東京リージョンを利用していきます。

Amazon S3の画面を開いたら、S3バケットを作成します。

バケット名は任意の名前で問題ありませんが、ここではpet-classification-[適当な英字6文字程度]とします。注意点としては、Amazon S3のバケット名は全世界で一意の名前、つまり他の人と被らない名前を付ける必要があります。名前以外はそのままで下までスクロールして「バケットを作成」しましょう。

作成できたら、作成したバケットの詳細画面を開きます。一覧から開いても、ポップアップから開いてもどちらでもよいです。

開いたら、画像を保存するための下記4つのフォルダを作成していきます。
inboxdogscatsothers
「フォルダの作成」からこれらを作成していきます。

フォルダ名を入力して作成していきます。

フォルダの作成が確認できました。4つすべて同様に作業しましょう。

すべてのフォルダが作成できていることを確認してください。

これでS3の準備は完了です。
2. IAMロールの作成
続いて、AWS Step Functionsから利用するIAMロールを作成していきます。
IAMのマネジメントコンソールを開き、左カラムの「ロール」を開いて「ロールを作成」を押します。

信頼されたエンティティタイプで「AWSのサービス」を選択し、ユースケースで「Step Functions」を選択し、「次へ」

許可ポリシーの画面はそのまま「次へ」

ロール名にpet_classification_roleと入力し、「ロールを作成」

作成したロールの詳細画面を開きます。

「許可を追加 -> インラインポリシーを作成」を選択します。

「JSON」タブを選択し、以下のJSONを貼り付けてください。バケット名は自分のものに変更してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::pet-classification-xxxxxx/*"
},
{
"Effect": "Allow",
"Action": [
"rekognition:DetectLabels"
],
"Resource": "*"
}
]
}
バケット名の後ろにある/*を消さないように気をつけましょう。

次へ進んだらポリシー名にpet_classification_policyと入力し、「ポリシーの作成」を押します。

これでIAMロールの準備が完了です。
3. Step Functions ステートマシンの作成
続いてStep Functionsのマネジメントコンソールを開きます。ここからがローコードの本番ですね。「今すぐ始める」からステートマシンを作成していきます。

「自分で作成する」から作成します。

ステートマシン名にpet_classification_machineを入力して「続行」します。

1つ目のステートを作っていきます。 左パネルの検索ボックスでRekognitionと入力します。様々なAmazon RekognitionのAPIが一覧で出てきます。その中で「DetectLabels」をドラッグしてフローのStartとEndの間に配置します。

「DetectLabels」は画像からそこに写っているものを特定してラベルとして返してくれます。今回は写真から犬や猫が写っていることを特定してもらいます。
「引数と出力」タブを開き引数に以下を入力していきます。
{
"Image": {
"S3Object": {
"Bucket": "{% $states.input.detail.bucket.name %}",
"Name": "{% $states.input.detail.object.key %}"
}
},
"MaxLabels": 10,
"MinConfidence": 80
}
これは「DetectLabels」をリクエストする際に、ステートが受け取ったS3のバケット名やオブジェクト名を抽出して渡すための記述です。
同様に出力には以下を入力します。
{
"detail": "{% $states.input.detail %}",
"rekognitionResult": {
"Labels": "{% $states.result.Labels %}"
}
}
こちらは「DetectLabels」からのレスポンスを受け取り、次のステートに渡すための記述です。

次のステートは分岐です。左パネルの検索欄の文字を削除した後「フロー」タブを開き、「Choice」をドラッグして「DetectLabels」の下に配置します。名前をCheckAnimalTypeに変更します。

分岐の条件を作っていきます。「Choice」ステートが選択された状態で右パネルの「Rule 1」の編集ボタン(鉛筆マーク)をクリックします。

条件(Condition)に以下を入力します。
{% $count($states.input.rekognitionResult.Labels[Name = "Dog"]) > 0 %}

これは「DetectLabels」の結果に「Dog」が含まれているかを確認する条件です。ついでにこのルールの下の方のコメントにDogsと入れておき、エディター上でわかりやすく表示するように変更します。

少し上に戻り、「閉じる」ボタンを押します。

同じように猫の分岐も作成します。「Add new choice rule」をクリックして新しいルールを作成し、「Rule 2」を追加します。

「Rule 2」の編集ボタンを押して条件(Condition)に以下を入力します。
{% $count($states.input.rekognitionResult.Labels[Name = "Cat"]) > 0 %}

ルールの下の方のコメントにCatsと入れます。

少し上に戻り、「閉じる」ボタンを押します。

ここまでで、エディター上ではこのような状態になっています。

分岐後の処理を追加していきます。左パネルの検索ボックスで「アクション」タブに戻してS3と入力し、「CopyObject」をドラッグしてChoiceのRule 1(Dogs)の下に配置します。名前をCopyToDogsにします。

引数に以下を入力します。
{
"Bucket": "{% $states.input.detail.bucket.name %}",
"Key": "{% 'dogs/' & $split($states.input.detail.object.key, '/')[1] %}",
"CopySource": "{% $states.input.detail.bucket.name & '/' & $states.input.detail.object.key %}"
}

これは画像ファイルを「dogs/」配下にコピーする処理です。
同様にもう1つ「CopyObject」をドラッグしてChoiceのRule 2(Cats)の下に配置し、名前をCopyToCatsに変更します。引数に以下を入力します。
{
"Bucket": "{% $states.input.detail.bucket.name %}",
"Key": "{% 'cats/' & $split($states.input.detail.object.key, '/')[1] %}",
"CopySource": "{% $states.input.detail.bucket.name & '/' & $states.input.detail.object.key %}"
}

犬でも猫でも無かった場合は「others/」へコピーするようにします。
もう1つ「CopyObject」をドラッグしてChoiceのDefaultの下に配置し、名前をCopyToOthersに変更します。引数に以下を入力します。
{
"Bucket": "{% $states.input.detail.bucket.name %}",
"Key": "{% 'others/' & $split($states.input.detail.object.key, '/')[1] %}",
"CopySource": "{% $states.input.detail.bucket.name & '/' & $states.input.detail.object.key %}"
}

これでステートマシンの編集が完了しました。この状態になっています。

ステートマシンを保存しますが、先程作成したIAMロールをアタッチします。
上部にある「設定」を開き、実行ロールで先程作成したIAMロールを選択して右上の「作成」を押します。

無事ステートマシンが作成できました。

4. EventBridgeルールの作成
続いてS3にファイルがアップロードされたことをきっかけにイベントを発生させ、AWS Step Functionsに繋いでいくためのAmazon EventBridgeのルールを設定していきます。
ルールの作成の前に、S3バケットがEventBridgeと連携できるようにするため、バケットの設定を行います。
先程作成したバケットの「プロパティ」タブを開きます。

「Amazon EventBridge」セクションで「編集」を押します。

「EventBridge にイベント通知を送信する」を「オン」にして保存します。

変更できました。S3バケット側の準備は完了です。

続いて、EventBridgeのマネジメントコンソールを開き、「ルールを作成」していきます。

「AWSサービスイベント」から選択していきます。

イベントの一覧からS3の「Object Created」イベントを「トリガーイベント」にドラッグアンドドロップします。

下にスクロールして右側のイベントパターンで以下を入力します。この際、S3のバケット名は各自のバケット名に置き換えてください。
{
"source": ["aws.s3"],
"detail-type": ["Object Created"],
"detail": {
"bucket": {
"name": ["pet-classification-xxxxxx"]
},
"object": {
"key": [{
"prefix": "inbox/"
}]
}
}
}
このイベントパターンでは、「inbox/」配下にオブジェクトが作成されたときにイベントが発生する条件です。

続いてターゲットの設定です。左カラムのターゲットタブを開き、「Step Functions ステートマシン」をターゲット側にドラッグアンドドロップします。

下の設定でステートマシンを先程作成したものを選択し、実行ロールは自動で作成するためそのままで右上作成を押します。
ルールの名前を付ける画面でpet_classification_ruleと入力して「作成」します。

これですべての準備が完了しました。
5. 動作テスト
実際に動かしていきましょう。
S3バケットのinbox/フォルダを開きます。ここに動物の画像ファイルをアップロードしましょう。画像はフリーのものなどを自由に準備してください。注意点としてはイラストだと上手く行かないので、写真を準備しましょう。

今回は一度に犬、猫、うさぎの画像をアップロードしてみます。一度に複数でも問題ありません。

アップロードしたら、ステートマシンを見に行きます。「実行」タブからアップロードした画像の数だけステートマシンが呼び出された実行履歴が確認できます。どれか1つを開いてみましょう。

こちらの実行履歴では少し下にグラフビューでステートマシン上でどのように実行されたかが表示されます。緑色が成功した場所で、もし赤くなっていれば失敗したステートが分かります。各ステートを選ぶと詳細が確認できます。ここでは「CheckAnimalType」のステートを開き、どのような入力があったか確認できます。「Rabbit」が含まれているためその他の分岐になっていることがわかります。

別の実行結果では「Cat」になっていることが分かります。

こちらは「Dog」でした。

そしてS3バケットの各フォルダも確認していきます。それぞれ適切なフォルダにコピーされていることが確認できました。

これにて、画像の分類が正常に動作することが確認できました。
6. クリーンアップ
最後に、作ったリソースを削除していきます。
削除するリソースは以下の通り。
- EventBridgeルール
- Step Functionsステートマシン
- IAMロール(Step Functions用)
- IAMロール(EventBridge用)
- S3バケット
EventBridgeコンソールでルール一覧にてpet_classification_ruleを選択して削除します。

Step Functionsコンソールでpet_classification_machineの詳細画面「アクション」から削除します。

IAMロール一覧からpet_classification_roleを検索して削除します。

同じくIAMロール一覧からAmazon_EventBridge_Invoke_Step_Functions_...を検索して削除します。自動作成されているので名前はその時々で変わります。

S3バケットの一覧からバケットを選択して「空にする」を押します。オブジェクトが入っているバケットは直接削除できないためです。

「完全に削除」と入れて空にします。

バケット削除画面でバケット名を入力して「バケットを削除」します。

以上でリソースの削除完了です。
まとめ
以上でAWS Step Functionsを利用したローコード画像分類ワークフロー構築ハンズオンは終了です。
今回はAIサービスであるAmazon Rekognitionを呼び出しましたが、AWS Step FunctionsではAWSのたくさんのサービスと直接連携ができるため、別のAIサービスやデータベース、他にもたくさんのサービスと連携でき無限の可能性があります。
通常こういったサービス間連携をプログラムで作成していくと、状態が分かりづらかったりエラーの解消が大変だったりしますが、AWS Step Functionsでは実行履歴の中で各ステートでどのような状態だったかまで詳細に確認できたり、フローの組み換えも直感的でわかりやすいです。
ぜひいろんな形で活用してみてください。






