<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>StepFunctions - CayTech Lab</title>
	<atom:link href="https://caymezon.com/tag/stepfunctions/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Sun, 22 Mar 2026 05:35:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://caymezon.com/wp-content/uploads/2026/01/cropped-CayTechLab-32x32.jpg</url>
	<title>StepFunctions - CayTech Lab</title>
	<link>https://caymezon.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<atom:link rel='hub' href='https://caymezon.com/?pushpress=hub'/>
	<item>
		<title>【保存版】AWS実践ハンズオン記事まとめ｜サーバーレス・インフラ・AIを難易度別に完全網羅</title>
		<link>https://caymezon.com/aws-handson-summary/</link>
					<comments>https://caymezon.com/aws-handson-summary/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sun, 22 Mar 2026 05:35:42 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[CloudFormation]]></category>
		<category><![CDATA[CloudFront]]></category>
		<category><![CDATA[Cognito]]></category>
		<category><![CDATA[DynamoDB]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[Rekognition]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[SAM]]></category>
		<category><![CDATA[SNS]]></category>
		<category><![CDATA[SQS]]></category>
		<category><![CDATA[StepFunctions]]></category>
		<category><![CDATA[まとめ]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20282</guid>

					<description><![CDATA[<p>目次 はじめに🗺️ ハンズオン難易度マップ📌 入門編：IaC の第一歩CloudFormationでWeb自動起動EC2を構築🟢 Tier 1：簡単 / 課金リスク極小1. S3 + CloudFront 静的サイトホス [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-summary/">【保存版】AWS実践ハンズオン記事まとめ｜サーバーレス・インフラ・AIを難易度別に完全網羅</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">🗺️ ハンズオン難易度マップ</a></li><li><a href="#toc3" tabindex="0">📌 入門編：IaC の第一歩</a><ol><li><a href="#toc4" tabindex="0">CloudFormationでWeb自動起動EC2を構築</a></li></ol></li><li><a href="#toc5" tabindex="0">🟢 Tier 1：簡単 / 課金リスク極小</a><ol><li><a href="#toc6" tabindex="0">1. S3 + CloudFront 静的サイトホスティング</a></li><li><a href="#toc7" tabindex="0">2. EventBridge + Lambda 定期バッチ実行</a></li><li><a href="#toc8" tabindex="0">3. S3 ファイルアップロード → Lambda 非同期処理</a></li><li><a href="#toc9" tabindex="0">4. SQS + Lambda メッセージキュー処理</a></li></ol></li><li><a href="#toc10" tabindex="0">🟡 Tier 2：中程度 / 少し設定多め</a><ol><li><a href="#toc11" tabindex="0">5. Step Functions + Lambda 受注処理ワークフロー</a></li><li><a href="#toc12" tabindex="0">6. Lambda + API Gateway + DynamoDB メモアプリAPI</a></li><li><a href="#toc13" tabindex="0">7. Cognito + API Gateway + Lambda 認証付きAPI</a></li><li><a href="#toc14" tabindex="0">8. SNS + SQS + Lambda 通知システム（Pub/Sub・ファンアウト）</a></li></ol></li><li><a href="#toc15" tabindex="0">🔴 Tier 3：少し複雑 / AWSらしいユースケース</a><ol><li><a href="#toc16" tabindex="0">9. S3 + Lambda + Rekognition 画像認識パイプライン</a></li><li><a href="#toc17" tabindex="0">10. API Gateway + Lambda + CloudWatch Logs チャットボットログAPI</a></li></ol></li><li><a href="#toc18" tabindex="0">🔧 実務ハンズオン編</a><ol><li><a href="#toc19" tabindex="0">S3 + CloudFront + WAF IP制限付き静的サイト配信</a></li></ol></li><li><a href="#toc20" tabindex="0">📊 全ハンズオン一覧</a></li><li><a href="#toc21" tabindex="0">さいごに</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>このページは、当ブログで公開している<strong>AWSハンズオン記事のまとめページ</strong>です。</p>
<p>各ハンズオンは <strong>難易度別（Tier 1〜3）</strong> に整理しており、それぞれ以下の2種類の記事を用意しています。</p>
<table>
<thead>
<tr>
<th>種類</th>
<th>対象者</th>
<th>特徴</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>SAM版（IaC版）</strong></td>
<td>コードで管理したい方</td>
<td>AWS SAM テンプレートを使いインフラをコード化。再現性・管理性が高い</td>
</tr>
<tr>
<td><strong>コンソール版</strong></td>
<td>まず動かしてみたい方</td>
<td>マネジメントコンソールをクリック操作で構築。最短で全体像を把握できる</td>
</tr>
</tbody>
</table>
<p>「まずコンソール版で雰囲気をつかんでからSAM版でコード化する」という順番もおすすめです。</p>
<blockquote>
<p>今後もハンズオン記事を追加し次第、このページに随時追記していきます。</p>
</blockquote>
<p><a rel="nofollow" href="//af.moshimo.com/af/c/click?a_id=1384942&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fs%3Fk%3D%25E6%259C%25AC%2BAWS%2B%25E9%2596%258B%25E7%2599%25BA%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D1DE63UBHFOR4K%26sprefix%3D%25E6%259C%25AC%2Baws%2B%25E9%2596%258B%25E7%2599%25BA%252Caps%252C167%26ref%3Dnb_sb_noss" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 AWS 開発]</a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=1384942&p_id=170&pc_id=185&pl_id=4062" width="1" height="1" style="border:none;" alt="" loading="lazy"></p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解)","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51DEDQXj6oL._SL500_.jpg","\/41F589smNwL._SL500_.jpg","\/41R6f9yyCWL._SL500_.jpg","\/41HqWQ9BvmL._SL500_.jpg","\/41p8p0ZU79L._SL500_.jpg","\/41qLC-fndBL._SL500_.jpg","\/41fcLv9VT5L._SL500_.jpg","\/51lRvCsvHqL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815607850","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4815607850","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%BB%E4%BB%95%E7%B5%84%E3%81%BF%E3%83%BB%E9%87%8D%E8%A6%81%E7%94%A8%E8%AA%9E%E3%81%8C%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8%20(%E8%A6%8B%E3%82%8B%E3%81%A0%E3%81%91%E5%9B%B3%E8%A7%A3)\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%BB%E4%BB%95%E7%B5%84%E3%81%BF%E3%83%BB%E9%87%8D%E8%A6%81%E7%94%A8%E8%AA%9E%E3%81%8C%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8%20(%E8%A6%8B%E3%82%8B%E3%81%A0%E3%81%91%E5%9B%B3%E8%A7%A3)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"eaCUB","s":"s"});</script></p>
<div id="msmaflink-eaCUB">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<hr>
<h2><span id="toc2">🗺️ ハンズオン難易度マップ</span></h2>
<table>
<thead>
<tr>
<th>難易度</th>
<th>Tier</th>
<th>対象サービス</th>
<th>課金リスク</th>
</tr>
</thead>
<tbody>
<tr>
<td>★☆☆☆☆</td>
<td>入門</td>
<td>CloudFormation + EC2</td>
<td>小（t2.micro無料枠）</td>
</tr>
<tr>
<td>★★☆☆☆</td>
<td>Tier 1</td>
<td>S3, CloudFront, EventBridge, Lambda</td>
<td>極小</td>
</tr>
<tr>
<td>★★★☆☆</td>
<td>Tier 2</td>
<td>SQS, Step Functions, Cognito, API Gateway, DynamoDB, SNS</td>
<td>小〜中</td>
</tr>
<tr>
<td>★★★★☆</td>
<td>Tier 3</td>
<td>Rekognition, CloudWatch Logs</td>
<td>小（無料枠あり）</td>
</tr>
<tr>
<td>★★★★☆</td>
<td>実務</td>
<td>S3 + CloudFront + WAF</td>
<td>中（WAFは有料）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">📌 入門編：IaC の第一歩</span></h2>
<h3><span id="toc4">CloudFormationでWeb自動起動EC2を構築</span></h3>
<p><!-- ![CloudFormation + EC2 構成図](images/ec2-cloudformation.jpg) --></p>
<p>AWSのインフラをコードで管理する「IaC（Infrastructure as Code）」の入口となるハンズオンです。マネジメントコンソールで手動構築したEC2インスタンスを、CloudFormationテンプレートに置き換えることで、<strong>再現性・バージョン管理・チーム共有</strong>の価値を体感できます。</p>
<p><strong>難易度</strong>: ★☆☆☆☆<br /><strong>学習時間の目安</strong>: 60〜90分<br /><strong>課金リスク</strong>: 小（t2.micro 無料枠対象）</p>
<p><strong>学べること</strong></p>
<ul>
<li>CloudFormation テンプレートの基本構造（YAML）</li>
<li>EC2インスタンス・セキュリティグループ・KeyPairのコード定義</li>
<li>VSCode + AWS CLI を使ったデプロイフロー</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「AWSはコンソールで触ったことがあるけど、コードでインフラ管理をしてみたい」という方の最初の一歩に最適です。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>CloudFormation版（IaC）</td>
<td><a href="https://caymezon.com/aws-ec2-cloudformation-vscode-guide/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc5">🟢 Tier 1：簡単 / 課金リスク極小</span></h2>
<h3><span id="toc6">1. S3 + CloudFront 静的サイトホスティング</span></h3>
<p><!-- ![S3 + CloudFront 構成図](images/s3-cloudfront-hosting.jpg) --></p>
<p>S3バケットにHTMLを配置し、CloudFront経由でCDN配信する静的サイトホスティング環境を構築します。OAC（Origin Access Control）を使ってS3を非公開にしつつCloudFrontからのみアクセスを許可するセキュアな構成を学べます。</p>
<p><strong>難易度</strong>: ★★☆☆☆<br /><strong>学習時間の目安</strong>: 30〜60分<br /><strong>課金リスク</strong>: 極小（CloudFront 無料枠 1TB/月、S3 GET は少額）</p>
<p><strong>学べること</strong></p>
<ul>
<li>S3バケットのパブリックアクセスブロック設定</li>
<li>CloudFront ディストリビューション作成と OAC 設定</li>
<li>HTTPSリダイレクト、キャッシュ無効化（Invalidation）の操作</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「ウェブサイトをサーバーレスで公開したい」「CDNとキャッシュの仕組みを理解したい」方に最適。CloudFrontの基本を押さえたい方はここから始めてください。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-s3-cloudfront-hosting/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版</td>
<td><a href="https://caymezon.com/aws-handson-console-s3-cloudfront-hosting/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h3><span id="toc7">2. EventBridge + Lambda 定期バッチ実行</span></h3>
<p><!-- ![EventBridge + Lambda 構成図](images/eventbridge-lambda-batch.jpg) --></p>
<p>EventBridgeのスケジュールルールを使って、Lambdaを定期実行する「Cronバッチ」を構築します。rate式（例: 毎5分）とcron式（例: 毎日午前9時）の両方を試し、イベント駆動アーキテクチャの基本を体感できます。</p>
<p><strong>難易度</strong>: ★★☆☆☆<br /><strong>学習時間の目安</strong>: 30〜60分<br /><strong>課金リスク</strong>: 極小（Lambda 無料枠 100万リクエスト/月）</p>
<p><strong>学べること</strong></p>
<ul>
<li>EventBridge スケジュールルールの作成（rate / cron式）</li>
<li>Lambda 関数のIAMロール設定</li>
<li>CloudWatch Logs でのログ確認</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「定期実行処理をサーバーレスで実装したい」「cron式の書き方を理解したい」方向け。Lambdaの基本と組み合わせて最初のサーバーレスハンズオンとしても最適です。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-eventbridge-lambda-batch/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版</td>
<td><a href="https://caymezon.com/aws-handson-console-eventbridge-lambda-batch/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h3><span id="toc8">3. S3 ファイルアップロード → Lambda 非同期処理</span></h3>
<p><!-- ![S3 Event + Lambda 構成図](images/s3-event-lambda.jpg) --></p>
<p>S3バケットへのファイルアップロードをトリガーに、Lambdaを自動起動する非同期処理パイプラインを構築します。ファイルアップロードをイベントとして扱う「イベント駆動」の基本パターンです。</p>
<p><strong>難易度</strong>: ★★☆☆☆<br /><strong>学習時間の目安</strong>: 30〜60分<br /><strong>課金リスク</strong>: 極小（S3 PUT + Lambda 実行のみ）</p>
<p><strong>学べること</strong></p>
<ul>
<li>S3 ObjectCreated イベント通知の設定</li>
<li>Lambda トリガーとリソースベースポリシー</li>
<li>URLデコード処理（日本語ファイル名対応）</li>
<li>DeletionPolicy によるバケット削除制御</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「ファイルをアップロードしたら自動で何か処理したい」ユースケース（画像変換、CSV取り込みなど）の基礎を学びたい方向け。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-s3-event-lambda/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版</td>
<td><a href="https://caymezon.com/aws-handson-console-s3-event-lambda/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h3><span id="toc9">4. SQS + Lambda メッセージキュー処理</span></h3>
<p><!-- ![SQS + Lambda 構成図](images/sqs-lambda-queue.jpg) --></p>
<p>SQSキューにメッセージを投入し、Lambdaがポーリングして処理するメッセージキューアーキテクチャを構築します。処理失敗時に備えたDLQ（デッドレターキュー）も合わせて実装します。</p>
<p><strong>難易度</strong>: ★★★☆☆<br /><strong>学習時間の目安</strong>: 60分<br /><strong>課金リスク</strong>: 極小（SQS 無料枠 100万リクエスト/月）</p>
<p><strong>学べること</strong></p>
<ul>
<li>SQS標準キューとDLQ（デッドレターキュー）の作成</li>
<li>RedrivePolicy（最大受信数・DLQ連携）の設定</li>
<li>Lambda SQSポーリングとバッチ処理</li>
<li>IAM権限（SQSPollerPolicy）の付与</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「非同期処理・リトライ・失敗メッセージ管理を学びたい」方向け。マイクロサービス間の疎結合通信の基礎として重要なパターンです。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-sqs-lambda-queue/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版</td>
<td><a href="https://caymezon.com/aws-handson-console-sqs-lambda-queue/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc10">🟡 Tier 2：中程度 / 少し設定多め</span></h2>
<h3><span id="toc11">5. Step Functions + Lambda 受注処理ワークフロー</span></h3>
<p><!-- ![Step Functions + Lambda 構成図](images/step-functions-lambda.jpg) --></p>
<p>Step Functionsのステートマシンを使って、注文検証→在庫確認・支払い処理（並列）→注文確定という受注処理ワークフローを構築します。ビジュアルエディタ（Workflow Studio）とASLコードの両面からワークフローを理解できます。</p>
<p><strong>難易度</strong>: ★★★☆☆<br /><strong>学習時間の目安</strong>: 60〜90分<br /><strong>課金リスク</strong>: 小（Step Functions 無料枠 4,000回のステート遷移/月）</p>
<p><strong>学べること</strong></p>
<ul>
<li>Task / Parallel / Retry / Catch ステートの定義</li>
<li>ASL（Amazon States Language）の記述</li>
<li><code>DefinitionSubstitutions</code> による Lambda ARN の動的差し込み（SAM版）</li>
<li>Workflow Studio（ビジュアルエディタ）の操作（コンソール版）</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「複数処理のオーケストレーションを学びたい」「並列処理やエラーハンドリングを含む業務フローをAWSで実装したい」方向け。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-step-functions-lambda/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版</td>
<td><a href="https://caymezon.com/aws-handson-console-step-functions-lambda/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h3><span id="toc12">6. Lambda + API Gateway + DynamoDB メモアプリAPI</span></h3>
<p><!-- ![Lambda + API Gateway + DynamoDB 構成図](images/memo-api-dynamodb.jpg) --></p>
<p>Lambda・API Gateway・DynamoDBを組み合わせて、メモの作成・取得・更新・削除（CRUD）ができるREST APIをサーバーレスで構築します。実用的なCRUD APIの実装パターンを一通り学べます。</p>
<p><strong>難易度</strong>: ★★★☆☆<br /><strong>学習時間の目安</strong>: 60〜90分<br /><strong>課金リスク</strong>: 小（DynamoDB 無料枠 25GBストレージ・25RCU/WCU）</p>
<p><strong>学べること</strong></p>
<ul>
<li>DynamoDB テーブル設計（パーティションキー・ソートキー）</li>
<li>Lambda からの boto3 による DynamoDB 操作（CRUD）</li>
<li>API Gateway REST API のリソース・メソッド設定</li>
<li>Lambda プロキシ統合とレスポンス形式</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「サーバーレスでWebAPIを作りたい」「DynamoDBの基本操作を覚えたい」方向け。フロントエンドと組み合わせるバックエンドAPI開発の基礎として最適です。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版</td>
<td><a href="https://caymezon.com/aws-handson-console-lambda-apigateway-dynamodb/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h3><span id="toc13">7. Cognito + API Gateway + Lambda 認証付きAPI</span></h3>
<p><!-- ![Cognito + API Gateway + Lambda 構成図](images/cognito-api-lambda.jpg) --></p>
<p>Amazon CognitoのUser Poolを使ってJWT認証付きAPIを構築します。API Gatewayに Cognito Authorizer を設定することで、Lambdaコードを変更せずに認証を追加できる設計パターンを学べます。</p>
<p><strong>難易度</strong>: ★★★☆☆<br /><strong>学習時間の目安</strong>: 90〜120分<br /><strong>課金リスク</strong>: 小（Cognito 無料枠 5万MAU/月）</p>
<p><strong>学べること</strong></p>
<ul>
<li>Cognito User Pool・User Pool Client の作成</li>
<li>IDトークン（JWT）の取得と検証フロー</li>
<li>API Gateway Cognito Authorizer の設定</li>
<li>DefaultAuthorizer によるAPI全体への認証適用</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「ログイン機能付きAPIを作りたい」「JWT認証の仕組みを理解したい」方向け。独自の認証基盤を実装するより安全で、スケーラブルな認証設計を学べます。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-cognito-api-gateway-lambda/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版（新UI対応）</td>
<td><a href="https://caymezon.com/aws-handson-console-cognito-api-gateway-lambda/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h3><span id="toc14">8. SNS + SQS + Lambda 通知システム（Pub/Sub・ファンアウト）</span></h3>
<p><!-- ![SNS + SQS + Lambda 構成図](images/sns-sqs-lambda.jpg) --></p>
<p>SNSトピックに発行したメッセージを複数のSQSキューに配信するファンアウトパターンを構築します。フィルターポリシーを使って「全ログ記録用」と「アラート用」でメッセージを振り分ける実践的な通知システムです。</p>
<p><strong>難易度</strong>: ★★★☆☆<br /><strong>学習時間の目安</strong>: 90分<br /><strong>課金リスク</strong>: 小（SNS 無料枠 100万リクエスト/月）</p>
<p><strong>学べること</strong></p>
<ul>
<li>SNS Topic の作成と SQS サブスクリプション設定</li>
<li>FilterPolicy によるメッセージ振り分け</li>
<li>SQSQueuePolicy の明示的な設定（SAM版）</li>
<li>複数Lambda によるファンアウト処理パターン</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「Pub/Subパターンやマイクロサービス間のイベント通知を学びたい」方向け。複数の処理を並列で起動するファンアウト設計はモダンなシステムの定番パターンです。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-sns-sqs-lambda/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版</td>
<td><a href="https://caymezon.com/aws-handson-console-sns-sqs-lambda/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc15">🔴 Tier 3：少し複雑 / AWSらしいユースケース</span></h2>
<h3><span id="toc16">9. S3 + Lambda + Rekognition 画像認識パイプライン</span></h3>
<p><!-- ![S3 + Lambda + Rekognition 構成図](images/rekognition-image-pipeline.jpg) --></p>
<p>S3に画像をアップロードするとLambdaが起動し、Amazon RekognitionのDetectLabels APIでAI/ML画像認識を行うパイプラインを構築します。特別な機械学習の知識なしにAI機能を組み込める体験ができます。</p>
<p><strong>難易度</strong>: ★★★★☆<br /><strong>学習時間の目安</strong>: 60〜90分<br /><strong>課金リスク</strong>: 小（Rekognition 無料枠 5,000枚/月）</p>
<p><strong>学べること</strong></p>
<ul>
<li>Amazon Rekognition DetectLabels API の使い方</li>
<li>S3 + Lambda イベント駆動パイプラインの実装</li>
<li><code>RekognitionDetectOnlyPolicy</code> / <code>S3ReadPolicy</code> 組み込みポリシー（SAM版）</li>
<li>最小権限原則に基づいたIAM設計</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「AWSのAI/MLサービスを試してみたい」「画像に写っているものを自動分類したい」方向け。機械学習の実装不要でAI機能を組み込める体験は必見です。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-rekognition-image-pipeline/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版</td>
<td><a href="https://caymezon.com/aws-handson-console-rekognition-image-pipeline/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h3><span id="toc17">10. API Gateway + Lambda + CloudWatch Logs チャットボットログAPI</span></h3>
<p><!-- ![API Gateway + Lambda + CloudWatch Logs 構成図](images/chatbot-log-api.jpg) --></p>
<p>チャットボットの会話ログをAPIで受け取り、CloudWatch Logsに保存・集計する仕組みを構築します。Metric Filterを使ってJSONログからカスタムメトリクスを自動生成する監視基盤の実装です。</p>
<p><strong>難易度</strong>: ★★★★☆<br /><strong>学習時間の目安</strong>: 90〜120分<br /><strong>課金リスク</strong>: 小（CloudWatch Logs 無料枠 5GB/月）</p>
<p><strong>学べること</strong></p>
<ul>
<li>CloudWatch Log Group の作成とログ保存</li>
<li>Metric Filter（JSONフィルター）によるカスタムメトリクス生成</li>
<li>boto3 <code>logs.put_log_events()</code> を使ったログ書き込み</li>
<li>IAM インラインポリシーの Statement 直接記述（SAM版）</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「ログ管理・監視基盤に興味がある」「メトリクスの自動収集の仕組みを理解したい」方向け。CloudWatch の活用度を上げたいエンジニアに特におすすめです。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAM版（IaC）</td>
<td><a href="https://caymezon.com/aws-handson-chatbot-log-api/">記事を読む</a></td>
</tr>
<tr>
<td>コンソール版</td>
<td><a href="https://caymezon.com/aws-handson-console-chatbot-log-api/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc18">🔧 実務ハンズオン編</span></h2>
<h3><span id="toc19">S3 + CloudFront + WAF IP制限付き静的サイト配信</span></h3>
<p><!-- ![S3 + CloudFront + WAF 構成図](images/s3-cloudfront-waf.jpg) --></p>
<p>S3 + CloudFrontの静的サイト構成にWAFを追加し、特定IPアドレスのみアクセスを許可するセキュリティ構成を構築します。実務でよくある「社内向け静的サイト」や「ステージング環境のIP制限」に対応した実践的な内容です。</p>
<p><strong>難易度</strong>: ★★★★☆<br /><strong>学習時間の目安</strong>: 90〜120分<br /><strong>課金リスク</strong>: 中（WAF WebACL: 約$5/月 + $0.60/100万リクエスト）</p>
<p><strong>学べること</strong></p>
<ul>
<li>CloudFront OAC（Origin Access Control）のセキュアな設定</li>
<li>WAF WebACL の作成と IP セットによるアクセス制御</li>
<li>IPv4 / IPv6 デュアルスタック対応</li>
<li>実務的なトラブルシューティング（キャッシュ・ルール反映の遅延など）</li>
</ul>
<p><strong>こんな方におすすめ</strong><br />「CloudFront + WAFによるセキュリティ強化を実装したい」「実務でIP制限付きサイトを構築する予定がある」方向け。Tier 1の「S3 + CloudFront 静的サイトホスティング」を先にやっておくとスムーズです。</p>
<table>
<thead>
<tr>
<th>バージョン</th>
<th>リンク</th>
</tr>
</thead>
<tbody>
<tr>
<td>実務版（解説記事）</td>
<td><a href="https://caymezon.com/aws-handson-s3-cloudfront-waf/">記事を読む</a></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc20">📊 全ハンズオン一覧</span></h2>
<table>
<thead>
<tr>
<th>#</th>
<th>テーマ</th>
<th>使用サービス</th>
<th>難易度</th>
<th>SAM版</th>
<th>コンソール版</th>
</tr>
</thead>
<tbody>
<tr>
<td>入門</td>
<td>CloudFormation EC2構築</td>
<td>EC2, CloudFormation</td>
<td>★☆☆☆☆</td>
<td><a href="https://caymezon.com/aws-ec2-cloudformation-vscode-guide/">→</a></td>
<td>—</td>
</tr>
<tr>
<td>1</td>
<td>静的サイトホスティング</td>
<td>S3, CloudFront</td>
<td>★★☆☆☆</td>
<td><a href="https://caymezon.com/aws-handson-s3-cloudfront-hosting/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-s3-cloudfront-hosting/">→</a></td>
</tr>
<tr>
<td>2</td>
<td>定期バッチ実行</td>
<td>EventBridge, Lambda</td>
<td>★★☆☆☆</td>
<td><a href="https://caymezon.com/aws-handson-eventbridge-lambda-batch/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-eventbridge-lambda-batch/">→</a></td>
</tr>
<tr>
<td>3</td>
<td>ファイルアップロードトリガー</td>
<td>S3, Lambda</td>
<td>★★☆☆☆</td>
<td><a href="https://caymezon.com/aws-handson-s3-event-lambda/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-s3-event-lambda/">→</a></td>
</tr>
<tr>
<td>4</td>
<td>メッセージキュー処理</td>
<td>SQS, Lambda</td>
<td>★★★☆☆</td>
<td><a href="https://caymezon.com/aws-handson-sqs-lambda-queue/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-sqs-lambda-queue/">→</a></td>
</tr>
<tr>
<td>5</td>
<td>ワークフロー処理</td>
<td>Step Functions, Lambda</td>
<td>★★★☆☆</td>
<td><a href="https://caymezon.com/aws-handson-step-functions-lambda/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-step-functions-lambda/">→</a></td>
</tr>
<tr>
<td>6</td>
<td>メモアプリAPI（CRUD）</td>
<td>API Gateway, Lambda, DynamoDB</td>
<td>★★★☆☆</td>
<td><a href="https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-lambda-apigateway-dynamodb/">→</a></td>
</tr>
<tr>
<td>7</td>
<td>認証付きAPI</td>
<td>Cognito, API Gateway, Lambda</td>
<td>★★★☆☆</td>
<td><a href="https://caymezon.com/aws-handson-cognito-api-gateway-lambda/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-cognito-api-gateway-lambda/">→</a></td>
</tr>
<tr>
<td>8</td>
<td>通知システム（Pub/Sub）</td>
<td>SNS, SQS, Lambda</td>
<td>★★★☆☆</td>
<td><a href="https://caymezon.com/aws-handson-sns-sqs-lambda/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-sns-sqs-lambda/">→</a></td>
</tr>
<tr>
<td>9</td>
<td>画像認識パイプライン</td>
<td>S3, Lambda, Rekognition</td>
<td>★★★★☆</td>
<td><a href="https://caymezon.com/aws-handson-rekognition-image-pipeline/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-rekognition-image-pipeline/">→</a></td>
</tr>
<tr>
<td>10</td>
<td>チャットボットログAPI</td>
<td>API Gateway, Lambda, CloudWatch</td>
<td>★★★★☆</td>
<td><a href="https://caymezon.com/aws-handson-chatbot-log-api/">→</a></td>
<td><a href="https://caymezon.com/aws-handson-console-chatbot-log-api/">→</a></td>
</tr>
<tr>
<td>実務</td>
<td>IP制限付き静的サイト</td>
<td>S3, CloudFront, WAF</td>
<td>★★★★☆</td>
<td>—</td>
<td><a href="https://caymezon.com/aws-handson-s3-cloudfront-waf/">→</a></td>
</tr>
</tbody>
</table>
<p><a rel="nofollow" href="//af.moshimo.com/af/c/click?a_id=1384942&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fs%3Fk%3D%25E6%259C%25AC%2BAWS%2B%25E9%2596%258B%25E7%2599%25BA%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D1DE63UBHFOR4K%26sprefix%3D%25E6%259C%25AC%2Baws%2B%25E9%2596%258B%25E7%2599%25BA%252Caps%252C167%26ref%3Dnb_sb_noss" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 AWS 開発]</a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=1384942&p_id=170&pc_id=185&pl_id=4062" width="1" height="1" style="border:none;" alt="" loading="lazy"></p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"AWS運用入門 改訂第2版 押さえておきたいAWSの基本と運用ノウハウ [AWS深掘りガイド]","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51AAOubymTL._SL500_.jpg","\/51VMG6YKHdL._SL500_.jpg","\/41EdPB8azAL._SL500_.jpg","\/41v2JFE-9jL._SL500_.jpg","\/41FEEqR-yDL._SL500_.jpg","\/41JfZAdnTPL._SL500_.jpg","\/41vGK0czQrL._SL500_.jpg","\/41-SnYtz2aL._SL500_.jpg","\/41sPrV5fi3L._SL500_.jpg","\/41p7JtvYJ1L._SL500_.jpg","\/4169GVNTs8L._SL500_.jpg","\/41BPI5HP3zL._SL500_.jpg","\/41QOyk60CYL._SL500_.jpg","\/41APjk6FphL._SL500_.jpg","\/41ezKUu7VRL._SL500_.jpg","\/41A1n3K+r5L._SL500_.jpg","\/41aY2T8lEOL._SL500_.jpg","\/419Ca1V6HZL._SL500_.jpg","\/41zQkYyLPzL._SL500_.jpg","\/41YpHcyxiTL._SL500_.jpg","\/41-tKN5mt6L._SL500_.jpg","\/419Mv6m55IL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815631085","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4815631085","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/AWS%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=AWS%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"E8MM1","s":"s"});</script></p>
<div id="msmaflink-E8MM1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<hr>
<h2><span id="toc21">さいごに</span></h2>
<p>各ハンズオンは<strong>難易度順</strong>に進めるとスムーズに学習できます。ただし、興味のあるテーマから始めても問題ありません。</p>
<p><strong>学習の進め方の例:</strong></p>
<ol>
<li><strong>IaC入門</strong> → CloudFormation EC2でコードによるインフラ管理を体験</li>
<li><strong>Tier 1</strong> → EventBridge + Lambda の定期実行でサーバーレスの基本を把握</li>
<li><strong>Tier 2</strong> → メモアプリAPIやCognitoで実用的なAPIを構築</li>
<li><strong>Tier 3 / 実務</strong> → 画像認識やWAFを追加して本格的な構成へ</li>
</ol>
<p>また、同じテーマの<strong>コンソール版で全体像をつかんでからSAM版でコード化</strong>するという進め方もおすすめです。IaC化の効率性と再現性を実感できます。</p>
<p>引き続きハンズオン記事を追加予定ですので、ぜひブックマークしてご活用ください！</p><p>The post <a href="https://caymezon.com/aws-handson-summary/">【保存版】AWS実践ハンズオン記事まとめ｜サーバーレス・インフラ・AIを難易度別に完全網羅</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-summary/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWSハンズオン - Step Functions + Lambda で受注処理ワークフローをSAMで構築しよう【コンソール版との比較付き】</title>
		<link>https://caymezon.com/aws-handson-step-functions-lambda/</link>
					<comments>https://caymezon.com/aws-handson-step-functions-lambda/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sun, 01 Mar 2026 05:25:21 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[IaC]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[SAM]]></category>
		<category><![CDATA[StepFunctions]]></category>
		<category><![CDATA[エラー処理]]></category>
		<category><![CDATA[サーバーレス]]></category>
		<category><![CDATA[ステートマシン]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[ワークフロー]]></category>
		<category><![CDATA[並列処理]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20231</guid>

					<description><![CDATA[<p>目次 はじめにSAM vs コンソール：どれだけ違うかキーワード解説前提条件使用するAWSサービスStep 1: プロジェクトフォルダを開くフォルダ構造Step 2: SAMテンプレートの確認（template.yaml [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-step-functions-lambda/">AWSハンズオン - Step Functions + Lambda で受注処理ワークフローをSAMで構築しよう【コンソール版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">SAM vs コンソール：どれだけ違うか</a></li><li><a href="#toc3" tabindex="0">キーワード解説</a></li><li><a href="#toc4" tabindex="0">前提条件</a></li><li><a href="#toc5" tabindex="0">使用するAWSサービス</a></li><li><a href="#toc6" tabindex="0">Step 1: プロジェクトフォルダを開く</a><ol><li><a href="#toc7" tabindex="0">フォルダ構造</a></li></ol></li><li><a href="#toc8" tabindex="0">Step 2: SAMテンプレートの確認（template.yaml）</a><ol><li><a href="#toc9" tabindex="0">Lambda 関数の定義</a></li><li><a href="#toc10" tabindex="0">ステートマシンの定義</a></li><li><a href="#toc11" tabindex="0">template.yaml のポイント解説</a></li></ol></li><li><a href="#toc12" tabindex="0">Step 3: Lambda コードの確認（src/）</a></li><li><a href="#toc13" tabindex="0">Step 4: samconfig.toml を作成する</a></li><li><a href="#toc14" tabindex="0">Step 5: sam build（ビルド）</a></li><li><a href="#toc15" tabindex="0">Step 6: sam deploy（デプロイ）</a><ol><li><a href="#toc16" tabindex="0">デプロイ完了の確認</a></li><li><a href="#toc17" tabindex="0">デプロイされるリソース一覧</a></li></ol></li><li><a href="#toc18" tabindex="0">Step 7: 動作テスト</a><ol><li><a href="#toc19" tabindex="0">事前準備: ARN を変数に設定する</a></li><li><a href="#toc20" tabindex="0">テスト1: 正常処理</a></li><li><a href="#toc21" tabindex="0">テスト2: 在庫切れエラー（ProcessInParallel Catch の確認）</a></li><li><a href="#toc22" tabindex="0">テスト3: 支払い失敗エラー（ProcessInParallel Catch の確認）</a></li><li><a href="#toc23" tabindex="0">テスト4: 検証エラー（ValidateOrder Retry + Catch の確認）</a></li></ol></li><li><a href="#toc24" tabindex="0">Step 8: AWSコンソールで確認（任意）</a></li><li><a href="#toc25" tabindex="0">Step 9: リソースの削除</a><ol><li><a href="#toc26" tabindex="0">削除完了の確認</a></li><li><a href="#toc27" tabindex="0">sam delete で削除されるリソース一覧</a></li></ol></li><li><a href="#toc28" tabindex="0">トラブルシューティング</a></li><li><a href="#toc29" tabindex="0">まとめ</a><ol><li><a href="#toc30" tabindex="0">SAMのメリットを実感できたポイント</a></li></ol></li><li><a href="#toc31" tabindex="0">コンソール版と比較してみる</a></li><li><a href="#toc32" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>「複数のLambda関数をオーケストレーションするワークフローを、コードで管理したい」という要件に、<strong>AWS SAM（Serverless Application Model）</strong> は最適な選択肢のひとつです。</p>
<p>この記事では、<strong>AWS SAM</strong> を使って、受注処理ワークフロー（注文検証 → 在庫確認・支払い並列処理 → 注文確定）をゼロから構築するハンズオンを紹介します。</p>
<pre><code class="language-plaintext">入力: {"order_id": "ORD-001", "item_id": "item-001", "quantity": 2}
  ↓
[ValidateOrder] 注文検証（Retry + Catch）
  ↓ 成功
[ProcessInParallel] 並列処理（Catch）
  ├─ [CheckInventory] 在庫確認
  └─ [ProcessPayment] 支払い処理
  ↓ 成功（結果リスト: [inventory_result, payment_result]）
[ConfirmOrder] 注文確定
  ↓
終了（成功）

[HandleError] エラー処理（Catch 先）
  ↓
終了（エラー通知済み）</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li><code>AWS::Serverless::StateMachine</code> を使った Step Functions の SAM 定義</li>
<li><code>DefinitionSubstitutions</code> で ASL 内の Lambda ARN を <strong>自動差し込み</strong>する仕組み</li>
<li><code>LambdaInvokePolicy</code> による1行での権限付与（コンソール版ではIAMロールを自動生成）</li>
<li>CLI でのテスト実行 + コンソールの実行グラフで視覚的に確認</li>
</ul>
<p><strong>このハンズオンの特徴：</strong></p>
<ul>
<li><code>sam build</code> + <code>sam deploy</code> の <strong>2コマンドで全リソースをデプロイ</strong></li>
<li>Step Functions（ステートマシン）+ Lambda × 5 + IAM ロール × 6 を <code>template.yaml</code> 1ファイルで管理</li>
<li><code>sam delete</code> で<strong>全リソースを一括削除</strong>（コンソール版では5つのLambda・ステートマシン・IAMロールを個別に削除）</li>
</ul>
<hr>
<p><a rel="nofollow" href="//af.moshimo.com/af/c/click?a_id=1384942&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fs%3Fk%3D%25E6%259C%25AC%2BAWS%2B%25E9%2596%258B%25E7%2599%25BA%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D1DE63UBHFOR4K%26sprefix%3D%25E6%259C%25AC%2Baws%2B%25E9%2596%258B%25E7%2599%25BA%252Caps%252C167%26ref%3Dnb_sb_noss" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 AWS 開発]</a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=1384942&p_id=170&pc_id=185&pl_id=4062" width="1" height="1" style="border:none;" alt="" loading="lazy"></p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解)","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51DEDQXj6oL._SL500_.jpg","\/41F589smNwL._SL500_.jpg","\/41R6f9yyCWL._SL500_.jpg","\/41HqWQ9BvmL._SL500_.jpg","\/41p8p0ZU79L._SL500_.jpg","\/41qLC-fndBL._SL500_.jpg","\/41fcLv9VT5L._SL500_.jpg","\/51lRvCsvHqL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815607850","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4815607850","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%BB%E4%BB%95%E7%B5%84%E3%81%BF%E3%83%BB%E9%87%8D%E8%A6%81%E7%94%A8%E8%AA%9E%E3%81%8C%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8%20(%E8%A6%8B%E3%82%8B%E3%81%A0%E3%81%91%E5%9B%B3%E8%A7%A3)\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%BB%E4%BB%95%E7%B5%84%E3%81%BF%E3%83%BB%E9%87%8D%E8%A6%81%E7%94%A8%E8%AA%9E%E3%81%8C%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8%20(%E8%A6%8B%E3%82%8B%E3%81%A0%E3%81%91%E5%9B%B3%E8%A7%A3)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"eaCUB","s":"s"});</script></p>
<div id="msmaflink-eaCUB">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">SAM vs コンソール：どれだけ違うか</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>SAM（コード）</th>
<th>コンソール（手動）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Lambda ARN の参照</strong></td>
<td><code>${ValidateFunctionArn}</code> で自動差し込み</td>
<td>5関数のARNを手動でコピー・貼り付け</td>
</tr>
<tr>
<td><strong>IAM ロール</strong></td>
<td><code>LambdaInvokePolicy</code> × 5 で自動生成</td>
<td>「新しいロールを作成」で自動生成（1回限り）</td>
</tr>
<tr>
<td><strong>ASL 定義の管理</strong></td>
<td><code>template.yaml</code> で Git 管理</td>
<td>コンソールのエディタのみ</td>
</tr>
<tr>
<td><strong>削除</strong></td>
<td><code>sam delete</code> 1コマンド</td>
<td>Lambda × 5 / ステートマシン / IAMロール / ロググループを個別に削除</td>
</tr>
<tr>
<td><strong>再現性</strong></td>
<td>チームで同じ環境を即座に再現できる</td>
<td>手順書が必要</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc3">キーワード解説</span></h2>
<table>
<thead>
<tr>
<th>用語</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>ステートマシン</strong></td>
<td>ワークフローの全体定義。状態（State）の集合と遷移ルールをもつ</td>
</tr>
<tr>
<td><strong>Task ステート</strong></td>
<td>Lambda などの外部リソースを呼び出す状態</td>
</tr>
<tr>
<td><strong>Parallel ステート</strong></td>
<td>複数のブランチを<strong>同時に実行</strong>する状態。両ブランチの結果がリストで次のステートに渡る</td>
</tr>
<tr>
<td><strong>Retry</strong></td>
<td>エラー発生時に同じステートを自動で<strong>再実行</strong>するルール</td>
</tr>
<tr>
<td><strong>Catch</strong></td>
<td>リトライ後もエラーが続く場合に<strong>別のステートへ遷移</strong>するルール</td>
</tr>
<tr>
<td><strong>ResultPath</strong></td>
<td>Catch 時にエラー情報をどのフィールドに格納するかの指定（<code>&quot;$.error&quot;</code> → 元の入力の <code>error</code> キーにマージ）</td>
</tr>
<tr>
<td><strong>ASL</strong></td>
<td>Amazon States Language。ステートマシン定義の JSON 形式</td>
</tr>
<tr>
<td><strong>DefinitionSubstitutions</strong></td>
<td>ASL 内の <code>${変数名}</code> を実際の値（ARN など）に置換するSAMの仕組み</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">前提条件</span></h2>
<table>
<thead>
<tr>
<th>ツール</th>
<th>確認コマンド</th>
<th>最低バージョン目安</th>
</tr>
</thead>
<tbody>
<tr>
<td>AWS CLI v2</td>
<td><code>aws --version</code></td>
<td>2.x</td>
</tr>
<tr>
<td>AWS SAM CLI</td>
<td><code>sam --version</code></td>
<td>1.x</td>
</tr>
<tr>
<td>Python 3.12</td>
<td><code>python --version</code></td>
<td>3.12</td>
</tr>
<tr>
<td>Git</td>
<td><code>git --version</code></td>
<td>-</td>
</tr>
<tr>
<td>VSCode</td>
<td>-</td>
<td>最新版推奨</td>
</tr>
</tbody>
</table>
<pre><code class="language-cmd">aws sts get-caller-identity</code></pre>
<p>アカウントIDが表示されれば認証設定済みです。</p>
<hr>
<h2><span id="toc5">使用するAWSサービス</span></h2>
<table>
<thead>
<tr>
<th>サービス</th>
<th>役割</th>
<th>料金</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Step Functions</strong></td>
<td>ワークフロー（ステートマシン）の管理・実行</td>
<td>月4,000回の状態遷移まで無料（標準タイプ）</td>
</tr>
<tr>
<td><strong>Lambda</strong></td>
<td>各ステートで実行されるビジネスロジック（5関数）</td>
<td>月100万リクエスト・400,000 GB-秒まで無料</td>
</tr>
<tr>
<td><strong>IAM</strong></td>
<td>Lambda・Step Functionsの実行権限管理</td>
<td>無料</td>
</tr>
<tr>
<td><strong>S3</strong></td>
<td>SAM デプロイパッケージ置き場</td>
<td>少量のため実質無料</td>
</tr>
<tr>
<td><strong>CloudWatch Logs</strong></td>
<td>Lambdaの実行ログ</td>
<td>月5GBまで無料</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc6">Step 1: プロジェクトフォルダを開く</span></h2>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\step-functions-lambda</code></pre>
<h3><span id="toc7">フォルダ構造</span></h3>
<pre><code class="language-plaintext">step-functions-lambda/
├── template.yaml           # SAMテンプレート（Step Functions + Lambda 定義）
├── samconfig.toml          # デプロイ設定（gitignore 対象・毎回手動作成が必要）
├── docs/
│   ├── 1_console.md        # AWSコンソール版手順
│   └── 2_sam.md            # SAM版手順
└── src/
    ├── validate.py         # 注文検証 Lambda
    ├── inventory.py        # 在庫確認 Lambda
    ├── payment.py          # 支払い処理 Lambda
    ├── confirm.py          # 注文確定 Lambda
    └── error_handler.py    # エラー処理 Lambda</code></pre>
<hr>
<h2><span id="toc8">Step 2: SAMテンプレートの確認（template.yaml）</span></h2>
<p><code>template.yaml</code> は全 AWSリソースの設計図です。ポイントを確認しておきます。</p>
<h3><span id="toc9">Lambda 関数の定義</span></h3>
<pre><code class="language-yaml">Globals:
  Function:
    Runtime: python3.12
    Timeout: 10
    MemorySize: 128

Resources:
  ValidateFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/           # src/ 配下の全 .py を1つのパッケージとしてデプロイ
      Handler: validate.lambda_handler

  InventoryFunction:          # 在庫確認（Parallel ブランチ 1）
  PaymentFunction:            # 支払い処理（Parallel ブランチ 2）
  ConfirmFunction:            # 注文確定
  ErrorHandlerFunction:       # エラー処理（Catch 先）</code></pre>
<p><strong>ポイント:</strong> 5つの Lambda 関数が全て <code>CodeUri: src/</code> を共有しています。SAM は <code>src/</code> フォルダを1つの ZIP パッケージとして S3 にアップロードし、各関数は <code>Handler</code> でどのファイル・関数を使うかを指定します。</p>
<h3><span id="toc10">ステートマシンの定義</span></h3>
<pre><code class="language-yaml">  OrderWorkflow:
    Type: AWS::Serverless::StateMachine
    Properties:
      Type: STANDARD
      Definition:
        StartAt: ValidateOrder
        States:
          ValidateOrder:
            Type: Task
            Resource: "${ValidateFunctionArn}"   # DefinitionSubstitutions で実際の ARN に置換
            Next: ProcessInParallel
            Retry:
              - ErrorEquals: [States.ALL]
                IntervalSeconds: 2
                MaxAttempts: 1
                BackoffRate: 2.0
            Catch:
              - ErrorEquals: [States.ALL]
                Next: HandleError
                ResultPath: "$.error"

          ProcessInParallel:
            Type: Parallel
            Branches:
              - StartAt: CheckInventory
                States:
                  CheckInventory:
                    Type: Task
                    Resource: "${InventoryFunctionArn}"
                    End: true
              - StartAt: ProcessPayment
                States:
                  ProcessPayment:
                    Type: Task
                    Resource: "${PaymentFunctionArn}"
                    End: true
            Next: ConfirmOrder
            Catch:
              - ErrorEquals: [States.ALL]
                Next: HandleError
                ResultPath: "$.error"

          ConfirmOrder:
            Type: Task
            Resource: "${ConfirmFunctionArn}"
            End: true

          HandleError:
            Type: Task
            Resource: "${ErrorHandlerFunctionArn}"
            End: true

      DefinitionSubstitutions:           # ${変数名} を実際の ARN に自動置換
        ValidateFunctionArn: !GetAtt ValidateFunction.Arn
        InventoryFunctionArn: !GetAtt InventoryFunction.Arn
        PaymentFunctionArn: !GetAtt PaymentFunction.Arn
        ConfirmFunctionArn: !GetAtt ConfirmFunction.Arn
        ErrorHandlerFunctionArn: !GetAtt ErrorHandlerFunction.Arn

      Policies:                          # ステートマシンが Lambda を呼び出す IAM 権限
        - LambdaInvokePolicy:
            FunctionName: !Ref ValidateFunction
        - LambdaInvokePolicy:
            FunctionName: !Ref InventoryFunction
        - LambdaInvokePolicy:
            FunctionName: !Ref PaymentFunction
        - LambdaInvokePolicy:
            FunctionName: !Ref ConfirmFunction
        - LambdaInvokePolicy:
            FunctionName: !Ref ErrorHandlerFunction</code></pre>
<h3><span id="toc11">template.yaml のポイント解説</span></h3>
<table>
<thead>
<tr>
<th>ポイント</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong><code>DefinitionSubstitutions</code></strong></td>
<td>ASL 内の <code>${ValidateFunctionArn}</code> などを <code>!GetAtt ValidateFunction.Arn</code> で取得した実際の ARN に置換する。コンソール版で5回ARNをコピーする手間がなくなる</td>
</tr>
<tr>
<td><strong><code>LambdaInvokePolicy</code> × 5</strong></td>
<td>SAM 組み込みポリシー。<code>lambda:InvokeFunction</code> 権限を1行で付与。コンソール版ではIAMロールの自動生成で対応</td>
</tr>
<tr>
<td><strong><code>Type: STANDARD</code></strong></td>
<td>監査ログ・正確に1回実行・長時間実行対応。コンソール版では「標準」を選択する部分に対応</td>
</tr>
<tr>
<td><strong><code>ResultPath: &quot;$.error&quot;</code></strong></td>
<td>エラー情報を元の入力の <code>$.error</code> フィールドにマージして HandleError へ渡す</td>
</tr>
<tr>
<td><strong><code>CodeUri: src/</code>（共有）</strong></td>
<td>5関数で1つの src/ パッケージを共有。コードを変更すると全関数に反映される</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc12">Step 3: Lambda コードの確認（src/）</span></h2>
<p>各ファイルの役割を確認しておきます。</p>
<table>
<thead>
<tr>
<th>ファイル</th>
<th>ステート</th>
<th>特記事項</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>validate.py</code></td>
<td>ValidateOrder</td>
<td><code>order_id</code> / <code>item_id</code> / <code>quantity</code> を検証。欠けていると <code>ValueError</code></td>
</tr>
<tr>
<td><code>inventory.py</code></td>
<td>CheckInventory</td>
<td><code>item-999</code> で <code>ValueError</code>（在庫切れテスト用）</td>
</tr>
<tr>
<td><code>payment.py</code></td>
<td>ProcessPayment</td>
<td><code>fail_payment=True</code> で <code>RuntimeError</code>（支払い失敗テスト用）</td>
</tr>
<tr>
<td><code>confirm.py</code></td>
<td>ConfirmOrder</td>
<td><strong><code>event[0]</code>（在庫確認結果）と <code>event[1]</code>（支払い結果）を受け取る</strong>。Parallel 後はリスト形式になる</td>
</tr>
<tr>
<td><code>error_handler.py</code></td>
<td>HandleError</td>
<td><code>event[&quot;error&quot;]</code> にエラー情報、それ以外に元の入力が格納されている</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>各 Python コードの全文はコンソール版記事を参照してください。</strong><br />SAM版・コンソール版で使用する Lambda コードは共通です。コンソール版では各関数ごとにコードを貼り付ける手順とあわせて全文を掲載しています。</p>
<p>→ <a href="/aws-handson-console-step-functions-lambda/">AWSコンソールだけでStep Functions + Lambdaワークフローを構築する手順【SAM版との比較付き / 新UI対応】</a></p>
</blockquote>
<blockquote>
<p><strong><code>confirm.py</code> の <code>event[0]</code> / <code>event[1]</code> について：</strong><br />Parallel ステートが成功すると、各ブランチの出力が**配列（リスト）**にまとめられて次のステートに渡されます。このため ConfirmFunction は <code>event[0]</code> で在庫確認結果、<code>event[1]</code> で支払い結果にアクセスしています。この仕様を知らないと <code>list indices must be integers</code> エラーで詰まります。</p>
</blockquote>
<hr>
<h2><span id="toc13">Step 4: samconfig.toml を作成する</span></h2>
<p><code>samconfig.toml</code> は <code>.gitignore</code> で管理外のため、<strong>毎回手動で作成</strong>する必要があります。</p>
<p><code>step-functions-lambda/samconfig.toml</code> を新規作成して以下を貼り付けます。</p>
<pre><code class="language-toml">version = 0.1

[default.deploy.parameters]
stack_name = "step-functions-lambda-stack"
resolve_s3 = true
s3_prefix = "step-functions-lambda-stack"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
disable_rollback = true
image_repositories = []

[default.global.parameters]
region = "ap-northeast-1"</code></pre>
<blockquote>
<p><strong><code>samconfig.toml</code> の置き場所：</strong><br /><code>step-functions-lambda/</code> フォルダの<strong>直下</strong>に置く必要があります。</p>
</blockquote>
<hr>
<h2><span id="toc14">Step 5: sam build（ビルド）</span></h2>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\step-functions-lambda
sam build</code></pre>
<p>成功すると以下のように表示されます。</p>
<pre><code class="language-plaintext">Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml</code></pre>
<blockquote>
<p><strong><code>sam build</code> が行っていること：</strong></p>
<ul>
<li><code>src/</code> フォルダを ZIP パッケージ化して <code>.aws-sam/build/</code> に配置</li>
<li><code>template.yaml</code> を <code>.aws-sam/build/template.yaml</code> にコピー</li>
<li>Lambda デプロイの準備を整える</li>
</ul>
</blockquote>
<hr>
<h2><span id="toc15">Step 6: sam deploy（デプロイ）</span></h2>
<pre><code class="language-cmd">sam deploy</code></pre>
<p>変更内容が表示されて確認を求められます。</p>
<pre><code class="language-plaintext">Deploy this changeset? [y/N]: y</code></pre>
<p><code>y</code> を入力して進めます。数分でデプロイが完了します。</p>
<h3><span id="toc16">デプロイ完了の確認</span></h3>
<p>ターミナルに <strong>Outputs</strong> が表示されます。</p>
<pre><code class="language-plaintext">Outputs
----------------------------------------------------------------------
Key    OrderWorkflowArn
Value  arn:aws:states:ap-northeast-1:123456789012:stateMachine:step-functions-lambda-stack-order-workflow

Key    OrderWorkflowName
Value  step-functions-lambda-stack-order-workflow
----------------------------------------------------------------------</code></pre>
<p><strong><code>OrderWorkflowArn</code> を控えておきます。</strong>（テスト実行コマンドで使用）</p>
<h3><span id="toc17">デプロイされるリソース一覧</span></h3>
<pre><code class="language-plaintext">Step Functions ステートマシン × 1  : step-functions-lambda-stack-order-workflow
Lambda 関数 × 5                    : step-functions-lambda-stack-ValidateFunction-XXXX 他
IAM ロール × 6                     : ステートマシン用 × 1 / Lambda 用 × 5
S3                                 : SAM デプロイパッケージ
CloudWatch Logs                    : Lambda 自動生成ログ × 5</code></pre>
<hr>
<h2><span id="toc18">Step 7: 動作テスト</span></h2>
<h3><span id="toc19">事前準備: ARN を変数に設定する</span></h3>
<pre><code class="language-cmd">set SM_ARN=arn:aws:states:ap-northeast-1:123456789012:stateMachine:step-functions-lambda-stack-order-workflow</code></pre>
<blockquote>
<p><code>123456789012</code> を自分のアカウントIDに置き換えてください（Outputs の値をそのままコピーすればよいです）。</p>
</blockquote>
<hr>
<h3><span id="toc20">テスト1: 正常処理</span></h3>
<pre><code class="language-cmd">aws stepfunctions start-execution ^
  --state-machine-arn %SM_ARN% ^
  --name "test-normal-1" ^
  --input "{\"order_id\": \"ORD-001\", \"item_id\": \"item-001\", \"quantity\": 2}" ^
  --region ap-northeast-1</code></pre>
<p>レスポンス例:</p>
<pre><code class="language-json">{
    "executionArn": "arn:aws:states:ap-northeast-1:123456789012:execution:...:test-normal-1",
    "startDate": "2026-03-01T10:00:00.000000+09:00"
}</code></pre>
<p><strong>実行結果を確認（数秒後）:</strong></p>
<pre><code class="language-cmd">aws stepfunctions describe-execution ^
  --execution-arn "上記の executionArn" ^
  --region ap-northeast-1</code></pre>
<p><code>&quot;status&quot;: &quot;SUCCEEDED&quot;</code> と以下のような出力が表示されます。</p>
<pre><code class="language-json">{
  "order_id": "ORD-001",
  "item_id": "item-001",
  "quantity": 2,
  "amount": 2000,
  "confirmed_at": "2026-03-01T01:00:00.000000+00:00",
  "status": "confirmed"
}</code></pre>
<p><strong>AWSコンソールで実行グラフを確認（任意）:</strong></p>
<p>Step Functions → ステートマシン → <code>step-functions-lambda-stack-order-workflow</code> → 実行一覧 → <code>test-normal-1</code> をクリックすると、全ステートが緑色になり <code>ProcessInParallel</code> の2ブランチが同時に実行されたことを視覚的に確認できます。</p>
<p><!-- ![正常処理の実行グラフ](images/stepfunctions-sam-success.jpg) --></p>
<hr>
<h3><span id="toc21">テスト2: 在庫切れエラー（ProcessInParallel Catch の確認）</span></h3>
<pre><code class="language-cmd">aws stepfunctions start-execution ^
  --state-machine-arn %SM_ARN% ^
  --name "test-inventory-error" ^
  --input "{\"order_id\": \"ORD-002\", \"item_id\": \"item-999\", \"quantity\": 1}" ^
  --region ap-northeast-1</code></pre>
<p><strong>期待する動作:</strong></p>
<ol>
<li><code>ValidateOrder</code> → 成功</li>
<li><code>ProcessInParallel</code> → <code>CheckInventory</code> が <code>ValueError</code>（在庫切れ）を発生させる</li>
<li><code>ProcessInParallel</code> の Catch が動作 → <code>HandleError</code> へ遷移</li>
<li>実行ステータス: <code>SUCCEEDED</code>（HandleError が正常完了）</li>
</ol>
<p>出力例:</p>
<pre><code class="language-json">{
  "status": "error",
  "error_type": "ValueError",
  "error_cause": "在庫不足: item_id=item-999",
  "original_input": {
    "order_id": "ORD-002",
    "item_id": "item-999",
    "quantity": 1,
    "validated": true
  }
}</code></pre>
<blockquote>
<p><strong>実行ステータスが <code>SUCCEEDED</code> になる理由：</strong><br /><code>HandleError</code> 関数が正常終了（<code>return result</code>）しているため、ステートマシン全体としては「成功」扱いになります。エラーが「処理されずに残った」場合は <code>FAILED</code> になります。</p>
</blockquote>
<hr>
<h3><span id="toc22">テスト3: 支払い失敗エラー（ProcessInParallel Catch の確認）</span></h3>
<pre><code class="language-cmd">aws stepfunctions start-execution ^
  --state-machine-arn %SM_ARN% ^
  --name "test-payment-error" ^
  --input "{\"order_id\": \"ORD-003\", \"item_id\": \"item-001\", \"quantity\": 2, \"fail_payment\": true}" ^
  --region ap-northeast-1</code></pre>
<p><code>ProcessPayment</code> が <code>RuntimeError</code> を発生させ、同様に <code>HandleError</code> へ遷移します。</p>
<hr>
<h3><span id="toc23">テスト4: 検証エラー（ValidateOrder Retry + Catch の確認）</span></h3>
<pre><code class="language-cmd">aws stepfunctions start-execution ^
  --state-machine-arn %SM_ARN% ^
  --name "test-validate-error" ^
  --input "{\"item_id\": \"item-001\", \"quantity\": 2}" ^
  --region ap-northeast-1</code></pre>
<p><code>order_id</code> を省略しているため <code>ValidateOrder</code> が <code>ValueError</code> を発生させます。</p>
<p><strong>Retry の確認（AWSコンソール）:</strong></p>
<p>Step Functions コンソールの実行グラフで <code>ValidateOrder</code> を選択 → <strong>「イベント」タブ</strong> で以下の順序を確認します：</p>
<pre><code class="language-plaintext">TaskStateEntered → TaskScheduled → TaskStarted → TaskFailed
  → TaskScheduled（リトライ1回目）→ TaskStarted → TaskFailed
  → TaskStateExited（Catch 発動）→ HandleError へ</code></pre>
<p><code>ValidateFunction</code> が合計2回呼ばれてから <code>HandleError</code> へ遷移することが分かります。</p>
<hr>
<h2><span id="toc24">Step 8: AWSコンソールで確認（任意）</span></h2>
<p>SAMでデプロイしたリソースはコンソールで確認できます。</p>
<ul>
<li><strong>Step Functions</strong>: ステートマシン一覧 → <code>step-functions-lambda-stack-order-workflow</code> → 各実行のグラフを確認</li>
<li><strong>Lambda</strong>: Lambda → 関数 → <code>step-functions-lambda-stack-ValidateFunction-XXXX</code> → 「モニタリング」→ 呼び出し回数を確認</li>
<li><strong>CloudWatch Logs</strong>: Lambda → 対象関数 → 「モニタリング」タブ → 「CloudWatch Logs を表示」</li>
</ul>
<hr>
<h2><span id="toc25">Step 9: リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ずリソースを削除してください。</strong></p>
<pre><code class="language-cmd">sam delete --stack-name step-functions-lambda-stack --region ap-northeast-1</code></pre>
<p>対話式で確認が入ります。両方 <code>y</code> で進めます。</p>
<pre><code class="language-plaintext">Are you sure you want to delete the stack step-functions-lambda-stack? [y/N]: y
Are you sure you want to delete the folder step-functions-lambda-stack in S3? [y/N]: y</code></pre>
<h3><span id="toc26">削除完了の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks --stack-name step-functions-lambda-stack --region ap-northeast-1</code></pre>
<pre><code class="language-plaintext">An error occurred (ValidationError): Stack with id step-functions-lambda-stack does not exist</code></pre>
<p>このメッセージが表示されれば削除完了です。</p>
<h3><span id="toc27">sam delete で削除されるリソース一覧</span></h3>
<table>
<thead>
<tr>
<th>リソース</th>
<th>数</th>
</tr>
</thead>
<tbody>
<tr>
<td>Step Functions ステートマシン</td>
<td>× 1</td>
</tr>
<tr>
<td>Lambda 関数</td>
<td>× 5</td>
</tr>
<tr>
<td>IAM ロール（ステートマシン用・Lambda 用）</td>
<td>× 6</td>
</tr>
<tr>
<td>Lambda デプロイパッケージ（S3）</td>
<td>× 1</td>
</tr>
<tr>
<td>CloudWatch Logs ロググループ</td>
<td>× 5</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>コンソール版との大きな違い（SAMのメリット）：</strong><br />コンソール版では Lambda × 5 / ステートマシン / IAM ロール × 6 / ロググループを個別に削除する必要があります。<br /><strong>SAMでは <code>sam delete</code> 1コマンドで全リソースを一括削除できます。</strong></p>
</blockquote>
<hr>
<h2><span id="toc28">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>sam build</code> が失敗する</td>
<td><code>src/</code> フォルダ内のファイルが存在しない</td>
<td><code>src/</code> 配下に5つの <code>.py</code> ファイルがあるか確認</td>
</tr>
<tr>
<td><code>sam deploy</code> が <code>Missing --stack-name</code> エラー</td>
<td><code>samconfig.toml</code> がない、または場所が違う</td>
<td><code>step-functions-lambda/</code> 直下に <code>samconfig.toml</code> を作成する</td>
</tr>
<tr>
<td>実行が即座に <code>FAILED</code> になる</td>
<td>Lambda ARN が間違っている</td>
<td><code>sam deploy</code> のエラーログを確認</td>
</tr>
<tr>
<td>テストで <code>executionArn</code> が同じ名前で失敗する</td>
<td><code>--name</code> が重複している</td>
<td><code>--name</code> のサフィックスを変えて再実行する（例: <code>test-normal-2</code>）</td>
</tr>
<tr>
<td><code>describe-execution</code> の <code>status</code> が <code>RUNNING</code> のまま</td>
<td>Lambda がまだ実行中</td>
<td>数秒〜数十秒待ってから再実行する</td>
</tr>
<tr>
<td><code>ConfirmFunction</code> でエラー: <code>list index out of range</code></td>
<td>Parallel ブランチが正常完了していない</td>
<td><code>ProcessInParallel</code> の後にのみ呼ばれる関数かを確認する</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc29">まとめ</span></h2>
<p>今回のハンズオンで実現したこと：</p>
<table>
<thead>
<tr>
<th>確認項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>SAM でのステートマシン定義</strong></td>
<td><code>AWS::Serverless::StateMachine</code> + <code>DefinitionSubstitutions</code> で ARN を自動差し込み</td>
</tr>
<tr>
<td><strong>Lambda × 5 の一括デプロイ</strong></td>
<td><code>CodeUri: src/</code> 共有パッケージ + <code>Handler</code> で各関数を定義</td>
</tr>
<tr>
<td><strong>Retry + Catch</strong></td>
<td>ValidateOrder でリトライ → 失敗 → HandleError へ遷移</td>
</tr>
<tr>
<td><strong>Parallel + Catch</strong></td>
<td>在庫確認と支払い処理を同時実行 → 一方が失敗したら HandleError へ</td>
</tr>
<tr>
<td><strong>一括削除</strong></td>
<td><code>sam delete</code> で全リソースをクリーンアップ</td>
</tr>
</tbody>
</table>
<h3><span id="toc30">SAMのメリットを実感できたポイント</span></h3>
<ul>
<li><code>DefinitionSubstitutions</code> により Lambda ARN のコピー貼り付けが不要</li>
<li><code>LambdaInvokePolicy</code> × 5 で IAM 権限設定が1行ずつで完結</li>
<li><code>sam delete</code> でステートマシン・Lambda 5つ・IAM ロール 6つを一括削除</li>
</ul>
<hr>
<h2><span id="toc31">コンソール版と比較してみる</span></h2>
<p>SAMが裏で何をやっているか、同じ構成をAWSコンソールのみで構築する手順をまとめました。Workflow Studioの新UI（3択モーダル・「{ } コード」タブ）での操作方法や、コンソール版ならではのつまずきポイントを解説しています。</p>
<p><!-- TODO: コンソール版記事へのリンクを追加 --></p>
<hr>
<h2><span id="toc32">関連記事</span></h2>
<p><a rel="nofollow" href="//af.moshimo.com/af/c/click?a_id=1384942&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fs%3Fk%3D%25E6%259C%25AC%2BAWS%2B%25E9%2596%258B%25E7%2599%25BA%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D1DE63UBHFOR4K%26sprefix%3D%25E6%259C%25AC%2Baws%2B%25E9%2596%258B%25E7%2599%25BA%252Caps%252C167%26ref%3Dnb_sb_noss" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 AWS 開発]</a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=1384942&p_id=170&pc_id=185&pl_id=4062" width="1" height="1" style="border:none;" alt="" loading="lazy"></p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"AWS運用入門 改訂第2版 押さえておきたいAWSの基本と運用ノウハウ [AWS深掘りガイド]","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51AAOubymTL._SL500_.jpg","\/51VMG6YKHdL._SL500_.jpg","\/41EdPB8azAL._SL500_.jpg","\/41v2JFE-9jL._SL500_.jpg","\/41FEEqR-yDL._SL500_.jpg","\/41JfZAdnTPL._SL500_.jpg","\/41vGK0czQrL._SL500_.jpg","\/41-SnYtz2aL._SL500_.jpg","\/41sPrV5fi3L._SL500_.jpg","\/41p7JtvYJ1L._SL500_.jpg","\/4169GVNTs8L._SL500_.jpg","\/41BPI5HP3zL._SL500_.jpg","\/41QOyk60CYL._SL500_.jpg","\/41APjk6FphL._SL500_.jpg","\/41ezKUu7VRL._SL500_.jpg","\/41A1n3K+r5L._SL500_.jpg","\/41aY2T8lEOL._SL500_.jpg","\/419Ca1V6HZL._SL500_.jpg","\/41zQkYyLPzL._SL500_.jpg","\/41YpHcyxiTL._SL500_.jpg","\/41-tKN5mt6L._SL500_.jpg","\/419Mv6m55IL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815631085","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4815631085","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/AWS%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=AWS%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"E8MM1","s":"s"});</script></p>
<div id="msmaflink-E8MM1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p><p>The post <a href="https://caymezon.com/aws-handson-step-functions-lambda/">AWSハンズオン - Step Functions + Lambda で受注処理ワークフローをSAMで構築しよう【コンソール版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-step-functions-lambda/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWSコンソールだけでStep Functions + Lambdaワークフローを構築する手順【SAM版との比較付き / 新UI対応】</title>
		<link>https://caymezon.com/aws-handson-console-step-functions-lambda/</link>
					<comments>https://caymezon.com/aws-handson-console-step-functions-lambda/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Sun, 01 Mar 2026 05:25:15 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWSコンソール]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[SAM比較]]></category>
		<category><![CDATA[StepFunctions]]></category>
		<category><![CDATA[エラー処理]]></category>
		<category><![CDATA[ステートマシン]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[ワークフロー]]></category>
		<category><![CDATA[並列処理]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[新UI]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20229</guid>

					<description><![CDATA[<p>目次 はじめにStep Functions 新UIで戸惑いやすいポイント（先読み）キーワード解説前提条件使用するAWSサービス全体の作業順序① Lambda 関数を5つ作成する共通手順1-1. ValidateFunct [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-console-step-functions-lambda/">AWSコンソールだけでStep Functions + Lambdaワークフローを構築する手順【SAM版との比較付き / 新UI対応】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">Step Functions 新UIで戸惑いやすいポイント（先読み）</a></li><li><a href="#toc3" tabindex="0">キーワード解説</a></li><li><a href="#toc4" tabindex="0">前提条件</a></li><li><a href="#toc5" tabindex="0">使用するAWSサービス</a></li><li><a href="#toc6" tabindex="0">全体の作業順序</a></li><li><a href="#toc7" tabindex="0">① Lambda 関数を5つ作成する</a><ol><li><a href="#toc8" tabindex="0">共通手順</a></li><li><a href="#toc9" tabindex="0">1-1. ValidateFunction（注文検証）</a></li><li><a href="#toc10" tabindex="0">1-2. InventoryFunction（在庫確認）</a></li><li><a href="#toc11" tabindex="0">1-3. PaymentFunction（支払い処理）</a></li><li><a href="#toc12" tabindex="0">1-4. ConfirmFunction（注文確定）</a></li><li><a href="#toc13" tabindex="0">1-5. ErrorHandlerFunction（エラー処理）</a></li></ol></li><li><a href="#toc14" tabindex="0">② Step Functions ステートマシンを作成する</a><ol><li><a href="#toc15" tabindex="0">2-1. 作成方法の選択（新UI：3択モーダル）</a></li><li><a href="#toc16" tabindex="0">2-2. 名前とタイプの設定（モーダル）</a></li><li><a href="#toc17" tabindex="0">2-3. ASL の入力（「{ } コード」タブ）</a></li><li><a href="#toc18" tabindex="0">2-4. 実行ロールの確認と作成（「設定」タブ）</a></li></ol></li><li><a href="#toc19" tabindex="0">③ 動作テスト</a><ol><li><a href="#toc20" tabindex="0">テスト1: 正常処理</a></li><li><a href="#toc21" tabindex="0">テスト2: 在庫切れエラー（Parallel Catch の確認）</a></li><li><a href="#toc22" tabindex="0">テスト3: 支払い失敗エラー（Parallel Catch の確認）</a></li><li><a href="#toc23" tabindex="0">テスト4: 検証エラー（ValidateOrder Retry + Catch の確認）</a></li></ol></li><li><a href="#toc24" tabindex="0">④ リソースの削除</a><ol><li><a href="#toc25" tabindex="0">1. ステートマシンを削除する</a></li><li><a href="#toc26" tabindex="0">2. Lambda 関数を5つ削除する</a></li><li><a href="#toc27" tabindex="0">3. IAM ロールを削除する（任意）</a></li><li><a href="#toc28" tabindex="0">4. CloudWatch Logs のロググループを削除する（任意）</a></li></ol></li><li><a href="#toc29" tabindex="0">SAMとの対比</a></li><li><a href="#toc30" tabindex="0">トラブルシューティング</a></li><li><a href="#toc31" tabindex="0">まとめ</a></li><li><a href="#toc32" tabindex="0">コンソール版とSAM版を比較してみる</a></li><li><a href="#toc33" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>「複数のLambda関数を順番に呼び出したい」「エラーが起きたとき自動でリトライして、それでも失敗したら別の処理に切り替えたい」という要件を、<strong>AWS Step Functions</strong> は視覚的なフロー定義で実現します。</p>
<p>この記事では、<strong>AWSコンソールのみ</strong>を使って、受注処理ワークフロー（注文検証 → 在庫確認・支払い並列処理 → 注文確定）をゼロから構築するハンズオンを紹介します。</p>
<pre><code class="language-plaintext">入力: 注文データ（order_id / item_id / quantity）
  ↓
[ValidateOrder] 注文検証 ... Task + Retry + Catch
  ↓ 成功
[ProcessInParallel] 並列処理 ... Parallel + Catch
  ├─ [CheckInventory] 在庫確認
  └─ [ProcessPayment] 支払い処理
  ↓ 成功
[ConfirmOrder] 注文確定
  ↓
終了（成功）

[HandleError] エラー処理（Catch 先）
  ↓
終了（エラー通知済み）</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li>Step Functions の <strong>Task / Parallel / Retry / Catch</strong> という基本パターン</li>
<li>並列ブランチの結果をリストとして次のステートに渡す仕組み</li>
<li><strong>Workflow Studio（新UI）</strong> の操作方法 — ビジュアルエディタと ASL コードエディタの関係</li>
<li><code>ResultPath: &quot;$.error&quot;</code> でエラー情報を元の入力にマージして後続ステートに渡すテクニック</li>
</ul>
<hr>
<blockquote>
<p><strong>この記事は <a href="#">SAM版ハンズオン</a> の比較記事です。</strong><br />コンソール操作でStep Functionsの概念を視覚的に学び、SAMと何が違うのかを比較したい方向けです。</p>
</blockquote>
<hr>
<p><a rel="nofollow" href="//af.moshimo.com/af/c/click?a_id=1384942&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fs%3Fk%3D%25E6%259C%25AC%2BAWS%2B%25E9%2596%258B%25E7%2599%25BA%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D1DE63UBHFOR4K%26sprefix%3D%25E6%259C%25AC%2Baws%2B%25E9%2596%258B%25E7%2599%25BA%252Caps%252C167%26ref%3Dnb_sb_noss" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 AWS 開発]</a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=1384942&p_id=170&pc_id=185&pl_id=4062" width="1" height="1" style="border:none;" alt="" loading="lazy"></p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"AWSの基本・仕組み・重要用語が全部わかる教科書 (見るだけ図解)","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51DEDQXj6oL._SL500_.jpg","\/41F589smNwL._SL500_.jpg","\/41R6f9yyCWL._SL500_.jpg","\/41HqWQ9BvmL._SL500_.jpg","\/41p8p0ZU79L._SL500_.jpg","\/41qLC-fndBL._SL500_.jpg","\/41fcLv9VT5L._SL500_.jpg","\/51lRvCsvHqL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815607850","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4815607850","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%BB%E4%BB%95%E7%B5%84%E3%81%BF%E3%83%BB%E9%87%8D%E8%A6%81%E7%94%A8%E8%AA%9E%E3%81%8C%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8%20(%E8%A6%8B%E3%82%8B%E3%81%A0%E3%81%91%E5%9B%B3%E8%A7%A3)\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%BB%E4%BB%95%E7%B5%84%E3%81%BF%E3%83%BB%E9%87%8D%E8%A6%81%E7%94%A8%E8%AA%9E%E3%81%8C%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8%20(%E8%A6%8B%E3%82%8B%E3%81%A0%E3%81%91%E5%9B%B3%E8%A7%A3)","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"eaCUB","s":"s"});</script></p>
<div id="msmaflink-eaCUB">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p>
<h2><span id="toc2">Step Functions 新UIで戸惑いやすいポイント（先読み）</span></h2>
<p>操作を始める前に、<strong>2026年時点の新UI</strong>と旧UIの違いを把握しておきましょう。</p>
<table>
<thead>
<tr>
<th>変更点</th>
<th>旧UI</th>
<th>新UI（現在）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>作成モーダル</strong></td>
<td>「空白のステートマシン」テンプレートを選択</td>
<td><strong>3択モーダル</strong> が表示される</td>
</tr>
<tr>
<td><strong>作成選択肢</strong></td>
<td>テンプレートギャラリーのみ</td>
<td><strong>「自分で作成する」</strong>「Hello World を実行」「テンプレートを選択」の3択</td>
</tr>
<tr>
<td><strong>ASL入力の場所</strong></td>
<td>作成フォームに「コード」タブ</td>
<td><strong>Workflow Studio 内の「{ } コード」タブ</strong></td>
</tr>
<tr>
<td><strong>ロール設定タイミング</strong></td>
<td>ASL入力と同じ画面</td>
<td><strong>「設定」タブ</strong>で別途確認</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>最大のハマりポイント：</strong><br />「テンプレートを選択」を押してしまうと36個のテンプレートギャラリーが開きます。今回の目的には <strong>「自分で作成する」</strong> を選ぶ必要があります。これを知らずに迷う人が多いポイントです。</p>
</blockquote>
<hr>
<h2><span id="toc3">キーワード解説</span></h2>
<table>
<thead>
<tr>
<th>用語</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>ステートマシン</strong></td>
<td>ワークフローの全体定義。状態（State）の集合と遷移ルールをもつ</td>
</tr>
<tr>
<td><strong>Task ステート</strong></td>
<td>Lambda などの外部リソースを呼び出す状態</td>
</tr>
<tr>
<td><strong>Parallel ステート</strong></td>
<td>複数のブランチを<strong>同時に実行</strong>する状態。両ブランチの結果がリストで次のステートに渡る</td>
</tr>
<tr>
<td><strong>Retry</strong></td>
<td>エラー発生時に同じステートを自動で<strong>再実行</strong>するルール</td>
</tr>
<tr>
<td><strong>Catch</strong></td>
<td>リトライ後もエラーが続く場合に<strong>別のステートへ遷移</strong>するルール</td>
</tr>
<tr>
<td><strong>ResultPath</strong></td>
<td>Catch 時にエラー情報をどのフィールドに格納するかの指定（<code>&quot;$.error&quot;</code> → 元の入力の <code>error</code> キーにマージ）</td>
</tr>
<tr>
<td><strong>ASL</strong></td>
<td>Amazon States Language。ステートマシン定義の JSON 形式</td>
</tr>
<tr>
<td><strong>Workflow Studio</strong></td>
<td>Step Functions のビジュアルエディタ。フロー図と ASL コードを双方向に編集できる</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">前提条件</span></h2>
<table>
<thead>
<tr>
<th>ツール</th>
<th>確認コマンド</th>
<th>備考</th>
</tr>
</thead>
<tbody>
<tr>
<td>AWSアカウント</td>
<td>—</td>
<td>IAMユーザーまたはルートユーザー</td>
</tr>
<tr>
<td>AWS CLI v2（任意）</td>
<td><code>aws --version</code></td>
<td>テスト実行を CLI で行う場合のみ必要</td>
</tr>
</tbody>
</table>
<p>今回はほぼコンソール操作のみで完結します。</p>
<hr>
<h2><span id="toc5">使用するAWSサービス</span></h2>
<table>
<thead>
<tr>
<th>サービス</th>
<th>役割</th>
<th>料金</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Step Functions</strong></td>
<td>ワークフロー（ステートマシン）の管理・実行</td>
<td>月4,000回の状態遷移まで無料（標準タイプ）</td>
</tr>
<tr>
<td><strong>Lambda</strong></td>
<td>各ステートで実行されるビジネスロジック</td>
<td>月100万リクエスト・400,000 GB-秒まで無料</td>
</tr>
<tr>
<td><strong>IAM</strong></td>
<td>Lambda・Step Functionsの実行権限管理</td>
<td>無料</td>
</tr>
<tr>
<td><strong>CloudWatch Logs</strong></td>
<td>Lambdaの実行ログ</td>
<td>月5GBまで無料</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc6">全体の作業順序</span></h2>
<pre><code class="language-plaintext">① Lambda 関数を5つ作成する
      ↓（各関数の ARN が必要）
② Step Functions ステートマシンを作成する（新UI対応）
      ↓
③ 動作テスト（正常処理 / エラー処理）
      ↓
④ リソースの削除</code></pre>
<hr>
<h2><span id="toc7">① Lambda 関数を5つ作成する</span></h2>
<h3><span id="toc8">共通手順</span></h3>
<p><strong>AWSコンソール → Lambda → 「関数の作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>作成方法</td>
<td>一から作成</td>
</tr>
<tr>
<td>ランタイム</td>
<td><strong>Python 3.12</strong></td>
</tr>
<tr>
<td>アーキテクチャ</td>
<td>x86_64</td>
</tr>
<tr>
<td>実行ロール</td>
<td>「基本的な Lambda アクセス権限で新しいロールを作成」（デフォルトのまま）</td>
</tr>
</tbody>
</table>
<p>各関数でコードを貼り付けたあと、必ず <strong>「Deploy」</strong> ボタンを押してコードを保存します。</p>
<hr>
<h3><span id="toc9">1-1. ValidateFunction（注文検証）</span></h3>
<p><strong>関数名</strong>: <code>ValidateFunction</code></p>
<p>コードエディタで <code>lambda_function.py</code> を開き、既存の内容を全て置き換えて以下を貼り付ける。</p>
<pre><code class="language-python">import json


def lambda_handler(event, context):
    order_id = event.get("order_id")
    item_id = event.get("item_id")
    quantity = event.get("quantity", 0)

    if not order_id:
        raise ValueError("order_id が指定されていません")
    if not item_id:
        raise ValueError("item_id が指定されていません")
    if not isinstance(quantity, int) or quantity &lt;= 0:
        raise ValueError(f"quantity は正の整数である必要があります: {quantity}")

    result = {
        **event,          # 元の入力フィールドをすべて引き継ぐ（テスト用フラグを後続ステートに渡すため）
        "validated": True,
    }
    print(json.dumps({"step": "validate", **result}, ensure_ascii=False))
    return result</code></pre>
<p><strong>ARN を控えておく</strong>: 関数ページ右上の「関数の ARN」をコピー（例: <code>arn:aws:lambda:ap-northeast-1:123456789012:function:ValidateFunction</code>）</p>
<hr>
<h3><span id="toc10">1-2. InventoryFunction（在庫確認）</span></h3>
<p><strong>関数名</strong>: <code>InventoryFunction</code></p>
<pre><code class="language-python">import json


def lambda_handler(event, context):
    order_id = event.get("order_id")
    item_id = event.get("item_id")
    quantity = event.get("quantity", 1)

    if item_id == "item-999":
        raise ValueError(f"在庫不足: item_id={item_id}")

    result = {
        "order_id": order_id,
        "item_id": item_id,
        "quantity": quantity,
        "stock_available": True,
    }
    print(json.dumps({"step": "inventory", **result}, ensure_ascii=False))
    return result</code></pre>
<p><strong>ARN を控えておく</strong></p>
<hr>
<h3><span id="toc11">1-3. PaymentFunction（支払い処理）</span></h3>
<p><strong>関数名</strong>: <code>PaymentFunction</code></p>
<pre><code class="language-python">import json


def lambda_handler(event, context):
    order_id = event.get("order_id")
    quantity = event.get("quantity", 1)

    # エラーテスト用: fail_payment=True の場合は例外発生
    if event.get("fail_payment"):
        raise RuntimeError(f"支払い処理に失敗: order_id={order_id}")

    amount = quantity * 1000  # 1個 1,000円

    result = {
        "order_id": order_id,
        "amount": amount,
        "payment_status": "completed",
    }
    print(json.dumps({"step": "payment", **result}, ensure_ascii=False))
    return result</code></pre>
<p><strong>ARN を控えておく</strong></p>
<hr>
<h3><span id="toc12">1-4. ConfirmFunction（注文確定）</span></h3>
<p><strong>関数名</strong>: <code>ConfirmFunction</code></p>
<pre><code class="language-python">import json
import datetime


def lambda_handler(event, context):
    # Parallel ステートの後に呼ばれるため、event はリスト形式
    #   event[0]: CheckInventory（在庫確認）の結果
    #   event[1]: ProcessPayment（支払い処理）の結果
    inventory_result = event[0]
    payment_result = event[1]

    order_id = inventory_result.get("order_id")
    now = datetime.datetime.now(datetime.timezone.utc)

    result = {
        "order_id": order_id,
        "item_id": inventory_result.get("item_id"),
        "quantity": inventory_result.get("quantity"),
        "amount": payment_result.get("amount"),
        "confirmed_at": now.isoformat(),
        "status": "confirmed",
    }
    print(json.dumps({"step": "confirm", **result}, ensure_ascii=False))
    return result</code></pre>
<p><strong>ARN を控えておく</strong></p>
<blockquote>
<p><strong>Parallel ステート後の <code>event</code> がリストになる理由：</strong><br /><code>ProcessInParallel</code> の各ブランチの出力が配列でまとめられて次のステートに渡されます。<code>event[0]</code> が在庫確認の結果、<code>event[1]</code> が支払い処理の結果です。この仕様を知らないと <code>list indices must be integers</code> エラーで詰まります。</p>
</blockquote>
<hr>
<h3><span id="toc13">1-5. ErrorHandlerFunction（エラー処理）</span></h3>
<p><strong>関数名</strong>: <code>ErrorHandlerFunction</code></p>
<pre><code class="language-python">import json


def lambda_handler(event, context):
    # ResultPath: "$.error" により、エラー情報が元の入力に付加されて渡される
    error_info = event.get("error", {})
    original_input = {k: v for k, v in event.items() if k != "error"}

    result = {
        "status": "error",
        "error_type": error_info.get("Error", "Unknown"),
        "error_cause": error_info.get("Cause", ""),
        "original_input": original_input,
    }
    print(json.dumps({"step": "error_handler", **result}, ensure_ascii=False))
    return result</code></pre>
<p><strong>ARN を控えておく</strong></p>
<hr>
<h2><span id="toc14">② Step Functions ステートマシンを作成する</span></h2>
<p><strong>AWSコンソール → Step Functions → 「ステートマシンを作成」</strong></p>
<h3><span id="toc15">2-1. 作成方法の選択（新UI：3択モーダル）</span></h3>
<p>「ステートマシンを作成」ボタンを押すと <strong>3択のモーダル</strong> が表示されます。</p>
<p><img decoding="async" src="https://caymezon.com/wp-content/uploads/2026/03/aws-handson-console-step-functions-lambda-stepfunctions-creat-modal-f49940.jpg" alt="Step Functions 作成モーダル（新UI）"></p>
<table>
<thead>
<tr>
<th>選択肢</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>Hello World を実行</td>
<td>ガイド付きチュートリアル（今回は使わない）</td>
</tr>
<tr>
<td>テンプレートを選択</td>
<td>36個のテンプレートギャラリーが開く（今回は使わない）</td>
</tr>
<tr>
<td><strong>自分で作成する</strong></td>
<td>ゼロからワークフローを作成する ← <strong>これを選ぶ</strong></td>
</tr>
</tbody>
</table>
<p><strong>「自分で作成する」</strong> をクリックします。</p>
<blockquote>
<p><strong>「テンプレートを選択」を押してしまった場合：</strong><br />テンプレートギャラリーが開きます。左上の「✕」で閉じて、改めてモーダルから「自分で作成する」を選んでください。</p>
</blockquote>
<hr>
<h3><span id="toc16">2-2. 名前とタイプの設定（モーダル）</span></h3>
<p>「自分で作成する」をクリックすると Workflow Studio が開き、同時に設定モーダルが表示されます。</p>
<p><!-- ![Step Functions 名前・タイプ設定モーダル](images/stepfunctions-name-type-modal.jpg) --></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>ステートマシン名</td>
<td><code>OrderWorkflow</code></td>
</tr>
<tr>
<td>ステートマシンのタイプ</td>
<td><strong>標準</strong></td>
</tr>
</tbody>
</table>
<p>「続行」をクリックするとモーダルが閉じ、Workflow Studio の編集画面に切り替わります。</p>
<blockquote>
<p><strong>標準（Standard）と Express の違い：</strong><br />標準タイプは「正確に1回実行」「最大1年の実行時間」「実行履歴をコンソールで確認可能」が特徴です。受注処理のような確実な実行が必要なユースケースに適しています。</p>
</blockquote>
<hr>
<h3><span id="toc17">2-3. ASL の入力（「{ } コード」タブ）</span></h3>
<p>Workflow Studio の画面上部にある <strong>「{ } コード」</strong> タブをクリックしてコードエディタを表示します。</p>
<p><!-- ![Workflow Studio コードタブ](images/stepfunctions-workflow-studio-code.jpg) --></p>
<p>既存の内容を<strong>全て削除</strong>し、以下の JSON を貼り付けます。</p>
<blockquote>
<p><strong>【重要】</strong> <code>REPLACE_WITH_ARN_ValidateFunction</code> などのプレースホルダーを、① で控えた実際の Lambda ARN に置き換えること。</p>
</blockquote>
<pre><code class="language-json">{
  "Comment": "受注処理ワークフロー（検証 → 並列処理 → 確定）",
  "StartAt": "ValidateOrder",
  "States": {
    "ValidateOrder": {
      "Type": "Task",
      "Resource": "REPLACE_WITH_ARN_ValidateFunction",
      "Next": "ProcessInParallel",
      "Retry": [
        {
          "ErrorEquals": ["States.ALL"],
          "IntervalSeconds": 2,
          "MaxAttempts": 1,
          "BackoffRate": 2.0
        }
      ],
      "Catch": [
        {
          "ErrorEquals": ["States.ALL"],
          "Next": "HandleError",
          "ResultPath": "$.error"
        }
      ]
    },
    "ProcessInParallel": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "CheckInventory",
          "States": {
            "CheckInventory": {
              "Type": "Task",
              "Resource": "REPLACE_WITH_ARN_InventoryFunction",
              "End": true
            }
          }
        },
        {
          "StartAt": "ProcessPayment",
          "States": {
            "ProcessPayment": {
              "Type": "Task",
              "Resource": "REPLACE_WITH_ARN_PaymentFunction",
              "End": true
            }
          }
        }
      ],
      "Next": "ConfirmOrder",
      "Catch": [
        {
          "ErrorEquals": ["States.ALL"],
          "Next": "HandleError",
          "ResultPath": "$.error"
        }
      ]
    },
    "ConfirmOrder": {
      "Type": "Task",
      "Resource": "REPLACE_WITH_ARN_ConfirmFunction",
      "End": true
    },
    "HandleError": {
      "Type": "Task",
      "Resource": "REPLACE_WITH_ARN_ErrorHandlerFunction",
      "End": true
    }
  }
}</code></pre>
<p>貼り付けると <strong>「フロー」タブ</strong> に切り替えると、フロー図が自動生成されます。ASL を正しく記述できているかを視覚的に確認できます。</p>
<p><!-- ![Workflow Studio フロー図プレビュー](images/stepfunctions-workflow-preview.jpg) --></p>
<hr>
<h3><span id="toc18">2-4. 実行ロールの確認と作成（「設定」タブ）</span></h3>
<p>画面上部の <strong>「設定」</strong> タブをクリックして実行ロールを確認します。</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>実行ロール</td>
<td><strong>「新しいロールを作成」</strong>（デフォルトのまま）</td>
</tr>
<tr>
<td>ログ記録</td>
<td>OFF（デフォルトのまま）</td>
</tr>
</tbody>
</table>
<p>「新しいロールを作成」を選ぶと、以下のような青いボックスが表示されます。</p>
<blockquote>
<p>実行ロールは、完全な許可で作成されます。<code>StepFunctions-OrderWorkflow-role-XXXX</code> という名前の新しい実行ロールが作成されます。ステートマシンで指定されたアクションに必要なすべての許可が自動生成されます。</p>
</blockquote>
<p>「自動生成された許可を確認」を展開すると <code>lambda:Invoke</code> が含まれていることを確認できます。</p>
<p>右上の <strong>「作成」</strong> ボタンをクリックします。</p>
<blockquote>
<p><strong>IAMロールの自動作成について：</strong><br />ASL 定義に記述した Lambda ARN に対して <code>lambda:Invoke</code> 権限を持つロールが自動的に作成されます。SAM版では <code>LambdaInvokePolicy</code> ポリシーでこれを明示的に定義しています。</p>
</blockquote>
<hr>
<h2><span id="toc19">③ 動作テスト</span></h2>
<p><strong>Step Functions → <code>OrderWorkflow</code> → 「実行を開始」</strong></p>
<h3><span id="toc20">テスト1: 正常処理</span></h3>
<p><strong>入力データ:</strong></p>
<pre><code class="language-json">{
  "order_id": "ORD-001",
  "item_id": "item-001",
  "quantity": 2
}</code></pre>
<p>「実行を開始」をクリックします。</p>
<p><strong>実行グラフで確認:</strong></p>
<ul>
<li>全ステートが<strong>緑色</strong>になることを確認する</li>
<li><code>ProcessInParallel</code> の2つのブランチが<strong>同時に緑</strong>になることを確認する（並列処理の視覚化）</li>
</ul>
<p><!-- ![正常処理の実行グラフ](images/stepfunctions-success-graph.jpg) --></p>
<p><strong>出力を確認:</strong></p>
<p>実行完了後、「出力」タブで以下のような JSON が表示されます。</p>
<pre><code class="language-json">{
  "order_id": "ORD-001",
  "item_id": "item-001",
  "quantity": 2,
  "amount": 2000,
  "confirmed_at": "2026-03-01T10:00:00.000000+00:00",
  "status": "confirmed"
}</code></pre>
<hr>
<h3><span id="toc21">テスト2: 在庫切れエラー（Parallel Catch の確認）</span></h3>
<p><strong>入力データ:</strong></p>
<pre><code class="language-json">{
  "order_id": "ORD-002",
  "item_id": "item-999",
  "quantity": 1
}</code></pre>
<p><strong>期待する動作:</strong></p>
<ol>
<li><code>ValidateOrder</code> → 成功</li>
<li><code>ProcessInParallel</code> → <code>CheckInventory</code> が <code>ValueError</code> を発生させる</li>
<li><code>ProcessInParallel</code> の Catch が動作 → <code>HandleError</code> へ遷移</li>
<li><code>HandleError</code> → 成功（エラー情報をログに記録して終了）</li>
</ol>
<p><strong>実行グラフで確認:</strong></p>
<ul>
<li><code>CheckInventory</code> が<strong>赤く</strong>なる</li>
<li><code>ProcessInParallel</code> から <code>HandleError</code> へ遷移するパスが強調される</li>
</ul>
<p><!-- ![在庫切れエラーの実行グラフ](images/stepfunctions-inventory-error.jpg) --></p>
<p><strong>出力を確認:</strong></p>
<pre><code class="language-json">{
  "status": "error",
  "error_type": "ValueError",
  "error_cause": "在庫不足: item_id=item-999",
  "original_input": {
    "order_id": "ORD-002",
    "item_id": "item-999",
    "quantity": 1,
    "validated": true
  }
}</code></pre>
<hr>
<h3><span id="toc22">テスト3: 支払い失敗エラー（Parallel Catch の確認）</span></h3>
<p><strong>入力データ:</strong></p>
<pre><code class="language-json">{
  "order_id": "ORD-003",
  "item_id": "item-001",
  "quantity": 2,
  "fail_payment": true
}</code></pre>
<p><strong>期待する動作:</strong></p>
<ol>
<li><code>ValidateOrder</code> → 成功</li>
<li><code>ProcessInParallel</code> → <code>ProcessPayment</code> が <code>RuntimeError</code> を発生させる</li>
<li><code>ProcessInParallel</code> の Catch が動作 → <code>HandleError</code> へ遷移</li>
</ol>
<hr>
<h3><span id="toc23">テスト4: 検証エラー（ValidateOrder Retry + Catch の確認）</span></h3>
<p><strong>入力データ（<code>order_id</code> を省略）:</strong></p>
<pre><code class="language-json">{
  "item_id": "item-001",
  "quantity": 2
}</code></pre>
<p><strong>期待する動作:</strong></p>
<ol>
<li><code>ValidateOrder</code> → <code>ValueError</code> 発生</li>
<li>Retry: <code>IntervalSeconds: 2</code> で2秒後に自動リトライ（合計2回試行）</li>
<li>2回とも失敗 → Catch が動作 → <code>HandleError</code> へ遷移</li>
</ol>
<p><strong>Retry の確認方法:</strong></p>
<p>実行グラフで <code>ValidateOrder</code> を選択 → <strong>「イベント」タブ</strong> で以下の順序を確認します：</p>
<pre><code class="language-plaintext">TaskStateEntered → TaskScheduled → TaskStarted → TaskFailed
  → TaskScheduled（リトライ1回目）→ TaskStarted → TaskFailed
  → TaskStateExited（Catch 発動）→ HandleError へ</code></pre>
<p><code>ValidateFunction</code> が合計2回呼ばれていることが分かります。</p>
<hr>
<h2><span id="toc24">④ リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ずリソースを削除してください。</strong></p>
<h3><span id="toc25">1. ステートマシンを削除する</span></h3>
<p><strong>Step Functions → <code>OrderWorkflow</code> → 「削除」→ 確認テキストを入力 → 「削除」</strong></p>
<p>削除後、ステータスが「<strong>削除中</strong>」に変わります。以下のようなメッセージが表示されます：</p>
<blockquote>
<p>ステートマシンに削除のマークが付けられました。すべての実行が停止されると削除されます。</p>
</blockquote>
<p>これは正常な動作です。実行中のワークフローがすべて終了するまで完全削除を待つ仕様のため、実行中のものがなければ数秒〜数十秒でリストから消えます。ページをリロードして確認します。</p>
<hr>
<h3><span id="toc26">2. Lambda 関数を5つ削除する</span></h3>
<p><strong>Lambda → 関数一覧 → 各関数を選択 → 「アクション」→「削除」</strong></p>
<p>削除対象:</p>
<ul>
<li><code>ValidateFunction</code></li>
<li><code>InventoryFunction</code></li>
<li><code>PaymentFunction</code></li>
<li><code>ConfirmFunction</code></li>
<li><code>ErrorHandlerFunction</code></li>
</ul>
<hr>
<h3><span id="toc27">3. IAM ロールを削除する（任意）</span></h3>
<p>Step Functions の実行ロール（<code>StepFunctions-OrderWorkflow-role-XXXX</code>）と、Lambda 関数のロール（<code>ValidateFunction-role-XXXX</code> など5つ）を削除します。</p>
<p><strong>IAM → ロール → 各ロールを検索して削除</strong></p>
<hr>
<h3><span id="toc28">4. CloudWatch Logs のロググループを削除する（任意）</span></h3>
<p><strong>CloudWatch → ロググループ → 各 Lambda の <code>/aws/lambda/関数名</code> を削除</strong></p>
<hr>
<h2><span id="toc29">SAMとの対比</span></h2>
<table>
<thead>
<tr>
<th>SAMの記述</th>
<th>コンソールでやること</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>AWS::Serverless::StateMachine</code></td>
<td>Step Functions → ステートマシンを作成</td>
</tr>
<tr>
<td><code>Type: STANDARD</code></td>
<td>タイプ = 「標準」</td>
</tr>
<tr>
<td><code>Definition: {...}</code></td>
<td>「{ } コード」タブに ASL JSON を貼り付け</td>
</tr>
<tr>
<td><code>DefinitionSubstitutions</code></td>
<td>JSON 内の ARN プレースホルダーを手動で置換</td>
</tr>
<tr>
<td><code>LambdaInvokePolicy</code> × 5</td>
<td>「設定」タブ → 「新しいロールを作成」で自動生成</td>
</tr>
<tr>
<td><code>sam delete</code></td>
<td>Lambda × 5 / ステートマシン / IAM ロール / ロググループを個別に削除</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc30">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>実行が即座に <code>ExecutionFailed</code> になる</td>
<td>ASL 内の Lambda ARN が間違っている</td>
<td>① で控えた ARN と再照合する</td>
</tr>
<tr>
<td>「テンプレートを選択」を押してギャラリーが開いた</td>
<td>新UI操作ミス</td>
<td>✕で閉じ、モーダルから「自分で作成する」を選ぶ</td>
</tr>
<tr>
<td>「{ } コード」タブが見つからない</td>
<td>モーダルが前面に出ている</td>
<td>「続行」でモーダルを閉じてから Workflow Studio を操作する</td>
</tr>
<tr>
<td><code>HandleError</code> に渡る <code>error_cause</code> が空</td>
<td>Python 例外が Lambda レベルでハンドルされている</td>
<td>コードの <code>raise</code> が正しく記述されているか確認</td>
</tr>
<tr>
<td><code>ProcessInParallel</code> が一方しか実行されない</td>
<td>Parallel ブランチの定義ミス</td>
<td>ASL JSON の <code>Branches</code> 配列に2つの要素があるか確認</td>
</tr>
<tr>
<td><code>ConfirmFunction</code> でエラー: <code>list indices must be integers</code></td>
<td><code>event[0]</code> / <code>event[1]</code> で取り出しているが、入力が配列でない</td>
<td><code>ProcessInParallel</code> の直後にのみ呼ばれる関数かを確認する</td>
</tr>
<tr>
<td>ステートマシン削除後「削除中」のまま消えない</td>
<td>実行中のワークフローが残っている</td>
<td>実行一覧から実行中のものを停止してから再確認</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc31">まとめ</span></h2>
<p>今回のハンズオンで体験できたこと：</p>
<table>
<thead>
<tr>
<th>確認項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Task + Retry + Catch</strong></td>
<td>ValidateOrder で注文検証 → リトライ → それでも失敗したらエラーハンドラへ</td>
</tr>
<tr>
<td><strong>Parallel ステート</strong></td>
<td>在庫確認と支払い処理を同時実行し、両結果をリストで次へ渡す</td>
</tr>
<tr>
<td><strong>ResultPath</strong></td>
<td><code>&quot;$.error&quot;</code> でエラー情報を元の入力にマージ → エラーハンドラで参照</td>
</tr>
<tr>
<td><strong>Workflow Studio</strong></td>
<td>ASL コードと視覚フロー図を双方向で確認できる新UI</td>
</tr>
<tr>
<td><strong>新UI操作</strong></td>
<td>3択モーダル → 「自分で作成する」→「{ } コード」タブ → 「設定」タブ の流れ</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc32">コンソール版とSAM版を比較してみる</span></h2>
<p>コンソールでStep Functionsの概念を理解したら、SAMで同じ構成をコードで定義することで「SAMが何を自動化しているか」が明確になります。<code>DefinitionSubstitutions</code> による ARN の自動差し込みや、<code>LambdaInvokePolicy</code> によるワンライン権限付与など、コンソールでの手動操作がコードに対応しています。</p>
<p><!-- TODO: SAM版記事へのリンクを追加 --></p>
<hr>
<h2><span id="toc33">関連記事</span></h2>
<p><a rel="nofollow" href="//af.moshimo.com/af/c/click?a_id=1384942&p_id=170&pc_id=185&pl_id=4062&url=https%3A%2F%2Fwww.amazon.co.jp%2Fs%3Fk%3D%25E6%259C%25AC%2BAWS%2B%25E9%2596%258B%25E7%2599%25BA%26__mk_ja_JP%3D%25E3%2582%25AB%25E3%2582%25BF%25E3%2582%25AB%25E3%2583%258A%26crid%3D1DE63UBHFOR4K%26sprefix%3D%25E6%259C%25AC%2Baws%2B%25E9%2596%258B%25E7%2599%25BA%252Caps%252C167%26ref%3Dnb_sb_noss" referrerpolicy="no-referrer-when-downgrade" attributionsrc>Amazon検索[本 AWS 開発]</a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=1384942&p_id=170&pc_id=185&pl_id=4062" width="1" height="1" style="border:none;" alt="" loading="lazy"></p>
<p><!-- START MoshimoAffiliateEasyLink --><script type="text/javascript">(function(b,c,f,g,a,d,e){b.MoshimoAffiliateObject=a;b[a]=b[a]||function(){arguments.currentScript=c.currentScript||c.scripts[c.scripts.length-2];(b[a].q=b[a].q||[]).push(arguments)};c.getElementById(a)||(d=c.createElement(f),d.src=g,d.id=a,e=c.getElementsByTagName("body")[0],e.appendChild(d))})(window,document,"script","//dn.msmstatic.com/site/cardlink/bundle.js?20220329","msmaflink");msmaflink({"n":"AWS運用入門 改訂第2版 押さえておきたいAWSの基本と運用ノウハウ [AWS深掘りガイド]","b":"SBクリエイティブ","t":"","d":"https:\/\/m.media-amazon.com","c_p":"\/images\/I","p":["\/51AAOubymTL._SL500_.jpg","\/51VMG6YKHdL._SL500_.jpg","\/41EdPB8azAL._SL500_.jpg","\/41v2JFE-9jL._SL500_.jpg","\/41FEEqR-yDL._SL500_.jpg","\/41JfZAdnTPL._SL500_.jpg","\/41vGK0czQrL._SL500_.jpg","\/41-SnYtz2aL._SL500_.jpg","\/41sPrV5fi3L._SL500_.jpg","\/41p7JtvYJ1L._SL500_.jpg","\/4169GVNTs8L._SL500_.jpg","\/41BPI5HP3zL._SL500_.jpg","\/41QOyk60CYL._SL500_.jpg","\/41APjk6FphL._SL500_.jpg","\/41ezKUu7VRL._SL500_.jpg","\/41A1n3K+r5L._SL500_.jpg","\/41aY2T8lEOL._SL500_.jpg","\/419Ca1V6HZL._SL500_.jpg","\/41zQkYyLPzL._SL500_.jpg","\/41YpHcyxiTL._SL500_.jpg","\/41-tKN5mt6L._SL500_.jpg","\/419Mv6m55IL._SL500_.jpg"],"u":{"u":"https:\/\/www.amazon.co.jp\/dp\/4815631085","t":"amazon","r_v":""},"v":"2.1","b_l":[{"id":1,"u_tx":"Amazonで見る","u_bc":"#f79256","u_url":"https:\/\/www.amazon.co.jp\/dp\/4815631085","a_id":1384942,"p_id":170,"pl_id":27060,"pc_id":185,"s_n":"amazon","u_so":1},{"id":2,"u_tx":"楽天市場で見る","u_bc":"#f76956","u_url":"https:\/\/search.rakuten.co.jp\/search\/mall\/AWS%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D\/","a_id":1384917,"p_id":54,"pl_id":27059,"pc_id":54,"s_n":"rakuten","u_so":2},{"id":3,"u_tx":"Yahoo!ショッピングで見る","u_bc":"#66a7ff","u_url":"https:\/\/shopping.yahoo.co.jp\/search?first=1\u0026p=AWS%E9%81%8B%E7%94%A8%E5%85%A5%E9%96%80%20%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%20%E6%8A%BC%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84AWS%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E9%81%8B%E7%94%A8%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6%20%5BAWS%E6%B7%B1%E6%8E%98%E3%82%8A%E3%82%AC%E3%82%A4%E3%83%89%5D","a_id":1466950,"p_id":1225,"pl_id":27061,"pc_id":1925,"s_n":"yahoo","u_so":3}],"eid":"E8MM1","s":"s"});</script></p>
<div id="msmaflink-E8MM1">リンク</div>
<p><!-- MoshimoAffiliateEasyLink END --></p><p>The post <a href="https://caymezon.com/aws-handson-console-step-functions-lambda/">AWSコンソールだけでStep Functions + Lambdaワークフローを構築する手順【SAM版との比較付き / 新UI対応】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-console-step-functions-lambda/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
