<?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>非同期処理 - CayTech Lab</title>
	<atom:link href="https://caymezon.com/tag/%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Mon, 23 Feb 2026 08:06:32 +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>非同期処理 - 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ハンズオン - S3へのファイルアップロードをトリガーにLambdaを自動起動しよう【SAM版 / Windows対応】</title>
		<link>https://caymezon.com/aws-handson-s3-event-lambda/</link>
					<comments>https://caymezon.com/aws-handson-s3-event-lambda/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Mon, 23 Feb 2026 04:16:21 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[S3]]></category>
		<category><![CDATA[S3イベント]]></category>
		<category><![CDATA[SAM]]></category>
		<category><![CDATA[サーバーレス]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[ファイルアップロード]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[非同期処理]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20206</guid>

					<description><![CDATA[<p>目次 はじめにS3イベントの仕組みを理解するキーワード解説S3イベントの種類前提条件使用するAWSサービスStep 1: プロジェクトフォルダを開くフォルダ構造Step 2: SAMテンプレートの確認（template. [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-s3-event-lambda/">AWSハンズオン - S3へのファイルアップロードをトリガーにLambdaを自動起動しよう【SAM版 / Windows対応】</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">S3イベントの仕組みを理解する</a><ol><li><a href="#toc3" tabindex="0">キーワード解説</a></li><li><a href="#toc4" tabindex="0">S3イベントの種類</a></li></ol></li><li><a href="#toc5" tabindex="0">前提条件</a></li><li><a href="#toc6" tabindex="0">使用するAWSサービス</a></li><li><a href="#toc7" tabindex="0">Step 1: プロジェクトフォルダを開く</a><ol><li><a href="#toc8" tabindex="0">フォルダ構造</a></li></ol></li><li><a href="#toc9" tabindex="0">Step 2: SAMテンプレートの確認（template.yaml）</a><ol><li><a href="#toc10" tabindex="0">template.yaml のポイント解説</a></li></ol></li><li><a href="#toc11" tabindex="0">Step 3: Lambdaコードの確認（src/app.py）</a><ol><li><a href="#toc12" tabindex="0">app.py のポイント解説</a></li></ol></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></ol></li><li><a href="#toc17" tabindex="0">Step 7: 動作テスト</a><ol><li><a href="#toc18" tabindex="0">7-1. テスト用ファイルの準備</a></li><li><a href="#toc19" tabindex="0">7-2. バケット名を変数にセットする</a></li><li><a href="#toc20" tabindex="0">7-3. ファイルのアップロード</a></li><li><a href="#toc21" tabindex="0">7-4. CloudWatch Logs でログを確認</a></li><li><a href="#toc22" tabindex="0">7-5. フォルダ付きキーのテスト（任意）</a></li><li><a href="#toc23" tabindex="0">7-6. 日本語ファイル名のテスト（任意）</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">② スタックを削除する</a></li><li><a href="#toc28" tabindex="0">削除完了の確認</a></li><li><a href="#toc29" tabindex="0">バケット削除を忘れて sam delete が失敗した場合</a></li></ol></li><li><a href="#toc30" tabindex="0">トラブルシューティング</a></li><li><a href="#toc31" tabindex="0">まとめ</a><ol><li><a href="#toc32" tabindex="0">SAMのメリットを実感できたポイント</a></li><li><a href="#toc33" tabindex="0">このハンズオンの発展形</a></li></ol></li><li><a href="#toc34" tabindex="0">コンソール操作と比較してみる</a></li><li><a href="#toc35" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>「S3にファイルが上がったら自動で処理したい」というのは、AWSを使う現場でよく出てくる要件です。画像のリサイズ、CSVの集計、ログファイルの解析など、<strong>ファイルアップロードを起点にした自動処理</strong>はサーバーレス構成の代表的なユースケースです。</p>
<p>この記事では、<strong>S3 + Lambda</strong> によるファイルアップロードトリガー処理を、<strong>AWS SAM</strong> を使ってゼロから構築するハンズオンを紹介します。</p>
<pre><code class="language-plaintext">ファイルアップロード（aws s3 cp）
  ↓ S3 ObjectCreated イベント発火
S3 バケット（UploadBucket）
  ↓ Lambda を呼び出し
Lambda（Python 3.12 / S3EventFunction）
  ↓ ファイル情報（バケット名・ファイル名・サイズ）をログ出力
CloudWatch Logs</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li>S3 ObjectCreated イベントによる Lambda の自動起動</li>
<li><strong>URLデコード処理</strong>（日本語ファイル名・特殊文字を含むキー名の正しい取得）</li>
<li>SAMテンプレートで S3 バケット名をグローバルユニークにする <code>!Sub</code> の使い方</li>
<li><code>DeletionPolicy</code> と「バケットを先に空にしてから削除」というSAM特有の注意点</li>
</ul>
<p><strong>この記事の特徴：</strong></p>
<ul>
<li>Windows（VSCode + コマンドプロンプト）での実際の手順を詳細に解説</li>
<li>フォルダ付きキー・日本語ファイル名など<strong>実務でよく出る応用テスト</strong>も含む</li>
<li><code>sam delete</code> で失敗しやすいポイントと対処法を詳細に解説</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">S3イベントの仕組みを理解する</span></h2>
<h3><span id="toc3">キーワード解説</span></h3>
<table>
<thead>
<tr>
<th>用語</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>S3イベント通知</strong></td>
<td>S3バケットで特定の操作（アップロードなど）が行われたときに他サービスを呼び出す仕組み</td>
</tr>
<tr>
<td><strong>ObjectCreated</strong></td>
<td>ファイルのアップロード・コピー・マルチパート完了などの「作成」系イベントの総称</td>
</tr>
<tr>
<td><strong>リソースベースポリシー</strong></td>
<td>Lambda側に「S3からの呼び出しを許可する」ポリシーを設定する仕組み</td>
</tr>
<tr>
<td><strong>URLデコード</strong></td>
<td>S3のキー名は特殊文字がURLエンコードされるため、Lambda側でデコードして読み取る処理</td>
</tr>
</tbody>
</table>
<h3><span id="toc4">S3イベントの種類</span></h3>
<p>SAMテンプレートで指定できる代表的なイベント：</p>
<table>
<thead>
<tr>
<th>イベント</th>
<th>発火タイミング</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>s3:ObjectCreated:Put</code></td>
<td>PUTアップロード（<code>aws s3 cp</code> など）</td>
</tr>
<tr>
<td><code>s3:ObjectCreated:Post</code></td>
<td>HTMLフォームからのアップロード</td>
</tr>
<tr>
<td><code>s3:ObjectCreated:Copy</code></td>
<td>オブジェクトのコピー</td>
</tr>
<tr>
<td><code>s3:ObjectCreated:*</code></td>
<td>上記すべての作成系イベント（今回はこれを使用）</td>
</tr>
<tr>
<td><code>s3:ObjectRemoved:*</code></td>
<td>オブジェクトの削除イベント</td>
</tr>
</tbody>
</table>
<p>今回は <code>s3:ObjectCreated:*</code> を使い、アップロード・コピーを問わず全ての作成操作でLambdaを起動します。</p>
<hr>
<h2><span id="toc5">前提条件</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</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="toc6">使用するAWSサービス</span></h2>
<table>
<thead>
<tr>
<th>サービス</th>
<th>役割</th>
<th>料金</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>S3（標準ストレージ）</strong></td>
<td>ファイルの保存・イベント発火</td>
<td>5GBまで無料（12ヶ月）</td>
</tr>
<tr>
<td><strong>Lambda</strong></td>
<td>ファイル情報のログ記録</td>
<td>100万リクエスト無料枠あり</td>
</tr>
<tr>
<td><strong>CloudWatch Logs</strong></td>
<td>Lambda実行ログの保存</td>
<td>5GBまで無料</td>
</tr>
<tr>
<td><strong>S3</strong>（デプロイ用）</td>
<td>SAMのデプロイパッケージ置き場</td>
<td>自動作成・少量なのでほぼ無料</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>学習目的の短時間ハンズオンであれば、ほぼ無料枠内で収まります。</strong></p>
</blockquote>
<hr>
<h2><span id="toc7">Step 1: プロジェクトフォルダを開く</span></h2>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\s3-event-lambda</code></pre>
<h3><span id="toc8">フォルダ構造</span></h3>
<pre><code class="language-plaintext">s3-event-lambda/
├── template.yaml       # SAMテンプレート（S3バケット + Lambda定義）
├── samconfig.toml      # デプロイ設定（gitignore対象・毎回手動作成が必要）
├── docs/
│   ├── 1_console.md    # AWSコンソール版手順
│   └── 2_sam.md        # SAM版手順
└── src/
    └── app.py          # Lambda関数（ファイル情報をCloudWatch Logsに出力）</code></pre>
<hr>
<h2><span id="toc9">Step 2: SAMテンプレートの確認（template.yaml）</span></h2>
<p><code>template.yaml</code> がAWSリソース全体の設計図です。S3バケットとLambda関数をこの1ファイルで定義します。</p>
<pre><code class="language-yaml">AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: S3 file upload trigger with Lambda

Globals:
  Function:
    Runtime: python3.12
    Timeout: 30
    MemorySize: 128

Resources:
  UploadBucket:
    Type: AWS::S3::Bucket
    Properties:
      # アカウントIDを含めることでグローバルユニークを保証
      BucketName: !Sub "${AWS::StackName}-upload-${AWS::AccountId}"
    DeletionPolicy: Delete   # sam delete 時にバケットも削除（空の場合のみ）

  # Lambda 関数
  S3EventFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: app.lambda_handler
      Description: S3アップロードイベントを受信してファイル情報をログ出力する
      Events:
        S3Event:
          Type: S3                          # S3イベントトリガーを設定
          Properties:
            Bucket: !Ref UploadBucket       # 上で作ったバケットを参照
            Events: s3:ObjectCreated:*      # 全ての「作成」イベントをトリガー

Outputs:
  BucketName:
    Description: "アップロード先バケット名"
    Value: !Ref UploadBucket
  S3EventFunctionArn:
    Description: "Lambda 関数 ARN"
    Value: !GetAtt S3EventFunction.Arn
  CloudWatchLogsGroup:
    Description: "CloudWatch Logs グループ名"
    Value: !Sub "/aws/lambda/${S3EventFunction}"</code></pre>
<h3><span id="toc10">template.yaml のポイント解説</span></h3>
<p><strong><code>BucketName: !Sub &quot;${AWS::StackName}-upload-${AWS::AccountId}&quot;</code></strong><br />S3バケット名はAWS全体（全リージョン・全アカウント）でグローバルユニークである必要があります。スタック名＋アカウントIDを組み合わせることで、他のアカウントと名前が被る可能性を排除しています。コンソール版では手動で一意な名前を考える必要があります。</p>
<p><strong><code>Type: S3</code> イベント</strong><br />SAMがS3バケットのイベント通知設定とLambdaのリソースベースポリシー（「S3からの呼び出しを許可する」設定）を自動作成します。コンソール版では「Lambda → トリガーを追加」の画面操作が必要です。</p>
<p><strong><code>DeletionPolicy: Delete</code></strong><br /><code>sam delete</code> 実行時にS3バケットを削除しようとします。ただし、<strong>オブジェクトが残っているバケットは削除できない</strong>ため、<code>sam delete</code> 前に必ずバケットを空にする必要があります（Step 9で詳しく解説）。</p>
<blockquote>
<p><strong>S3バケット名についての補足：</strong><br />一度使われたバケット名は削除後しばらく再利用できないことがあります。<br />アカウントIDを含める方法が最も確実です。</p>
</blockquote>
<hr>
<h2><span id="toc11">Step 3: Lambdaコードの確認（src/app.py）</span></h2>
<p><code>src/app.py</code> がファイル情報取得の本体です。S3イベントからバケット名・ファイル名・サイズ・イベント種別を取得してCloudWatch Logsに記録します。</p>
<pre><code class="language-python">import json
import urllib.parse


def lambda_handler(event, context):
    results = []

    for record in event["Records"]:          # 複数ファイル同時アップロードに対応
        # S3 イベントからファイル情報を取得
        bucket = record["s3"]["bucket"]["name"]
        # キー名は URL エンコードされているためデコードが必要（日本語・スペース対応）
        key = urllib.parse.unquote_plus(record["s3"]["object"]["key"])
        size = record["s3"]["object"]["size"]
        event_name = record["eventName"]     # 例: "ObjectCreated:Put"
        event_time = record["eventTime"]     # 例: "2026-02-22T10:00:00.000Z"

        info = {
            "eventName": event_name,
            "bucket": bucket,
            "key": key,
            "sizeBytes": size,
            "eventTime": event_time,
        }

        print(json.dumps(info, ensure_ascii=False))
        results.append(info)

    print(json.dumps({"processedCount": len(results)}, ensure_ascii=False))
    return {"processedCount": len(results)}</code></pre>
<h3><span id="toc12">app.py のポイント解説</span></h3>
<p><strong><code>event[&quot;Records&quot;]</code> のループ処理</strong><br />S3イベントはリスト形式で渡されます。通常は1件ですが、複数ファイルの同時アップロード時に複数件になる場合があるため、<code>for</code> ループで処理します。</p>
<p><strong><code>urllib.parse.unquote_plus(key)</code> が必要な理由</strong><br />S3のキー名（ファイルパス）に日本語や特殊文字・スペースが含まれると、URLエンコードされてLambdaに渡されます。</p>
<table>
<thead>
<tr>
<th>アップロードしたファイル名</th>
<th>デコード前（Lambdaに渡される値）</th>
<th>デコード後</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>テスト.txt</code></td>
<td><code>%E3%83%86%E3%82%B9%E3%83%88.txt</code></td>
<td><code>テスト.txt</code></td>
</tr>
<tr>
<td><code>my file.txt</code></td>
<td><code>my+file.txt</code></td>
<td><code>my file.txt</code></td>
</tr>
<tr>
<td><code>report-2026.csv</code></td>
<td><code>report-2026.csv</code>（変化なし）</td>
<td><code>report-2026.csv</code></td>
</tr>
</tbody>
</table>
<p><code>urllib.parse.unquote_plus</code> はこのデコードを正しく処理します。</p>
<p><strong>外部ライブラリ不使用</strong><br />標準ライブラリ（<code>json</code>, <code>urllib.parse</code>）のみ使用するため、<code>requirements.txt</code> が不要です。</p>
<hr>
<h2><span id="toc13">Step 4: samconfig.toml を作成する</span></h2>
<p><code>samconfig.toml</code> は <code>.gitignore</code> で管理外のため、<strong>毎回手動で作成</strong>する必要があります。</p>
<p><code>s3-event-lambda/samconfig.toml</code> を新規作成して以下を貼り付けてください。</p>
<pre><code class="language-toml">version = 0.1

[default.deploy.parameters]
stack_name = "s3-event-lambda-stack"
resolve_s3 = true
s3_prefix = "s3-event-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></p>
<p><code>s3-event-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\s3-event-lambda
sam build</code></pre>
<pre><code class="language-plaintext">Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml</code></pre>
<hr>
<h2><span id="toc15">Step 6: sam deploy（デプロイ）</span></h2>
<pre><code class="language-cmd">sam deploy</code></pre>
<pre><code class="language-plaintext">Deploy this changeset? [y/N]: y</code></pre>
<p><code>y</code> を入力して進めます。数分でデプロイが完了します。</p>
<h3><span id="toc16">デプロイ完了の確認</span></h3>
<pre><code class="language-plaintext">CloudFormation outputs from deployed stack
----------------------------------------------------------------------
Outputs
----------------------------------------------------------------------
Key    BucketName
Value  s3-event-lambda-stack-upload-123456789012

Key    S3EventFunctionArn
Value  arn:aws:lambda:ap-northeast-1:123456789012:function:s3-event-lambda-stack-S3EventFunction-XXXX

Key    CloudWatchLogsGroup
Value  /aws/lambda/s3-event-lambda-stack-S3EventFunction-XXXX
----------------------------------------------------------------------</code></pre>
<p><strong><code>BucketName</code> を控えておきます。</strong>（テスト時に使います）</p>
<blockquote>
<p><strong><code>BucketAlreadyExists</code> エラーが出た場合：</strong><br />既に同名バケットが他アカウントに存在しています。<code>samconfig.toml</code> の <code>stack_name</code> を別の名前に変更して再デプロイしてください。</p>
</blockquote>
<hr>
<h2><span id="toc17">Step 7: 動作テスト</span></h2>
<h3><span id="toc18">7-1. テスト用ファイルの準備</span></h3>
<pre><code class="language-cmd">echo テストファイルです &gt; C:\test.txt</code></pre>
<h3><span id="toc19">7-2. バケット名を変数にセットする</span></h3>
<pre><code class="language-cmd">set BUCKET=s3-event-lambda-stack-upload-123456789012</code></pre>
<p>（<code>BUCKET</code> の値は Outputs の <code>BucketName</code> に表示された実際の値に変更してください）</p>
<h3><span id="toc20">7-3. ファイルのアップロード</span></h3>
<pre><code class="language-cmd">aws s3 cp C:\test.txt s3://%BUCKET%/test.txt --region ap-northeast-1</code></pre>
<h3><span id="toc21">7-4. CloudWatch Logs でログを確認</span></h3>
<pre><code class="language-cmd">aws logs tail /aws/lambda/s3-event-lambda-stack-S3EventFunction-XXXX --follow</code></pre>
<p><strong>期待するログ出力：</strong></p>
<pre><code class="language-json">{"eventName": "ObjectCreated:Put", "bucket": "s3-event-lambda-stack-upload-123456789012", "key": "test.txt", "sizeBytes": 28, "eventTime": "2026-02-22T10:00:00.000Z"}
{"processedCount": 1}</code></pre>
<p><strong>確認ポイント：</strong></p>
<ul>
<li><code>&quot;eventName&quot;: &quot;ObjectCreated:Put&quot;</code> — S3 の Put（アップロード）が検知されている</li>
<li><code>&quot;key&quot;: &quot;test.txt&quot;</code> — アップロードしたファイル名が正しく取得されている</li>
<li><code>&quot;sizeBytes&quot;</code> — ファイルサイズ（バイト）が記録されている</li>
</ul>
<p><!-- ![CloudWatch Logsのログ確認](images/cloudwatch-logs-output.jpg) --></p>
<h3><span id="toc22">7-5. フォルダ付きキーのテスト（任意）</span></h3>
<p>S3の「フォルダ」はキー名のプレフィックスとして表現されます。</p>
<pre><code class="language-cmd">aws s3 cp C:\test.txt s3://%BUCKET%/images/photo.jpg --region ap-northeast-1</code></pre>
<p>ログで <code>&quot;key&quot;: &quot;images/photo.jpg&quot;</code> となることを確認します。S3にフォルダ構造でファイルを整理している場合でも、キー名全体（<code>フォルダ名/ファイル名</code>）が取得できます。</p>
<h3><span id="toc23">7-6. 日本語ファイル名のテスト（任意）</span></h3>
<pre><code class="language-cmd">echo 日本語テスト &gt; "C:\テスト.txt"
aws s3 cp "C:\テスト.txt" "s3://%BUCKET%/テスト.txt" --region ap-northeast-1</code></pre>
<p>ログで <code>&quot;key&quot;: &quot;テスト.txt&quot;</code> と正しくデコードされていることを確認します。<code>urllib.parse.unquote_plus</code> がなければ <code>%E3%83%86%E3%82%B9%E3%83%88.txt</code> のままになります。</p>
<hr>
<h2><span id="toc24">Step 8: AWSコンソールで確認（任意）</span></h2>
<ul>
<li><strong>S3</strong>: S3 → <code>s3-event-lambda-stack-upload-XXXX</code> → アップロードしたファイルが存在することを確認</li>
<li><strong>Lambda</strong>: Lambda → 関数 → <code>s3-event-lambda-stack-S3EventFunction-XXXX</code> → 「設定」→「トリガー」でS3トリガーを確認</li>
<li><strong>CloudWatch Logs</strong>: Lambda → 対象関数 → 「モニタリング」タブ → 「CloudWatch Logs を表示」</li>
</ul>
<p><!-- ![LambdaのS3トリガー設定確認](images/lambda-s3-trigger.jpg) --></p>
<hr>
<h2><span id="toc25">Step 9: リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ずリソースを削除してください。</strong></p>
<blockquote>
<p><strong>重要: <code>sam delete</code> の前に必ずバケットを空にしてください。</strong><br />S3バケットにオブジェクトが残った状態で <code>sam delete</code> を実行すると、CloudFormation のスタック削除が失敗します。</p>
</blockquote>
<h3><span id="toc26">① バケット内のオブジェクトをすべて削除する</span></h3>
<pre><code class="language-cmd">aws s3 rm s3://%BUCKET% --recursive --region ap-northeast-1</code></pre>
<h3><span id="toc27">② スタックを削除する</span></h3>
<pre><code class="language-cmd">sam delete --stack-name s3-event-lambda-stack --region ap-northeast-1</code></pre>
<pre><code class="language-plaintext">Are you sure you want to delete the stack s3-event-lambda-stack? [y/N]: y
Are you sure you want to delete the folder s3-event-lambda-stack in S3? [y/N]: y</code></pre>
<h3><span id="toc28">削除完了の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks --stack-name s3-event-lambda-stack --region ap-northeast-1</code></pre>
<pre><code class="language-plaintext">An error occurred (ValidationError): Stack with id s3-event-lambda-stack does not exist</code></pre>
<h3><span id="toc29">バケット削除を忘れて sam delete が失敗した場合</span></h3>
<pre><code class="language-plaintext">Error: Failed to delete the stack: s3-event-lambda-stack, ...
The following resource(s) failed to delete: [UploadBucket]</code></pre>
<p>このエラーが出た場合は、バケットを空にしてから再度 <code>sam delete</code> を実行します。</p>
<pre><code class="language-cmd">aws s3 rm s3://%BUCKET% --recursive --region ap-northeast-1
sam delete --stack-name s3-event-lambda-stack --region ap-northeast-1</code></pre>
<hr>
<h2><span id="toc30">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>sam deploy</code> が <code>BucketAlreadyExists</code> エラー</td>
<td>同名バケットが他アカウントに存在する</td>
<td><code>samconfig.toml</code> の <code>stack_name</code> を変更する</td>
</tr>
<tr>
<td><code>sam deploy</code> が <code>Missing --stack-name</code> エラー</td>
<td><code>samconfig.toml</code> がない</td>
<td><code>s3-event-lambda/</code> 直下に <code>samconfig.toml</code> を作成する</td>
</tr>
<tr>
<td>ファイルアップロード後もログが出ない</td>
<td>Lambda が呼ばれていない</td>
<td>Lambda → 「設定」→「トリガー」でS3トリガーが有効か確認</td>
</tr>
<tr>
<td>ログの <code>&quot;key&quot;</code> が <code>%XX%XX...</code> のまま</td>
<td>URLデコードされていない</td>
<td><code>app.py</code> の <code>unquote_plus</code> 処理を確認</td>
</tr>
<tr>
<td><code>sam delete</code> が失敗する</td>
<td>バケットにオブジェクトが残っている</td>
<td><code>aws s3 rm s3://バケット名 --recursive</code> で先に空にする</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>S3イベントトリガー</strong></td>
<td>アップロード直後にLambdaが自動起動することを確認</td>
</tr>
<tr>
<td><strong>URLデコード</strong></td>
<td>日本語ファイル名が正しく取得できることを確認</td>
</tr>
<tr>
<td><strong>フォルダ付きキー</strong></td>
<td><code>images/photo.jpg</code> のようなプレフィックス付きキーも取得できることを確認</td>
</tr>
<tr>
<td><strong>削除</strong></td>
<td>バケットを先に空にしてから <code>sam delete</code> でクリーンアップ</td>
</tr>
</tbody>
</table>
<h3><span id="toc32">SAMのメリットを実感できたポイント</span></h3>
<ul>
<li><code>!Sub &quot;${AWS::StackName}-upload-${AWS::AccountId}&quot;</code> でバケット名のグローバルユニークを自動保証（コンソール版では手動で一意な名前を考える必要がある）</li>
<li><code>Type: S3</code> の1行でS3イベント通知設定とLambdaリソースベースポリシーを自動作成（コンソール版では「トリガーを追加」の手動操作が必要）</li>
</ul>
<h3><span id="toc33">このハンズオンの発展形</span></h3>
<ul>
<li><strong>S3からファイルの中身を読み取る</strong> — Lambda の実行ロールに <code>s3:GetObject</code> 権限を追加して、CSVやJSONを読み込む処理に拡張</li>
<li><strong>DynamoDBへの記録</strong> — ファイル情報をDynamoDBに書き込んで一覧管理</li>
<li><strong>特定のフォルダ・拡張子のみトリガー</strong> — <code>Prefix: images/</code> や <code>Suffix: .csv</code> でフィルタリング</li>
<li><strong>画像リサイズ</strong> — <code>Pillow</code> ライブラリと組み合わせてアップロード時に自動リサイズ</li>
</ul>
<hr>
<h2><span id="toc34">コンソール操作と比較してみる</span></h2>
<p>SAMが裏で何をやっているか、全く同じ構成をAWSコンソールのみで構築する手順をまとめました。「バケット名のグローバルユニーク問題」や「再帰呼び出しの警告」など、コンソールならではのつまずきポイントが体験できます。</p>
<ul>
<li>AWSコンソールだけでS3 + Lambdaファイルアップロードトリガーを構築する手順【SAM版との比較付き】</li>
</ul>
<p><!-- https://caymezon.com/aws-handson-console-s3-event-lambda/ --></p>
<hr>
<h2><span id="toc35">関連記事</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-s3-event-lambda/">AWSハンズオン - S3へのファイルアップロードをトリガーにLambdaを自動起動しよう【SAM版 / Windows対応】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-s3-event-lambda/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWSコンソールだけでS3 + Lambdaファイルアップロードトリガーを構築する手順【SAM版との比較付き】</title>
		<link>https://caymezon.com/aws-handson-console-s3-event-lambda/</link>
					<comments>https://caymezon.com/aws-handson-console-s3-event-lambda/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Mon, 23 Feb 2026 04:16: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[S3]]></category>
		<category><![CDATA[S3イベント]]></category>
		<category><![CDATA[SAM比較]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[ファイルアップロード]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[非同期処理]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20204</guid>

					<description><![CDATA[<p>目次 はじめにSAM vs コンソール：どれだけ違うか構築するもの全体の作業順序① S3 バケット作成1-1. バケットの設定② Lambda 関数作成2-1. 基本設定2-2. コードの入力③ S3 トリガーを Lam [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-console-s3-event-lambda/">AWSコンソールだけでS3 + 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">① S3 バケット作成</a><ol><li><a href="#toc6" tabindex="0">1-1. バケットの設定</a></li></ol></li><li><a href="#toc7" tabindex="0">② Lambda 関数作成</a><ol><li><a href="#toc8" tabindex="0">2-1. 基本設定</a></li><li><a href="#toc9" tabindex="0">2-2. コードの入力</a></li></ol></li><li><a href="#toc10" tabindex="0">③ S3 トリガーを Lambda に追加</a></li><li><a href="#toc11" tabindex="0">④ 動作テスト</a><ol><li><a href="#toc12" tabindex="0">4-1. テスト用ファイルの準備</a></li><li><a href="#toc13" tabindex="0">4-2. ファイルのアップロード</a></li><li><a href="#toc14" tabindex="0">4-3. CloudWatch Logs でログを確認</a></li><li><a href="#toc15" tabindex="0">4-4. 日本語ファイル名のテスト（任意）</a></li></ol></li><li><a href="#toc16" tabindex="0">⑤ リソースの削除</a><ol><li><a href="#toc17" tabindex="0">1. S3 バケット内のオブジェクトをすべて削除する</a></li><li><a href="#toc18" tabindex="0">2. S3 バケットを削除する</a></li><li><a href="#toc19" tabindex="0">3. Lambda 関数を削除する</a></li><li><a href="#toc20" tabindex="0">4. IAM ロールを削除する（任意）</a></li><li><a href="#toc21" tabindex="0">5. CloudWatch Logs のロググループを削除する（任意）</a></li></ol></li><li><a href="#toc22" tabindex="0">SAMとの対比まとめ</a></li><li><a href="#toc23" tabindex="0">トラブルシューティング</a></li><li><a href="#toc24" tabindex="0">まとめ</a><ol><li><a href="#toc25" tabindex="0">コンソール操作で確認できたこと</a></li><li><a href="#toc26" tabindex="0">どちらを使うべきか</a></li></ol></li><li><a href="#toc27" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>この記事は、<a href="https://caymezon.com/aws-handson-s3-event-lambda/">SAM版ハンズオン記事</a>の比較版です。</p>
<p>SAM版ではコマンド数本でS3バケット・Lambda・イベント通知設定が完了しましたが、<strong>「SAMが裏で何をやっているのか？」「バケット名のグローバルユニーク問題はどう解決する？」「再帰呼び出しの警告って何？」</strong> といった疑問を実際のコンソール操作を通じて体験できるのがこの記事です。</p>
<p><strong>この記事を読むとわかること：</strong></p>
<ul>
<li>S3・Lambda を個別に設定する順序と依存関係</li>
<li>SAMの <code>!Sub &quot;${AWS::StackName}-upload-${AWS::AccountId}&quot;</code> が解決していること（バケット名のグローバルユニーク問題）</li>
<li>「再帰呼び出し」警告の意味と、今回は無視してよい理由</li>
<li>S3バケット削除時に「先に空にする」が必要な理由</li>
</ul>
<hr>
<h2><span id="toc2">SAM vs コンソール：どれだけ違うか</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>SAM（コード）</th>
<th>コンソール（手動）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>バケット名の一意性確保</strong></td>
<td><code>!Sub &quot;...-${AWS::AccountId}&quot;</code> で自動</td>
<td><strong>手動でグローバルユニークな名前を考える</strong></td>
</tr>
<tr>
<td><strong>S3イベント通知設定</strong></td>
<td><code>Type: S3</code> の1行</td>
<td><strong>Lambda → トリガーを追加（画面操作）</strong></td>
</tr>
<tr>
<td><strong>リソースベースポリシー</strong></td>
<td>自動追加</td>
<td><strong>トリガー追加時に自動追加（画面の警告を確認する必要あり）</strong></td>
</tr>
<tr>
<td><strong>削除</strong></td>
<td>バケットを空にしてから <code>sam delete</code></td>
<td><strong>S3オブジェクト削除 → バケット削除 → Lambda削除 × 個別操作</strong></td>
</tr>
</tbody>
</table>
<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="toc3">構築するもの</span></h2>
<p>SAM版と全く同じ構成・機能のファイルアップロードトリガー環境を構築します。</p>
<pre><code class="language-plaintext">ファイルアップロード（コンソール / AWS CLI）
  ↓ S3 ObjectCreated イベント発火
S3 バケット（my-s3-event-upload）
  ↓ Lambda を呼び出し
Lambda（S3EventFunction / Python 3.12）
  ↓ ファイル情報（バケット名・ファイル名・サイズ）をログ出力
CloudWatch Logs</code></pre>
<hr>
<h2><span id="toc4">全体の作業順序</span></h2>
<pre><code class="language-plaintext">① S3 バケット作成
      ↓
② Lambda 関数作成（コード入力）
      ↓
③ S3 トリガーを Lambda に追加（リソースベースポリシーも自動設定）
      ↓
④ ファイルアップロードして動作テスト
⑤ リソースの削除（S3を先に空にする）</code></pre>
<blockquote>
<p><strong>順序の理由：</strong><br />③でS3トリガーを追加する際に「どのバケットを対象にするか」を選択するため、①でバケットを先に作成しておく必要があります。SQSハンズオンのようにARNのコピーが必要な場面はありませんが、バケットが存在しないとトリガー設定画面で選択できません。</p>
</blockquote>
<hr>
<h2><span id="toc5">① S3 バケット作成</span></h2>
<p><strong>AWSコンソール → S3 → 「バケットを作成」</strong></p>
<p><!-- ![S3 バケット作成画面](images/s3-create-bucket.jpg) --></p>
<h3><span id="toc6">1-1. バケットの設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>バケット名</td>
<td><code>my-s3-event-upload</code>（任意。グローバルで一意な名前）</td>
</tr>
<tr>
<td>AWSリージョン</td>
<td><strong>アジアパシフィック（東京）ap-northeast-1</strong></td>
</tr>
<tr>
<td>オブジェクト所有者</td>
<td>ACL 無効（デフォルトのまま）</td>
</tr>
<tr>
<td>パブリックアクセスのブロック</td>
<td>すべてブロック（デフォルトのまま）</td>
</tr>
<tr>
<td>バージョニング</td>
<td>無効（デフォルトのまま）</td>
</tr>
<tr>
<td>暗号化</td>
<td>Amazon S3 マネージドキー（デフォルトのまま）</td>
</tr>
</tbody>
</table>
<p>「バケットを作成」をクリックします。</p>
<blockquote>
<p><strong>バケット名のルール（SAMとの違いが出るポイント）：</strong></p>
<p>S3のバケット名はAWS全体（全リージョン・全アカウント）でグローバルユニークである必要があります。</p>
<ul>
<li>小文字・数字・ハイフンのみ使用可（大文字・アンダースコアは使えない）</li>
<li><code>my-s3-event-upload</code> だと他のユーザーがすでに使っている可能性がある</li>
</ul>
<p><strong>一意にする推奨の方法：</strong></p>
<ul>
<li><code>my-s3-event-upload-自分のAWSアカウントID</code>（最も確実）</li>
<li><code>my-s3-event-upload-20260222</code>（日付を付ける）</li>
</ul>
<p>SAMでは <code>!Sub &quot;${AWS::StackName}-upload-${AWS::AccountId}&quot;</code> で自動的にアカウントIDを付加しています。コンソールではこのルールを頭の中で考えて手動入力する必要があります。</p>
</blockquote>
<p><strong>控えておく情報：</strong></p>
<ul>
<li>バケット名（例: <code>my-s3-event-upload</code>）</li>
</ul>
<hr>
<h2><span id="toc7">② Lambda 関数作成</span></h2>
<p><strong>AWSコンソール → Lambda → 「関数の作成」</strong></p>
<h3><span id="toc8">2-1. 基本設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>作成方法</td>
<td>一から作成</td>
</tr>
<tr>
<td>関数名</td>
<td><code>S3EventFunction</code></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>「関数の作成」をクリックします。</p>
<blockquote>
<p><strong>実行ロールについて：</strong><br />今回の Lambda はS3イベントのメタデータ（バケット名・ファイル名・サイズ）を受け取るだけで、S3からファイルの<strong>中身を読み取る処理は行いません</strong>。<br />そのため、基本実行ロール（CloudWatch Logs への書き込み権限のみ）で動作します。<br />ファイルの中身を読み取りたい場合は、実行ロールに <code>s3:GetObject</code> 権限を追加する必要があります。</p>
</blockquote>
<h3><span id="toc9">2-2. コードの入力</span></h3>
<p>関数ページ → 「コード」タブ → コードエディタで <code>lambda_function.py</code> を開きます。</p>
<p>既存の内容を<strong>全て</strong>置き換えて以下を貼り付けます。</p>
<pre><code class="language-python">import json
import urllib.parse


def lambda_handler(event, context):
    results = []

    for record in event["Records"]:          # 複数ファイル同時アップロードに対応
        bucket = record["s3"]["bucket"]["name"]
        # キー名は URL エンコードされているためデコードが必要（日本語・スペース対応）
        key = urllib.parse.unquote_plus(record["s3"]["object"]["key"])
        size = record["s3"]["object"]["size"]
        event_name = record["eventName"]     # 例: "ObjectCreated:Put"
        event_time = record["eventTime"]     # 例: "2026-02-22T10:00:00.000Z"

        info = {
            "eventName": event_name,
            "bucket": bucket,
            "key": key,
            "sizeBytes": size,
            "eventTime": event_time,
        }

        print(json.dumps(info, ensure_ascii=False))
        results.append(info)

    print(json.dumps({"processedCount": len(results)}, ensure_ascii=False))
    return {"processedCount": len(results)}</code></pre>
<p>「Deploy」ボタンをクリックしてコードを保存します。</p>
<hr>
<h2><span id="toc10">③ S3 トリガーを Lambda に追加</span></h2>
<p>Lambdaコンソールからトリガーを追加する方法と、S3コンソールからイベント通知を設定する方法の2つがありますが、ここではLambdaコンソールから行います。</p>
<p><strong>Lambda → <code>S3EventFunction</code> → 「設定」タブ → 「トリガー」→「トリガーを追加」</strong></p>
<p><!-- ![Lambda S3トリガー追加画面](images/lambda-s3-trigger-add.jpg) --></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>ソース</td>
<td><strong>S3</strong></td>
</tr>
<tr>
<td>バケット</td>
<td>① で作成したバケット（例: <code>my-s3-event-upload</code>）</td>
</tr>
<tr>
<td>イベントタイプ</td>
<td><strong>すべてのオブジェクト作成イベント</strong></td>
</tr>
<tr>
<td>プレフィックス</td>
<td>空欄（全フォルダが対象）</td>
</tr>
<tr>
<td>サフィックス</td>
<td>空欄（全ファイルタイプが対象）</td>
</tr>
<tr>
<td>再帰呼び出し</td>
<td>「このトリガーを確認しました」にチェック</td>
</tr>
</tbody>
</table>
<p>「追加」をクリックします。</p>
<blockquote>
<p><strong>「再帰呼び出し」の警告とは：</strong></p>
<p>S3バケットへのアップロードをトリガーに<strong>同じバケットへ書き込む Lambda</strong> を設定すると、無限ループが発生します。例えば「画像をアップロード → Lambdaがリサイズして同じバケットに保存 → それがまたトリガーになる → …」というパターンです。</p>
<p>今回の Lambda はS3への書き込みを行わず、ログを出力するだけなので問題ありません。「このトリガーを確認しました」にチェックして続行してください。</p>
<p><strong>SAMとの差分：</strong> SAMの <code>Type: S3</code> イベントでも同じ構成になっています。SAMは警告なしに設定されますが、同じリスクが存在します。</p>
</blockquote>
<blockquote>
<p><strong>自動設定されること：</strong><br />Lambdaのリソースベースポリシーに「S3からの呼び出しを許可するポリシー」が自動追加されます。<br />S3がLambdaを呼び出すためのIAM設定を手動で行う必要はありません。</p>
</blockquote>
<hr>
<h2><span id="toc11">④ 動作テスト</span></h2>
<h3><span id="toc12">4-1. テスト用ファイルの準備</span></h3>
<pre><code class="language-cmd">echo テストファイルです &gt; C:\test.txt</code></pre>
<h3><span id="toc13">4-2. ファイルのアップロード</span></h3>
<p><strong>方法A: S3 コンソールからアップロード</strong></p>
<p>S3 → <code>my-s3-event-upload</code> → 「アップロード」→「ファイルを追加」→ <code>test.txt</code> を選択 → 「アップロード」</p>
<p><strong>方法B: AWS CLI でアップロード</strong></p>
<pre><code class="language-cmd">aws s3 cp C:\test.txt s3://my-s3-event-upload/test.txt --region ap-northeast-1</code></pre>
<h3><span id="toc14">4-3. CloudWatch Logs でログを確認</span></h3>
<p>Lambda → <code>S3EventFunction</code> → 「モニタリング」タブ → 「CloudWatch Logs を表示」→ 最新のログストリームを開きます。</p>
<p><!-- ![CloudWatch Logsのログ確認](images/cloudwatch-logs-output.jpg) --></p>
<p><strong>期待するログ出力：</strong></p>
<pre><code class="language-json">{"eventName": "ObjectCreated:Put", "bucket": "my-s3-event-upload", "key": "test.txt", "sizeBytes": 28, "eventTime": "2026-02-22T10:00:00.000Z"}
{"processedCount": 1}</code></pre>
<p><strong>確認ポイント：</strong></p>
<ul>
<li><code>&quot;eventName&quot;: &quot;ObjectCreated:Put&quot;</code> — S3の Put（アップロード）が検知されている</li>
<li><code>&quot;key&quot;: &quot;test.txt&quot;</code> — アップロードしたファイル名が正しく取得されている</li>
<li><code>&quot;sizeBytes&quot;</code> — ファイルサイズが記録されている</li>
</ul>
<h3><span id="toc15">4-4. 日本語ファイル名のテスト（任意）</span></h3>
<pre><code class="language-cmd">echo 日本語テスト &gt; "C:\テスト.txt"
aws s3 cp "C:\テスト.txt" "s3://my-s3-event-upload/テスト.txt" --region ap-northeast-1</code></pre>
<p>ログで <code>&quot;key&quot;: &quot;テスト.txt&quot;</code> と正しくデコードされていることを確認します。</p>
<hr>
<h2><span id="toc16">⑤ リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ずリソースを削除してください。</strong></p>
<blockquote>
<p><strong>S3バケット削除の重要な注意点：</strong><br /><strong>オブジェクトが残っているバケットは削除できません。</strong><br />先にバケット内のファイルをすべて削除してからバケットを削除してください。</p>
<p>SAMの <code>sam delete</code> でも同じ理由から「先にバケットを空にする」手順が必要です。この仕様はSAMを使っても変わりません。</p>
</blockquote>
<h3><span id="toc17">1. S3 バケット内のオブジェクトをすべて削除する</span></h3>
<p><strong>方法A: S3 コンソールから</strong></p>
<p>S3 → <code>my-s3-event-upload</code> → ファイルをすべて選択 → 「削除」→ 確認テキストを入力 → 「オブジェクトを削除」</p>
<p><strong>方法B: AWS CLI で一括削除（推奨）</strong></p>
<pre><code class="language-cmd">aws s3 rm s3://my-s3-event-upload --recursive --region ap-northeast-1</code></pre>
<h3><span id="toc18">2. S3 バケットを削除する</span></h3>
<p><strong>S3 → <code>my-s3-event-upload</code> を選択 → 「削除」→ バケット名を入力 → 「バケットを削除」</strong></p>
<h3><span id="toc19">3. Lambda 関数を削除する</span></h3>
<p><strong>Lambda → 関数 → <code>S3EventFunction</code> を選択 → 「アクション」→「削除」→ 確認テキストを入力 → 「削除」</strong></p>
<h3><span id="toc20">4. IAM ロールを削除する（任意）</span></h3>
<p><strong>IAM → ロール → <code>S3EventFunction-role-XXXX</code> を選択 → 「削除」→ ロール名を入力 → 「削除」</strong></p>
<p>Lambda を削除してもIAMロールはそのまま残ります。不要なら手動で削除します。</p>
<h3><span id="toc21">5. CloudWatch Logs のロググループを削除する（任意）</span></h3>
<p><strong>CloudWatch → ロググループ → <code>/aws/lambda/S3EventFunction</code> → 「アクション」→「ロググループの削除」</strong></p>
<hr>
<h2><span id="toc22">SAMとの対比まとめ</span></h2>
<table>
<thead>
<tr>
<th>SAMの記述</th>
<th>コンソールでやること</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Type: AWS::S3::Bucket</code></td>
<td>S3 → バケットを作成</td>
</tr>
<tr>
<td><code>!Sub &quot;${AWS::StackName}-upload-${AWS::AccountId}&quot;</code></td>
<td>手動でグローバルユニークなバケット名を考えて入力</td>
</tr>
<tr>
<td><code>Type: S3</code> イベント / <code>Events: s3:ObjectCreated:*</code></td>
<td>Lambda → トリガーを追加（S3・全オブジェクト作成イベント）</td>
</tr>
<tr>
<td>リソースベースポリシー（自動）</td>
<td>トリガー追加時に自動設定（「再帰呼び出し」警告にチェック）</td>
</tr>
<tr>
<td><code>DeletionPolicy: Delete</code></td>
<td>手動でバケットを空にしてからバケット削除</td>
</tr>
<tr>
<td><code>sam delete</code></td>
<td>S3バケット・Lambda・IAMロール・ロググループを個別に削除</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc23">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>ファイルをアップロードしてもLambdaが起動しない</td>
<td>S3トリガーが設定されていない</td>
<td>③ の手順でトリガーを追加する</td>
</tr>
<tr>
<td>ログに <code>&quot;key&quot;</code> が <code>%XX%XX...</code> と表示される</td>
<td>URLデコードされていない</td>
<td><code>urllib.parse.unquote_plus(key)</code> でデコードしているか確認</td>
</tr>
<tr>
<td>バケット削除がエラーになる</td>
<td>バケット内にオブジェクトが残っている</td>
<td><code>aws s3 rm s3://バケット名 --recursive</code> で先に空にする</td>
</tr>
<tr>
<td>Lambda が 500 エラー</td>
<td>コードの構文エラーなど</td>
<td>CloudWatch Logs でエラー内容を確認</td>
</tr>
<tr>
<td>トリガー追加時に「再帰呼び出し」の警告が出る</td>
<td>同バケットへの書き込みトリガーへの注意</td>
<td>今回のLambdaはS3に書き込まないためチェックを入れて続行</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc24">まとめ</span></h2>
<h3><span id="toc25">コンソール操作で確認できたこと</span></h3>
<table>
<thead>
<tr>
<th>SAMの記述</th>
<th>コンソール操作で理解できたこと</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>!Sub &quot;...-${AWS::AccountId}&quot;</code></td>
<td>バケット名のグローバルユニーク問題を手動で解決する必要がある</td>
</tr>
<tr>
<td><code>Type: S3</code> イベント（自動）</td>
<td>トリガー追加画面で「再帰呼び出し警告」の意味を確認できる</td>
</tr>
<tr>
<td><code>DeletionPolicy: Delete</code></td>
<td>S3は「先に空にしてから削除」が必須ルール（SAMでも同じ）</td>
</tr>
</tbody>
</table>
<h3><span id="toc26">どちらを使うべきか</span></h3>
<table>
<thead>
<tr>
<th>シーン</th>
<th>推奨</th>
</tr>
</thead>
<tbody>
<tr>
<td>本番環境・チーム開発</td>
<td><strong>SAM</strong>（バケット名の管理・再現性・速度）</td>
</tr>
<tr>
<td>AWSを初めて学ぶ</td>
<td><strong>コンソール</strong>（各設定の意味を理解する）</td>
</tr>
<tr>
<td>構築済みリソースの確認・デバッグ</td>
<td><strong>コンソール</strong>（S3のオブジェクト確認・イベント通知設定の目視）</td>
</tr>
<tr>
<td>同じ構成を繰り返しデプロイ</td>
<td><strong>SAM</strong>（ミスゼロ・自動化）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc27">関連記事</span></h2>
<ul>
<li>SAM版ハンズオン — コマンド数本でS3 + Lambdaトリガー環境を構築</li>
</ul>

<a rel="noopener" href="https://caymezon.com/aws-handson-s3-event-lambda/" title="AWSハンズオン - S3へのファイルアップロードをトリガーにLambdaを自動起動しよう【SAM版 / Windows対応】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/aws-handson-s3-event-lambda-featured-a9f1dc-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/aws-handson-s3-event-lambda-featured-a9f1dc-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-s3-event-lambda-featured-a9f1dc-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-s3-event-lambda-featured-a9f1dc-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-s3-event-lambda-featured-a9f1dc-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">AWSハンズオン - S3へのファイルアップロードをトリガーにLambdaを自動起動しよう【SAM版 / Windows対応】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「S3にファイルが上がったら自動で処理したい」というのは、AWSを使う現場でよく出てくる要件です。画像のリサイズ、CSVの集計、ログファイルの解析など、ファイルアップロードを起点にした自動処理はサーバーレス構成の代表的なユースケース...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.23</div></div></div></div></a>
<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-s3-event-lambda/">AWSコンソールだけでS3 + Lambdaファイルアップロードトリガーを構築する手順【SAM版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-console-s3-event-lambda/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWSハンズオン - SQS + Lambdaでメッセージキュー処理を実装しよう【SAM版 / Windows対応】</title>
		<link>https://caymezon.com/aws-handson-sqs-lambda-queue/</link>
					<comments>https://caymezon.com/aws-handson-sqs-lambda-queue/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Mon, 23 Feb 2026 00:59:35 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SAM]]></category>
		<category><![CDATA[SQS]]></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=20200</guid>

					<description><![CDATA[<p>目次 はじめにSQS（メッセージキュー）とはキューが解決する問題前提条件AWS認証の確認使用するAWSサービスStep 1: プロジェクトフォルダを開くフォルダ構造Step 2: SAMテンプレートの確認（templat [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-sqs-lambda-queue/">AWSハンズオン - SQS + Lambdaでメッセージキュー処理を実装しよう【SAM版 / Windows対応】</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">SQS（メッセージキュー）とは</a><ol><li><a href="#toc3" tabindex="0">キューが解決する問題</a></li></ol></li><li><a href="#toc4" tabindex="0">前提条件</a><ol><li><a href="#toc5" tabindex="0">AWS認証の確認</a></li></ol></li><li><a href="#toc6" tabindex="0">使用するAWSサービス</a></li><li><a href="#toc7" tabindex="0">Step 1: プロジェクトフォルダを開く</a><ol><li><a href="#toc8" tabindex="0">フォルダ構造</a></li></ol></li><li><a href="#toc9" tabindex="0">Step 2: SAMテンプレートの確認（template.yaml）</a><ol><li><a href="#toc10" tabindex="0">template.yaml のポイント解説</a></li></ol></li><li><a href="#toc11" tabindex="0">Step 3: Lambdaコードの確認（src/app.py）</a><ol><li><a href="#toc12" tabindex="0">app.py のポイント解説</a></li></ol></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></ol></li><li><a href="#toc17" tabindex="0">Step 7: 動作テスト</a><ol><li><a href="#toc18" tabindex="0">7-1. 正常処理テスト</a></li><li><a href="#toc19" tabindex="0">7-2. 複数メッセージテスト（バッチ処理確認）</a></li><li><a href="#toc20" tabindex="0">7-3. DLQテスト（処理失敗 → DLQへの振り分け確認）</a></li></ol></li><li><a href="#toc21" tabindex="0">Step 8: AWSコンソールで確認（任意）</a></li><li><a href="#toc22" tabindex="0">Step 9: リソースの削除</a><ol><li><a href="#toc23" tabindex="0">削除完了の確認</a></li></ol></li><li><a href="#toc24" tabindex="0">トラブルシューティング</a></li><li><a href="#toc25" tabindex="0">まとめ</a><ol><li><a href="#toc26" tabindex="0">SAMのメリットを実感できたポイント</a></li><li><a href="#toc27" tabindex="0">このハンズオンの発展形</a></li></ol></li><li><a href="#toc28" tabindex="0">コンソール操作と比較してみる</a></li><li><a href="#toc29" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>「メッセージキューって何に使うの？」「エラーが起きたメッセージをどうやって管理するの？」という疑問を持っている方向けに、<strong>Amazon SQS + Lambda によるメッセージキュー処理</strong>をゼロから構築するハンズオンを紹介します。</p>
<p>今回のハンズオンでは、<strong>AWS SAM（Serverless Application Model）</strong> を使って以下の構成を実装します。</p>
<pre><code class="language-plaintext">送信者（AWS CLI）
  ↓ メッセージ送信
SQS キュー（BatchQueue）
  ↓ Lambda がポーリング（自動）
Lambda（Python 3.12 / ProcessFunction）
  ↓ 処理成功 → メッセージ削除（自動）
  ↓ 処理失敗（3回）→ DLQに移動
SQS デッドレターキュー（BatchDLQ）
  ↓ ログ出力
CloudWatch Logs</code></pre>
<p><strong>このハンズオンで体験できること：</strong></p>
<ul>
<li>メッセージの送信・受信の仕組み（キューとLambdaのポーリング構造）</li>
<li><strong>バッチ処理</strong>（最大5件まとめてLambdaに渡す）</li>
<li><strong>デッドレターキュー（DLQ）</strong>（失敗メッセージを退避・後処理できる仕組み）</li>
<li>SAMテンプレート1ファイルでSQS・DLQ・Lambda・IAM権限を一括管理</li>
</ul>
<p><strong>この記事の特徴：</strong></p>
<ul>
<li>Windows（VSCode + コマンドプロンプト）での実際の手順を詳細に解説</li>
<li>DLQが動くまでの待機時間など、<strong>つまずきやすいポイントに注意書きあり</strong></li>
<li>ハンズオン完了後の <code>sam delete</code> による完全クリーンアップ手順まで含む</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">SQS（メッセージキュー）とは</span></h2>
<h3><span id="toc3">キューが解決する問題</span></h3>
<p>SQSがない場合、送信者（API・バッチ）は処理者（Lambda）に<strong>直接</strong>データを渡します。処理者が落ちていたり過負荷だと、データが失われます。</p>
<p>SQSを挟むと、送信者はキューに投げるだけ。処理者は自分のペースでキューからメッセージを取り出せます。これが<strong>非同期処理</strong>の基本形です。</p>
<table>
<thead>
<tr>
<th>用語</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>キュー</strong></td>
<td>メッセージを一時保管する「行列」。送信者と処理者を分離する</td>
</tr>
<tr>
<td><strong>ポーリング</strong></td>
<td>Lambdaが SQS を定期的に確認してメッセージを取り出す動作</td>
</tr>
<tr>
<td><strong>可視性タイムアウト</strong></td>
<td>Lambdaが処理中にメッセージを他から見えなくする時間</td>
</tr>
<tr>
<td><strong>デッドレターキュー（DLQ）</strong></td>
<td>処理に繰り返し失敗したメッセージの退避先</td>
</tr>
<tr>
<td><strong>maxReceiveCount</strong></td>
<td>DLQに移動するまでの最大受信（再試行）回数</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">前提条件</span></h2>
<p>以下のツールがインストール・設定済みであることを確認してください。</p>
<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</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>
<h3><span id="toc5">AWS認証の確認</span></h3>
<pre><code class="language-cmd">aws sts get-caller-identity</code></pre>
<p>アカウントIDが表示されれば認証設定済みです。</p>
<hr>
<h2><span id="toc6">使用するAWSサービス</span></h2>
<table>
<thead>
<tr>
<th>サービス</th>
<th>役割</th>
<th>料金</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>SQS（スタンダードキュー）</strong></td>
<td>メッセージの一時保管・配信</td>
<td>100万リクエスト/月まで無料</td>
</tr>
<tr>
<td><strong>SQS（DLQ）</strong></td>
<td>処理失敗メッセージの退避</td>
<td>同上</td>
</tr>
<tr>
<td><strong>Lambda</strong></td>
<td>メッセージ処理本体（Python）</td>
<td>100万リクエスト無料枠あり</td>
</tr>
<tr>
<td><strong>CloudWatch Logs</strong></td>
<td>Lambda実行ログの保存</td>
<td>5GBまで無料</td>
</tr>
<tr>
<td><strong>S3</strong></td>
<td>SAMのデプロイパッケージ置き場</td>
<td>自動作成・少量なのでほぼ無料</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>学習目的の短時間ハンズオンであれば、ほぼ無料枠内で収まります。</strong></p>
</blockquote>
<hr>
<h2><span id="toc7">Step 1: プロジェクトフォルダを開く</span></h2>
<p>VSCodeでプロジェクトフォルダを開きます。</p>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\sqs-lambda-queue</code></pre>
<h3><span id="toc8">フォルダ構造</span></h3>
<pre><code class="language-plaintext">sqs-lambda-queue/
├── template.yaml       # SAMテンプレート（SQS + DLQ + Lambda定義）
├── samconfig.toml      # デプロイ設定（gitignore対象・毎回手動作成が必要）
├── docs/
│   ├── 1_console.md    # AWSコンソール版手順
│   └── 2_sam.md        # SAM版手順
└── src/
    └── app.py          # Lambda関数（メッセージ処理・DLQテスト用エラー機能）</code></pre>
<hr>
<h2><span id="toc9">Step 2: SAMテンプレートの確認（template.yaml）</span></h2>
<p><code>template.yaml</code> がAWSリソース全体の設計図です。SQS・DLQ・Lambda・IAM権限をすべてこのファイル1つで定義します。</p>
<pre><code class="language-yaml">AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SQS + Lambda message queue processing

Globals:
  Function:
    Runtime: python3.12
    Timeout: 30
    MemorySize: 128

Resources:
  BatchDLQ:
    Type: AWS::SQS::Queue
    Properties:
      MessageRetentionPeriod: 86400   # メッセージ保持期間: 1日（86400秒）

  # メインキュー
  BatchQueue:
    Type: AWS::SQS::Queue
    Properties:
      VisibilityTimeout: 180          # Lambda タイムアウト(30s) × 6 = 180s
      RedrivePolicy:
        deadLetterTargetArn: !GetAtt BatchDLQ.Arn   # DLQのARNを自動参照
        maxReceiveCount: 3            # 3回失敗でDLQに移動

  # Lambda 関数
  ProcessFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: app.lambda_handler
      Description: SQSからメッセージを受信して処理するLambda関数
      Policies:
        - SQSPollerPolicy:            # SQS から読み取る権限を自動付与
            QueueName: !GetAtt BatchQueue.QueueName
      Events:
        SQSEvent:
          Type: SQS
          Properties:
            Queue: !GetAtt BatchQueue.Arn   # メインキューと自動連携
            BatchSize: 5              # 一度に最大5件まとめて処理

Outputs:
  BatchQueueUrl:
    Description: "メインキューのURL"
    Value: !Ref BatchQueue
  BatchDLQUrl:
    Description: "DLQのURL"
    Value: !Ref BatchDLQ
  ProcessFunctionArn:
    Description: "Lambda 関数 ARN"
    Value: !GetAtt ProcessFunction.Arn</code></pre>
<h3><span id="toc10">template.yaml のポイント解説</span></h3>
<p><strong><code>SQSPollerPolicy</code>（SAM組み込みポリシー）</strong><br /><code>sqs:ReceiveMessage</code> / <code>sqs:DeleteMessage</code> / <code>sqs:GetQueueAttributes</code> の3つの権限が1行で自動付与されます。コンソール版では <code>AWSLambdaSQSQueueExecutionRole</code> を IAM コンソールで手動アタッチする必要があります。</p>
<p><strong><code>RedrivePolicy: !GetAtt BatchDLQ.Arn</code></strong><br />DLQのARNをSAMが自動参照します。コンソール版ではDLQを先に作成してARNをコピー・貼り付けする必要がありますが、SAMではその手間が不要です。</p>
<p><strong><code>VisibilityTimeout: 180</code></strong><br />Lambda タイムアウト（30秒）× 6 = 180秒。これはAWSの推奨値です。処理中にタイムアウトが切れると、同じメッセージが再度キューに現れて二重処理が発生するため、Lambda タイムアウト × 6 以上を設定するのがベストプラクティスです。</p>
<p><strong><code>Type: SQS</code> イベント</strong><br />SQS と Lambda のイベントソースマッピング（「トリガー」）を自動作成します。コンソール版では Lambda の「トリガーを追加」画面で手動設定が必要です。</p>
<blockquote>
<p><strong>DLQ登場の順序について：</strong><br />SAMテンプレートでは <code>BatchDLQ</code> → <code>BatchQueue</code> → <code>ProcessFunction</code> の順で記述しています。<br />これは CloudFormation の依存解決の都合上、参照先（DLQ）を先に定義する必要があるためです。<br />コンソール版も同じ理由で「DLQ → メインキュー → Lambda」の順で作成します。</p>
</blockquote>
<hr>
<h2><span id="toc11">Step 3: Lambdaコードの確認（src/app.py）</span></h2>
<p><code>src/app.py</code> がメッセージ処理の本体です。SQSからのメッセージをループ処理し、本文が <code>error</code> の場合は意図的に例外を発生させてDLQへの振り分けをテストできます。</p>
<pre><code class="language-python">import json
import datetime


def lambda_handler(event, context):
    results = []

    for record in event["Records"]:       # SQSからの各メッセージを順番に処理
        message_id = record["messageId"]
        body = record["body"]

        # DLQテスト用: "error" というメッセージを受信したら意図的に例外を発生させる
        if body.strip().lower() == "error":
            raise ValueError(f"意図的なエラー: messageId={message_id}, body={body}")

        now = datetime.datetime.now(datetime.timezone.utc)

        result = {
            "messageId": message_id,
            "body": body,
            "processedAt": now.isoformat(),
            "status": "processed",
        }

        print(json.dumps(result, ensure_ascii=False))
        results.append(result)

    print(json.dumps({"processedCount": len(results)}, ensure_ascii=False))
    return {"processedCount": len(results), "results": results}</code></pre>
<h3><span id="toc12">app.py のポイント解説</span></h3>
<p><strong><code>event[&quot;Records&quot;]</code></strong><br />SQSからのメッセージはリスト形式で渡されます。<code>BatchSize: 5</code> の場合、最大5件がまとめて渡されるため、<code>for</code> ループで1件ずつ処理します。</p>
<p><strong><code>raise ValueError(...)</code></strong><br />例外を発生させると Lambda が失敗扱いになり、SQSがメッセージを再試行します。3回失敗するとDLQへ移動します。これがDLQの動作確認に使えます。</p>
<p><strong>外部ライブラリ不使用</strong><br />標準ライブラリ（<code>json</code>, <code>datetime</code>）のみ使用するため、<code>requirements.txt</code> が不要です。</p>
<hr>
<h2><span id="toc13">Step 4: samconfig.toml を作成する</span></h2>
<p><code>samconfig.toml</code> は <code>.gitignore</code> で管理外のため、<strong>毎回手動で作成</strong>する必要があります。</p>
<p><code>sqs-lambda-queue/samconfig.toml</code> を新規作成して以下を貼り付けてください。</p>
<pre><code class="language-toml">version = 0.1

[default.deploy.parameters]
stack_name = "sqs-lambda-queue-stack"
resolve_s3 = true
s3_prefix = "sqs-lambda-queue-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></p>
<p><code>sqs-lambda-queue/</code> フォルダの<strong>直下</strong>に置く必要があります。<br />別のフォルダに置くと以下のエラーが発生します：</p>
<pre><code class="language-plaintext">Error: Missing option '--stack-name', 'sam deploy --guided' can be used to...</code></pre>
</blockquote>
<hr>
<h2><span id="toc14">Step 5: sam build（ビルド）</span></h2>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\sqs-lambda-queue
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>
<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">CloudFormation outputs from deployed stack
----------------------------------------------------------------------
Outputs
----------------------------------------------------------------------
Key    BatchQueueUrl
Value  https://sqs.ap-northeast-1.amazonaws.com/123456789012/sqs-lambda-queue-stack-BatchQueue-XXXX

Key    BatchDLQUrl
Value  https://sqs.ap-northeast-1.amazonaws.com/123456789012/sqs-lambda-queue-stack-BatchDLQ-XXXX

Key    ProcessFunctionArn
Value  arn:aws:lambda:ap-northeast-1:123456789012:function:sqs-lambda-queue-stack-ProcessFunction-XXXX
----------------------------------------------------------------------</code></pre>
<p><strong><code>BatchQueueUrl</code> と <code>BatchDLQUrl</code> を控えておきます。</strong>（テスト時に使います）</p>
<hr>
<h2><span id="toc17">Step 7: 動作テスト</span></h2>
<h3><span id="toc18">7-1. 正常処理テスト</span></h3>
<p>まず環境変数にキューのURLを設定します。</p>
<pre><code class="language-cmd">set QUEUE_URL=https://sqs.ap-northeast-1.amazonaws.com/123456789012/sqs-lambda-queue-stack-BatchQueue-XXXX</code></pre>
<p>メッセージを送信します。</p>
<pre><code class="language-cmd">aws sqs send-message ^
  --queue-url %QUEUE_URL% ^
  --message-body "こんにちは、SQS！" ^
  --region ap-northeast-1</code></pre>
<p>レスポンス例：</p>
<pre><code class="language-json">{
    "MD5OfMessageBody": "...",
    "MessageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}</code></pre>
<p><strong>CloudWatch Logs でログを確認（数秒後）：</strong></p>
<pre><code class="language-cmd">aws logs tail /aws/lambda/sqs-lambda-queue-stack-ProcessFunction-XXXX --follow</code></pre>
<p><strong>期待するログ出力：</strong></p>
<pre><code class="language-json">{"messageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "body": "こんにちは、SQS！", "processedAt": "2026-02-22T10:00:00.000000+00:00", "status": "processed"}
{"processedCount": 1}</code></pre>
<p><code>&quot;status&quot;: &quot;processed&quot;</code> が表示されれば正常処理完了です。</p>
<p><!-- ![CloudWatch Logsのログ確認](images/cloudwatch-logs-normal.jpg) --></p>
<h3><span id="toc19">7-2. 複数メッセージテスト（バッチ処理確認）</span></h3>
<pre><code class="language-cmd">aws sqs send-message --queue-url %QUEUE_URL% --message-body "メッセージ1" --region ap-northeast-1
aws sqs send-message --queue-url %QUEUE_URL% --message-body "メッセージ2" --region ap-northeast-1
aws sqs send-message --queue-url %QUEUE_URL% --message-body "メッセージ3" --region ap-northeast-1</code></pre>
<p><code>BatchSize: 5</code> なので、3件まとめて Lambda に渡される可能性があります（タイミングによる）。まとめて渡された場合のログ：</p>
<pre><code class="language-json">{"messageId": "...", "body": "メッセージ1", "processedAt": "...", "status": "processed"}
{"messageId": "...", "body": "メッセージ2", "processedAt": "...", "status": "processed"}
{"messageId": "...", "body": "メッセージ3", "processedAt": "...", "status": "processed"}
{"processedCount": 3}</code></pre>
<p><code>&quot;processedCount&quot;: 3</code> が1回のLambda呼び出しで表示されれば、バッチ処理（まとめて処理）が機能しています。</p>
<h3><span id="toc20">7-3. DLQテスト（処理失敗 → DLQへの振り分け確認）</span></h3>
<pre><code class="language-cmd">aws sqs send-message ^
  --queue-url %QUEUE_URL% ^
  --message-body "error" ^
  --region ap-northeast-1</code></pre>
<p><strong>処理の流れ：</strong></p>
<ol>
<li>Lambda が <code>error</code> を受信 → 例外発生（処理失敗）</li>
<li>可視性タイムアウト（180秒）後に再度キューに現れる</li>
<li>3回失敗 → DLQ に移動</li>
</ol>
<blockquote>
<p><strong>注意：DLQ に移動するまで最大 180秒 × 3回 ≒ 9分かかります。</strong><br />すぐに確認したい場合は、CloudFormation コンソールでキューの可視性タイムアウトを一時的に短く（例: 10秒）して試すとよいです。</p>
</blockquote>
<p><strong>DLQ にメッセージが届いたか確認（CLI）：</strong></p>
<pre><code class="language-cmd">set DLQ_URL=https://sqs.ap-northeast-1.amazonaws.com/123456789012/sqs-lambda-queue-stack-BatchDLQ-XXXX</code></pre>
<pre><code class="language-cmd">aws sqs receive-message ^
  --queue-url %DLQ_URL% ^
  --region ap-northeast-1</code></pre>
<p>レスポンス例（メッセージが届いていれば表示されます）：</p>
<pre><code class="language-json">{
    "Messages": [
        {
            "MessageId": "...",
            "Body": "error",
            "ReceiptHandle": "...",
            "MD5OfBody": "..."
        }
    ]
}</code></pre>
<p><code>&quot;Body&quot;: &quot;error&quot;</code> のメッセージが表示されれば <strong>DLQ 動作確認完了</strong>です。</p>
<blockquote>
<p><strong><code>receive-message</code> が空を返す場合：</strong><br />DLQ にまだ届いていないか、すでに一度受信済みの状態です（SQSは受信後に可視性タイムアウトが入る）。<br />SQS コンソール → <code>BatchDLQ</code> → 「メッセージをポーリング」でも確認できます。</p>
</blockquote>
<hr>
<h2><span id="toc21">Step 8: AWSコンソールで確認（任意）</span></h2>
<p>デプロイしたリソースをコンソールから目視確認できます。</p>
<ul>
<li><strong>SQS（メインキュー）</strong>: SQS → <code>sqs-lambda-queue-stack-BatchQueue-XXXX</code> → 「メッセージを送受信」で残件数確認</li>
<li><strong>SQS（DLQ）</strong>: SQS → <code>sqs-lambda-queue-stack-BatchDLQ-XXXX</code> → 「メッセージをポーリング」でDLQの中身確認</li>
<li><strong>Lambda</strong>: Lambda → 関数 → <code>sqs-lambda-queue-stack-ProcessFunction-XXXX</code> → 「設定」→「トリガー」でSQSトリガーを確認</li>
<li><strong>CloudWatch Logs</strong>: Lambda → 対象関数 → 「モニタリング」タブ → 「CloudWatch Logs を表示」</li>
</ul>
<p><!-- ![SQS キュー確認画面](images/sqs-queue-console.jpg) --></p>
<hr>
<h2><span id="toc22">Step 9: リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ずリソースを削除してください。</strong></p>
<pre><code class="language-cmd">sam delete --stack-name sqs-lambda-queue-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 sqs-lambda-queue-stack? [y/N]: y
Are you sure you want to delete the folder sqs-lambda-queue-stack in S3? [y/N]: y</code></pre>
<h3><span id="toc23">削除完了の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks --stack-name sqs-lambda-queue-stack --region ap-northeast-1</code></pre>
<pre><code class="language-plaintext">An error occurred (ValidationError): Stack with id sqs-lambda-queue-stack does not exist</code></pre>
<p>このメッセージが表示されれば削除完了です。</p>
<blockquote>
<p><strong>メッセージが残っていた場合：</strong><br /><code>sam delete</code> で SQS キュー内に残っているメッセージも一緒に削除されます。<br />DLQ に残ったメッセージの内容を記録しておきたい場合は、削除前に <code>aws sqs receive-message</code> で確認しておいてください。</p>
</blockquote>
<hr>
<h2><span id="toc24">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>sam build</code> が失敗する</td>
<td><code>src/app.py</code> が存在しない</td>
<td><code>src/</code> フォルダと <code>app.py</code> が正しい場所にあるか確認</td>
</tr>
<tr>
<td><code>sam deploy</code> が <code>Missing --stack-name</code> エラー</td>
<td><code>samconfig.toml</code> がない</td>
<td><code>sqs-lambda-queue/</code> 直下に正しく作成されているか確認</td>
</tr>
<tr>
<td>メッセージ送信後もログが出ない</td>
<td>Lambda がポーリングするまでのタイムラグ</td>
<td>数秒〜十数秒待ってから CloudWatch Logs を確認</td>
</tr>
<tr>
<td>DLQ にメッセージが届かない</td>
<td>可視性タイムアウト（180秒）× 3回 の待機中</td>
<td>最大9分待つ</td>
</tr>
<tr>
<td><code>receive-message</code> が空のレスポンスを返す</td>
<td>DLQ にまだ届いていない、またはすでに受信済み</td>
<td>時間をおいて再試行</td>
</tr>
<tr>
<td>Lambda が 500 エラー</td>
<td>コードの構文エラーなど</td>
<td>CloudWatch Logs でエラー内容を確認</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc25">まとめ</span></h2>
<p>今回のハンズオンで実現したこと：</p>
<table>
<thead>
<tr>
<th>確認項目</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>正常処理</strong></td>
<td>SQSにメッセージを送信 → Lambdaが自動受信・処理・削除</td>
</tr>
<tr>
<td><strong>バッチ処理</strong></td>
<td>複数メッセージをまとめてLambdaに渡す（<code>BatchSize: 5</code>）</td>
</tr>
<tr>
<td><strong>DLQ動作</strong></td>
<td>失敗メッセージが3回再試行後にDLQへ自動移動</td>
</tr>
<tr>
<td><strong>削除</strong></td>
<td><code>sam delete</code> 1コマンドで全リソースをクリーンアップ</td>
</tr>
</tbody>
</table>
<h3><span id="toc26">SAMのメリットを実感できたポイント</span></h3>
<ul>
<li><code>SQSPollerPolicy</code> 1行で IAM 権限の設定が完了（コンソール版では手動でポリシーをアタッチ）</li>
<li><code>!GetAtt BatchDLQ.Arn</code> でARNの手動コピー不要（コンソール版ではDLQ作成後にARNをコピー・貼り付け）</li>
<li><code>sam delete</code> でSQS×2・Lambda・IAMロール・S3を一括削除</li>
</ul>
<h3><span id="toc27">このハンズオンの発展形</span></h3>
<ul>
<li><strong>SNS との組み合わせ</strong> — SQS の前段に SNS を置くと、複数の SQS キューに同時配信（ファンアウト）できる</li>
<li><strong>メッセージフィルタリング</strong> — SQSのメッセージ属性を使って特定のメッセージだけをLambdaに渡す</li>
<li><strong>可視性タイムアウトの動的変更</strong> — 処理に時間がかかる場合はLambdaから <code>ChangeMessageVisibility</code> を呼ぶ</li>
<li><strong>DLQ のアラーム設定</strong> — CloudWatch アラームでDLQにメッセージが届いたらSlack通知</li>
</ul>
<hr>
<h2><span id="toc28">コンソール操作と比較してみる</span></h2>
<p>SAMが裏で何をやっているか、全く同じ構成をAWSコンソールのみで手作業で構築する手順をまとめました。コンソール版では「DLQ作成 → メインキュー作成 → Lambda作成 → IAM権限追加 → トリガー追加」の順で6つのリソース設定が必要です。</p>
<ul>
<li>AWSコンソールだけでSQS + Lambdaキュー処理を構築する手順【SAM版との比較付き】</li>
</ul>
<p><!-- https://caymezon.com/aws-handson-console-sqs-lambda-queue/ --></p>
<hr>
<h2><span id="toc29">関連記事</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-sqs-lambda-queue/">AWSハンズオン - SQS + Lambdaでメッセージキュー処理を実装しよう【SAM版 / Windows対応】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-sqs-lambda-queue/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWSコンソールだけでSQS + Lambdaキュー処理を構築する手順【SAM版との比較付き】</title>
		<link>https://caymezon.com/aws-handson-console-sqs-lambda-queue/</link>
					<comments>https://caymezon.com/aws-handson-console-sqs-lambda-queue/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Mon, 23 Feb 2026 00:59:29 +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[SQS]]></category>
		<category><![CDATA[キュー処理]]></category>
		<category><![CDATA[デッドレターキュー]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[非同期処理]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20198</guid>

					<description><![CDATA[<p>目次 はじめにSAM vs コンソール：どれだけ違うか構築するもの全体の作業順序① DLQ（デッドレターキュー）作成1-1. キューの設定② メインキュー作成2-1. キューの設定2-2. デッドレターキュー（DLQ）の [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-console-sqs-lambda-queue/">AWSコンソールだけでSQS + 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-8" checked><label class="toc-title" for="toc-checkbox-8">目次</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">① DLQ（デッドレターキュー）作成</a><ol><li><a href="#toc6" tabindex="0">1-1. キューの設定</a></li></ol></li><li><a href="#toc7" tabindex="0">② メインキュー作成</a><ol><li><a href="#toc8" tabindex="0">2-1. キューの設定</a></li><li><a href="#toc9" tabindex="0">2-2. デッドレターキュー（DLQ）の設定</a></li></ol></li><li><a href="#toc10" tabindex="0">③ Lambda 関数作成</a><ol><li><a href="#toc11" tabindex="0">3-1. 基本設定</a></li><li><a href="#toc12" tabindex="0">3-2. タイムアウトの設定</a></li><li><a href="#toc13" tabindex="0">3-3. コードの入力</a></li></ol></li><li><a href="#toc14" tabindex="0">④ Lambda 実行ロールに SQS 権限を追加</a></li><li><a href="#toc15" tabindex="0">⑤ SQS トリガーを Lambda に追加</a></li><li><a href="#toc16" tabindex="0">⑥ 動作テスト</a><ol><li><a href="#toc17" tabindex="0">6-1. 正常処理テスト</a></li><li><a href="#toc18" tabindex="0">6-2. DLQテスト（失敗メッセージの振り分け確認）</a></li></ol></li><li><a href="#toc19" tabindex="0">⑦ リソースの削除</a><ol><li><a href="#toc20" tabindex="0">1. Lambda のトリガー（SQSイベントソースマッピング）を削除する</a></li><li><a href="#toc21" tabindex="0">2. Lambda 関数を削除する</a></li><li><a href="#toc22" tabindex="0">3. SQS キューを削除する（メインキューを先に、次にDLQ）</a></li><li><a href="#toc23" tabindex="0">4. IAM ロールを削除する（任意）</a></li><li><a href="#toc24" tabindex="0">5. CloudWatch Logs のロググループを削除する（任意）</a></li></ol></li><li><a href="#toc25" tabindex="0">SAMとの対比まとめ</a></li><li><a href="#toc26" tabindex="0">トラブルシューティング</a></li><li><a href="#toc27" tabindex="0">まとめ</a><ol><li><a href="#toc28" tabindex="0">コンソール操作で確認できたこと</a></li><li><a href="#toc29" tabindex="0">どちらを使うべきか</a></li></ol></li><li><a href="#toc30" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>この記事は、<a href="https://caymezon.com/aws-handson-sqs-lambda-queue/">SAM版ハンズオン記事</a>の比較版です。</p>
<p>SAM版ではコマンド数本でSQS・DLQ・Lambda・IAM権限がまとめてデプロイできましたが、<strong>「SAMが裏で何をやっているのか？」「コンソールで手動操作するとどれだけ手間がかかるのか？」</strong> を実感してもらうために、全く同じ構成をAWSコンソールのみで手作業で構築する手順を解説します。</p>
<p><strong>この記事を読むとわかること：</strong></p>
<ul>
<li>SQS・DLQ・Lambda・IAMを個別に設定する依存関係と順序</li>
<li>SAMが <code>SQSPollerPolicy</code> 1行で解決している IAM 権限設定の実態</li>
<li>DLQをメインキューに紐づける <code>RedrivePolicy</code> 設定の実際の操作</li>
</ul>
<hr>
<h2><span id="toc2">SAM vs コンソール：どれだけ違うか</span></h2>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>SAM（コード）</th>
<th>コンソール（手動）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>操作ステップ数</strong></td>
<td>約5ステップ</td>
<td><strong>6リソース × 複数画面</strong></td>
</tr>
<tr>
<td><strong>ARNのコピー</strong></td>
<td>不要（<code>!GetAtt</code> で自動参照）</td>
<td><strong>DLQ の ARN を手動コピー・貼り付け</strong></td>
</tr>
<tr>
<td><strong>IAM権限設定</strong></td>
<td><code>SQSPollerPolicy</code> 1行</td>
<td><strong>IAMコンソールでポリシーを手動アタッチ</strong></td>
</tr>
<tr>
<td><strong>削除</strong></td>
<td><code>sam delete</code> 1コマンド</td>
<td><strong>5種のリソースを個別に手動削除</strong></td>
</tr>
</tbody>
</table>
<p><strong>コンソール操作で学べることの価値：</strong></p>
<ul>
<li>IAMロールが「どのサービスが何の権限を持っているか」の具体的なイメージが掴める</li>
<li>DLQとメインキューの紐付け（RedrivePolicy）の設定画面を実際に見ることができる</li>
<li>トラブル時に「どのリソースの設定を確認すればよいか」がわかるようになる</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="toc3">構築するもの</span></h2>
<p>SAM版と全く同じ構成・機能のメッセージキュー処理環境を構築します。</p>
<pre><code class="language-plaintext">送信者（コンソール / AWS CLI）
  ↓ メッセージ送信
SQS キュー（BatchQueue）
  ↓ Lambda がポーリング（自動）
Lambda（ProcessFunction / Python 3.12）
  ↓ 処理成功 → メッセージ削除（自動）
  ↓ 処理失敗（3回）→ DLQに移動
SQS デッドレターキュー（BatchDLQ）
  ↓ ログ出力
CloudWatch Logs</code></pre>
<hr>
<h2><span id="toc4">全体の作業順序</span></h2>
<p>コンソールでは<strong>依存する順番通り</strong>に作成する必要があります。</p>
<pre><code class="language-plaintext">① DLQ（BatchDLQ）作成
      ↓（DLQのARNが必要）
② メインキュー（BatchQueue）作成 + DLQを設定
      ↓（キューARNが必要）
③ Lambda 関数（ProcessFunction）作成 + コード入力
      ↓
④ Lambda 実行ロールに SQS 権限を追加
      ↓
⑤ SQS トリガーを Lambda に追加
      ↓
⑥ 動作テスト（正常処理 / DLQ振り分け）
⑦ リソースの削除</code></pre>
<blockquote>
<p><strong>順序が重要な理由：</strong><br />メインキューの作成時に DLQ の ARN が必要です。<br />SAMでは <code>!GetAtt BatchDLQ.Arn</code> で自動解決されますが、コンソールでは DLQ を先に作成してARNをコピーしておく必要があります。</p>
</blockquote>
<hr>
<h2><span id="toc5">① DLQ（デッドレターキュー）作成</span></h2>
<p><strong>AWSコンソール → SQS → 「キューを作成」</strong></p>
<p><!-- ![SQS DLQ 作成画面](images/sqs-dlq-create.jpg) --></p>
<h3><span id="toc6">1-1. キューの設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイプ</td>
<td><strong>スタンダード</strong></td>
</tr>
<tr>
<td>名前</td>
<td><code>BatchDLQ</code></td>
</tr>
</tbody>
</table>
<p>「設定」セクション（メッセージ保持期間のみ変更）：</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>メッセージ保持期間</td>
<td><strong>1 日</strong>（デフォルト4日。学習用なので短くしてよい）</td>
</tr>
<tr>
<td>その他</td>
<td>デフォルトのまま</td>
</tr>
</tbody>
</table>
<p>「キューを作成」をクリックします。</p>
<p><strong>控えておく情報：</strong></p>
<ul>
<li>DLQ の ARN（例: <code>arn:aws:sqs:ap-northeast-1:123456789012:BatchDLQ</code>）</li>
</ul>
<blockquote>
<p><strong>SAMとの差分：</strong> SAMの <code>BatchDLQ: Type: AWS::SQS::Queue</code> の部分をコンソールで手動作成しています。SAMでは <code>!GetAtt BatchDLQ.Arn</code> でARNを自動参照できますが、コンソールではここで控えたARNを次のステップで手動入力します。</p>
</blockquote>
<hr>
<h2><span id="toc7">② メインキュー作成</span></h2>
<p><strong>AWSコンソール → SQS → 「キューを作成」</strong></p>
<h3><span id="toc8">2-1. キューの設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイプ</td>
<td><strong>スタンダード</strong></td>
</tr>
<tr>
<td>名前</td>
<td><code>BatchQueue</code></td>
</tr>
</tbody>
</table>
<p>「設定」セクション（可視性タイムアウトのみ変更）：</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>可視性タイムアウト</td>
<td><strong>180</strong> 秒</td>
</tr>
<tr>
<td>メッセージ保持期間</td>
<td>4 日（デフォルトのまま）</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>可視性タイムアウトについて：</strong><br />Lambda 関数のタイムアウト（30秒）× 6 以上を設定することがAWS推奨です。<br />処理中にタイムアウトが切れると、同じメッセージが再度キューに現れて二重処理が発生します。<br />今回は Lambda タイムアウト 30秒 × 6 = <strong>180秒</strong> に設定します。</p>
<p>SAMでは <code>VisibilityTimeout: 180</code> の1行ですが、コンソールでは手動入力が必要です。</p>
</blockquote>
<h3><span id="toc9">2-2. デッドレターキュー（DLQ）の設定</span></h3>
<p>「デッドレターキュー」セクション：</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>デッドレターキューを有効にする</td>
<td><strong>オン</strong></td>
</tr>
<tr>
<td>デッドレターキューの ARN</td>
<td>① で控えた <code>BatchDLQ</code> の ARN を貼り付ける</td>
</tr>
<tr>
<td>最大受信数（maxReceiveCount）</td>
<td><strong>3</strong></td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>最大受信数（maxReceiveCount）について：</strong><br />同じメッセージが3回処理を試みて全て失敗した場合、DLQに移動します。<br />「1回目の失敗 → 可視性タイムアウト後に再試行 → 2回目の失敗 → 再試行 → 3回目の失敗 → DLQへ」という流れです。<br />SAMでは <code>maxReceiveCount: 3</code> の1行で同じ設定が完了します。</p>
</blockquote>
<p>「キューを作成」をクリックします。</p>
<p><strong>控えておく情報：</strong></p>
<ul>
<li>BatchQueue の URL（例: <code>https://sqs.ap-northeast-1.amazonaws.com/123456789012/BatchQueue</code>）</li>
</ul>
<hr>
<h2><span id="toc10">③ Lambda 関数作成</span></h2>
<p><strong>AWSコンソール → Lambda → 「関数の作成」</strong></p>
<h3><span id="toc11">3-1. 基本設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>作成方法</td>
<td>一から作成</td>
</tr>
<tr>
<td>関数名</td>
<td><code>ProcessFunction</code></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>「関数の作成」をクリックします。</p>
<h3><span id="toc12">3-2. タイムアウトの設定</span></h3>
<p>関数ページ → 「設定」タブ → 「一般設定」→「編集」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイムアウト</td>
<td><strong>30</strong> 秒</td>
</tr>
</tbody>
</table>
<p>「保存」をクリックします。</p>
<h3><span id="toc13">3-3. コードの入力</span></h3>
<p>関数ページ → 「コード」タブ → コードエディタで <code>lambda_function.py</code> を開きます。</p>
<p>既存の内容を<strong>全て</strong>置き換えて以下を貼り付けます。</p>
<pre><code class="language-python">import json
import datetime


def lambda_handler(event, context):
    results = []

    for record in event["Records"]:       # SQSからの各メッセージを順番に処理
        message_id = record["messageId"]
        body = record["body"]

        if body.strip().lower() == "error":
            raise ValueError(f"意図的なエラー: messageId={message_id}, body={body}")

        now = datetime.datetime.now(datetime.timezone.utc)

        result = {
            "messageId": message_id,
            "body": body,
            "processedAt": now.isoformat(),
            "status": "processed",
        }

        print(json.dumps(result, ensure_ascii=False))
        results.append(result)

    print(json.dumps({"processedCount": len(results)}, ensure_ascii=False))
    return {"processedCount": len(results), "results": results}</code></pre>
<p>「Deploy」ボタンをクリックしてコードを保存します。</p>
<hr>
<h2><span id="toc14">④ Lambda 実行ロールに SQS 権限を追加</span></h2>
<p>デフォルトの実行ロールは <strong>CloudWatch Logs への書き込みしか持っていません</strong>。SQSからメッセージを取り出す権限を手動で追加する必要があります。</p>
<p><strong>Lambda → <code>ProcessFunction</code> → 「設定」タブ → 「アクセス権限」→ 実行ロール名のリンクをクリック</strong></p>
<p>（例: <code>ProcessFunction-role-XXXX</code>）→ IAMコンソールのロール画面が開きます。</p>
<p>「許可を追加」→「ポリシーをアタッチ」</p>
<p>検索ボックスに <code>SQS</code> と入力 → <strong><code>AWSLambdaSQSQueueExecutionRole</code></strong> にチェック → 「許可を追加」をクリックします。</p>
<p><!-- ![IAM ポリシーアタッチ画面](images/iam-policy-attach.jpg) --></p>
<blockquote>
<p><strong><code>AWSLambdaSQSQueueExecutionRole</code> に含まれる権限：</strong></p>
<ul>
<li><code>sqs:ReceiveMessage</code> — キューからメッセージを取り出す</li>
<li><code>sqs:DeleteMessage</code> — 処理完了後にメッセージを削除する</li>
<li><code>sqs:GetQueueAttributes</code> — キューの属性情報を取得する</li>
</ul>
</blockquote>
<blockquote>
<p><strong>SAMとの差分：</strong><br />SAMでは <code>SQSPollerPolicy: QueueName: !GetAtt BatchQueue.QueueName</code> の2行で上記3権限が自動付与されます。コンソールでは IAMコンソールへの画面遷移 → ポリシー検索 → アタッチの操作が必要です。</p>
</blockquote>
<hr>
<h2><span id="toc15">⑤ SQS トリガーを Lambda に追加</span></h2>
<p><strong>Lambda → <code>ProcessFunction</code> → 「設定」タブ → 「トリガー」→「トリガーを追加」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>ソース</td>
<td><strong>SQS</strong></td>
</tr>
<tr>
<td>SQS キュー</td>
<td><code>BatchQueue</code>（② で作成したキュー）</td>
</tr>
<tr>
<td>バッチサイズ</td>
<td><strong>5</strong></td>
</tr>
<tr>
<td>バッチウィンドウ</td>
<td><strong>0</strong> 秒（デフォルト）</td>
</tr>
<tr>
<td>トリガーの有効化</td>
<td>オン</td>
</tr>
</tbody>
</table>
<p>「追加」をクリックします。</p>
<p><!-- ![Lambda SQSトリガー設定画面](images/lambda-sqs-trigger.jpg) --></p>
<blockquote>
<p><strong>バッチサイズとバッチウィンドウについて：</strong></p>
<table>
<thead>
<tr>
<th>設定</th>
<th>意味</th>
</tr>
</thead>
<tbody>
<tr>
<td>バッチサイズ=5</td>
<td>キューに溜まったメッセージを最大5件まとめてLambdaに渡す</td>
</tr>
<tr>
<td>バッチウィンドウ=0</td>
<td>メッセージが来たらすぐにLambdaを呼び出す（待機なし）</td>
</tr>
</tbody>
</table>
<p>バッチサイズを大きくするとLambdaの呼び出し回数が減りコスト節約になりますが、1件でも失敗するとバッチ全体が再試行される点に注意してください。</p>
</blockquote>
<blockquote>
<p><strong>SAMとの差分：</strong><br />SAMの <code>Type: SQS</code> / <code>BatchSize: 5</code> の設定がここに対応しています。コンソールではこの「トリガーを追加」画面で手動設定します。</p>
</blockquote>
<hr>
<h2><span id="toc16">⑥ 動作テスト</span></h2>
<h3><span id="toc17">6-1. 正常処理テスト</span></h3>
<p><strong>方法A: コンソールからメッセージ送信</strong></p>
<p>SQS → <code>BatchQueue</code> → 「メッセージを送受信」→「メッセージを送信」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>メッセージ本文</td>
<td><code>こんにちは、SQS！</code></td>
</tr>
</tbody>
</table>
<p>「メッセージを送信」をクリックします。</p>
<p><strong>方法B: AWS CLI でメッセージ送信</strong></p>
<pre><code class="language-cmd">aws sqs send-message ^
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/BatchQueue ^
  --message-body "こんにちは、SQS！" ^
  --region ap-northeast-1</code></pre>
<p><strong>CloudWatch Logs でログを確認（数秒後）：</strong></p>
<p>Lambda → <code>ProcessFunction</code> → 「モニタリング」タブ → 「CloudWatch Logs を表示」</p>
<p><strong>期待するログ出力：</strong></p>
<pre><code class="language-json">{"messageId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "body": "こんにちは、SQS！", "processedAt": "2026-02-22T10:00:00.000000+00:00", "status": "processed"}
{"processedCount": 1}</code></pre>
<p><code>&quot;status&quot;: &quot;processed&quot;</code> が表示されれば正常処理完了です。</p>
<h3><span id="toc18">6-2. DLQテスト（失敗メッセージの振り分け確認）</span></h3>
<p>メッセージ本文を <code>error</code> にして送信すると、Lambda が例外を発生させてDLQに移動します。</p>
<pre><code class="language-cmd">aws sqs send-message ^
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/BatchQueue ^
  --message-body "error" ^
  --region ap-northeast-1</code></pre>
<p><strong>処理の流れ：</strong></p>
<ol>
<li>Lambda が <code>error</code> を受信 → 例外発生（処理失敗）</li>
<li>可視性タイムアウト（180秒）が切れると再度キューに現れる</li>
<li>3回失敗 → <code>BatchDLQ</code> に移動</li>
</ol>
<blockquote>
<p><strong>注意：DLQに移動するまで最大180秒 × 3回 = 最大9分かかります。</strong><br />すぐに確認したい場合は、BatchQueue の可視性タイムアウトを一時的に短く（例: 10秒）して再試行するとよいです。</p>
</blockquote>
<p><strong>DLQにメッセージが届いたか確認：</strong></p>
<p>SQS → <code>BatchDLQ</code> → 「メッセージを送受信」→「メッセージをポーリング」</p>
<p><code>error</code> のメッセージが表示されれば <strong>DLQ動作確認完了</strong>です。</p>
<p><!-- ![DLQ メッセージポーリング確認](images/sqs-dlq-message.jpg) --></p>
<hr>
<h2><span id="toc19">⑦ リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ず削除してください。</strong></p>
<h3><span id="toc20">1. Lambda のトリガー（SQSイベントソースマッピング）を削除する</span></h3>
<p><strong>Lambda → <code>ProcessFunction</code> → 「設定」タブ → 「トリガー」→ SQSトリガーを選択 → 「削除」</strong></p>
<h3><span id="toc21">2. Lambda 関数を削除する</span></h3>
<p><strong>Lambda → 関数 → <code>ProcessFunction</code> を選択 → 「アクション」→「削除」→ 確認テキストを入力 → 「削除」</strong></p>
<h3><span id="toc22">3. SQS キューを削除する（メインキューを先に、次にDLQ）</span></h3>
<p><strong>SQS → <code>BatchQueue</code> を選択 → 「削除」→ キュー名を入力 → 「削除」</strong></p>
<p><strong>SQS → <code>BatchDLQ</code> を選択 → 「削除」→ キュー名を入力 → 「削除」</strong></p>
<h3><span id="toc23">4. IAM ロールを削除する（任意）</span></h3>
<p><strong>IAM → ロール → <code>ProcessFunction-role-XXXX</code> を選択 → 「削除」→ ロール名を入力 → 「削除」</strong></p>
<blockquote>
<p>Lambda を削除しても自動作成された IAM ロールはそのまま残ります。厳密に削除したい場合は IAM コンソールで手動削除します。</p>
</blockquote>
<h3><span id="toc24">5. CloudWatch Logs のロググループを削除する（任意）</span></h3>
<p><strong>CloudWatch → ロググループ → <code>/aws/lambda/ProcessFunction</code> → 「アクション」→「ロググループの削除」</strong></p>
<blockquote>
<p><strong>SAMとの差分：</strong><br />SAMの <code>sam delete</code> はCloudFormationスタックを削除することで、SQS×2・Lambda・IAMロール・S3を一括削除します。コンソールでは上記5手順を個別に実行する必要があります。</p>
</blockquote>
<hr>
<h2><span id="toc25">SAMとの対比まとめ</span></h2>
<table>
<thead>
<tr>
<th>SAMの記述</th>
<th>コンソールでやること</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>BatchDLQ: Type: AWS::SQS::Queue</code></td>
<td>SQS → キューを作成（BatchDLQ）</td>
</tr>
<tr>
<td><code>RedrivePolicy: maxReceiveCount: 3</code></td>
<td>メインキューのDLQ設定で「最大受信数 = 3」を入力</td>
</tr>
<tr>
<td><code>VisibilityTimeout: 180</code></td>
<td>メインキューの設定で可視性タイムアウト = 180秒を入力</td>
</tr>
<tr>
<td><code>SQSPollerPolicy</code>（SAM組み込み）</td>
<td>IAMコンソールで <code>AWSLambdaSQSQueueExecutionRole</code> を手動アタッチ</td>
</tr>
<tr>
<td><code>Type: SQS</code> イベント / <code>BatchSize: 5</code></td>
<td>Lambda → トリガー追加（SQS・バッチサイズ5）</td>
</tr>
<tr>
<td><code>sam delete</code></td>
<td>Lambda・SQS×2・IAMロール・ロগগループを個別に削除</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc26">トラブルシューティング</span></h2>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td>Lambdaが実行されない</td>
<td>実行ロールにSQS権限がない</td>
<td>④ の手順で <code>AWSLambdaSQSQueueExecutionRole</code> をアタッチ</td>
</tr>
<tr>
<td>メッセージがキューに残り続ける</td>
<td>SQSトリガーが設定されていない</td>
<td>⑤ の手順でトリガーを追加する</td>
</tr>
<tr>
<td>DLQにメッセージが届かない</td>
<td>可視性タイムアウトが長すぎて待機中</td>
<td>しばらく待つ（最大180秒 × 3回 ≒ 9分）</td>
</tr>
<tr>
<td>Lambda が 500 エラー</td>
<td>コードの構文エラーなど</td>
<td>CloudWatch Logs でエラー内容を確認</td>
</tr>
<tr>
<td><code>error</code> 送信後すぐにDLQを確認したい</td>
<td>可視性タイムアウトが長い</td>
<td>テスト目的でキューの可視性タイムアウトを10秒に変更する</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc27">まとめ</span></h2>
<h3><span id="toc28">コンソール操作で確認できたこと</span></h3>
<p>コンソール操作を通じて、SAMが裏側で自動処理している内容が明確になりました：</p>
<table>
<thead>
<tr>
<th>SAMの記述</th>
<th>コンソールでやること</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>SQSPollerPolicy</code>（1行）</td>
<td>IAMコンソールでポリシーを手動検索・アタッチ</td>
</tr>
<tr>
<td><code>!GetAtt BatchDLQ.Arn</code>（自動参照）</td>
<td>DLQ作成後にARNをコピー・貼り付け</td>
</tr>
<tr>
<td><code>sam delete</code>（1コマンド）</td>
<td>5種のリソースを個別に手動削除</td>
</tr>
</tbody>
</table>
<h3><span id="toc29">どちらを使うべきか</span></h3>
<table>
<thead>
<tr>
<th>シーン</th>
<th>推奨</th>
</tr>
</thead>
<tbody>
<tr>
<td>本番環境・チーム開発</td>
<td><strong>SAM</strong>（再現性・Git管理・速度）</td>
</tr>
<tr>
<td>AWSを初めて学ぶ</td>
<td><strong>コンソール</strong>（IAMや各サービスの設定の意味を理解する）</td>
</tr>
<tr>
<td>構築済みリソースの確認・デバッグ</td>
<td><strong>コンソール</strong>（目視確認）</td>
</tr>
<tr>
<td>同じ構成を繰り返しデプロイ</td>
<td><strong>SAM</strong>（ミスゼロ・自動化）</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc30">関連記事</span></h2>
<ul>
<li>SAM版ハンズオン — コマンド数本でSQS + Lambda + DLQ環境を構築</li>
</ul>

<a rel="noopener" href="https://caymezon.com/aws-handson-sqs-lambda-queue/" title="AWSハンズオン - SQS + Lambdaでメッセージキュー処理を実装しよう【SAM版 / Windows対応】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://caymezon.com/wp-content/uploads/2026/02/aws-handson-sqs-lambda-queue-featured-25fc3c-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://caymezon.com/wp-content/uploads/2026/02/aws-handson-sqs-lambda-queue-featured-25fc3c-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-sqs-lambda-queue-featured-25fc3c-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-sqs-lambda-queue-featured-25fc3c-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-sqs-lambda-queue-featured-25fc3c-376x212.jpg 376w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">AWSハンズオン - SQS + Lambdaでメッセージキュー処理を実装しよう【SAM版 / Windows対応】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「メッセージキューって何に使うの？」「エラーが起きたメッセージをどうやって管理するの？」という疑問を持っている方向けに、Amazon SQS + Lambda によるメッセージキュー処理をゼロから構築するハンズオンを紹介します。今回...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://caymezon.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">caymezon.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.02.23</div></div></div></div></a>
<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-sqs-lambda-queue/">AWSコンソールだけでSQS + Lambdaキュー処理を構築する手順【SAM版との比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-console-sqs-lambda-queue/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
