<?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>API Gateway - CayTech Lab</title>
	<atom:link href="https://caymezon.com/tag/api-gateway/feed/" rel="self" type="application/rss+xml" />
	<link>https://caymezon.com</link>
	<description></description>
	<lastBuildDate>Fri, 27 Feb 2026 02:27:11 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://caymezon.com/wp-content/uploads/2026/01/cropped-CayTechLab-32x32.jpg</url>
	<title>API Gateway - 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コンソールだけでメモアプリAPIを構築する手順【Lambda＋API Gateway＋DynamoDB / SAMとの比較付き】</title>
		<link>https://caymezon.com/aws-handson-console-lambda-apigateway-dynamodb/</link>
					<comments>https://caymezon.com/aws-handson-console-lambda-apigateway-dynamodb/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Fri, 20 Feb 2026 11:13:34 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[API Gateway]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWSコンソール]]></category>
		<category><![CDATA[DynamoDB]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[SAM比較]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20175</guid>

					<description><![CDATA[<p>目次 はじめにSAM vs コンソール：どれだけ違うか構築するもの全体の作業順序① DynamoDB テーブル作成設定値② IAM ロール作成（Lambda実行用）2-1. 信頼ポリシーの設定2-2. 許可ポリシーのアタ [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-console-lambda-apigateway-dynamodb/">AWSコンソールだけでメモアプリAPIを構築する手順【Lambda＋API Gateway＋DynamoDB / 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-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">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">① DynamoDB テーブル作成</a><ol><li><a href="#toc6" tabindex="0">設定値</a></li></ol></li><li><a href="#toc7" tabindex="0">② IAM ロール作成（Lambda実行用）</a><ol><li><a href="#toc8" tabindex="0">2-1. 信頼ポリシーの設定</a></li><li><a href="#toc9" tabindex="0">2-2. 許可ポリシーのアタッチ（CloudWatch Logs 用）</a></li><li><a href="#toc10" tabindex="0">2-3. ロール名を設定して作成</a></li><li><a href="#toc11" tabindex="0">2-4. DynamoDB CRUD 権限をインラインポリシーで追加</a></li></ol></li><li><a href="#toc12" tabindex="0">③ Lambda 関数作成</a><ol><li><a href="#toc13" tabindex="0">3-1. Lambdaコードをzipファイルに圧縮する（ローカル作業）</a></li><li><a href="#toc14" tabindex="0">3-2. Lambda 関数の作成</a></li><li><a href="#toc15" tabindex="0">3-3. コードのアップロード</a></li><li><a href="#toc16" tabindex="0">3-4. ハンドラーの設定</a></li><li><a href="#toc17" tabindex="0">3-5. 環境変数の設定</a></li><li><a href="#toc18" tabindex="0">3-6. タイムアウトの設定</a></li></ol></li><li><a href="#toc19" tabindex="0">④ API Gateway 作成・設定・デプロイ</a><ol><li><a href="#toc20" tabindex="0">4-1. REST API の作成</a></li><li><a href="#toc21" tabindex="0">4-2. リソース /memos の作成</a></li><li><a href="#toc22" tabindex="0">4-3. POST /memos メソッドの作成</a></li><li><a href="#toc23" tabindex="0">4-4. GET /memos メソッドの作成</a></li><li><a href="#toc24" tabindex="0">4-5. リソース /memos/{id} の作成</a></li><li><a href="#toc25" tabindex="0">4-6. GET /memos/{id} メソッドの作成</a></li><li><a href="#toc26" tabindex="0">4-7. PUT /memos/{id} メソッドの作成</a></li><li><a href="#toc27" tabindex="0">4-8. DELETE /memos/{id} メソッドの作成</a></li><li><a href="#toc28" tabindex="0">4-9. API のデプロイ</a></li></ol></li><li><a href="#toc29" tabindex="0">⑤ Lambda に API Gateway からの実行許可を確認・付与</a></li><li><a href="#toc30" tabindex="0">テスト（CMDでの動作確認）</a><ol><li><a href="#toc31" tabindex="0">POST /memos — メモを作成する</a></li><li><a href="#toc32" tabindex="0">GET /memos — メモ一覧を取得する</a></li><li><a href="#toc33" tabindex="0">GET /memos/{id} — メモ1件を取得する</a></li><li><a href="#toc34" tabindex="0">PUT /memos/{id} — メモを更新する</a></li><li><a href="#toc35" tabindex="0">DELETE /memos/{id} — メモを削除する</a></li></ol></li><li><a href="#toc36" tabindex="0">⑥ リソースの削除（コンソール）</a><ol><li><a href="#toc37" tabindex="0">1. API Gateway を削除する</a></li><li><a href="#toc38" tabindex="0">2. Lambda を削除する</a></li><li><a href="#toc39" tabindex="0">3. IAM ロールを削除する</a></li><li><a href="#toc40" tabindex="0">4. DynamoDB テーブルを削除する</a></li></ol></li><li><a href="#toc41" tabindex="0">まとめ</a><ol><li><a href="#toc42" tabindex="0">今回の手順で確認したこと</a></li><li><a href="#toc43" tabindex="0">コンソール操作で学べたこと</a></li><li><a href="#toc44" tabindex="0">どちらを使うべきか</a></li></ol></li><li><a href="#toc45" tabindex="0">関連記事</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>この記事は、<a href="https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/">SAM版ハンズオン記事</a>の比較版です。</p>
<p>SAM版ではコマンド数本でインフラが完成しましたが、<strong>「その裏で何が起きているのか？」「SAMを使わない場合はどれだけ手間がかかるのか？」</strong> を実感してもらうために、全く同じメモアプリAPIをAWSコンソールのみで手作業で構築する手順を詳細に解説します。</p>
<p><strong>この記事を読むとわかること：</strong></p>
<ul>
<li>AWS各サービス（DynamoDB・IAM・Lambda・API Gateway）を個別に設定する流れ</li>
<li>SAMが裏側で自動処理していること（IAMロール・API Gatewayルーティング・権限付与など）</li>
<li>SAMとコンソール手動操作、それぞれの使いどころ</li>
</ul>
<hr>
<h2><span id="toc2">SAM vs コンソール：どれだけ違うか</span></h2>
<p>まず差分を数字で確認します。</p>
<table>
<thead>
<tr>
<th>比較項目</th>
<th>SAM（コード）</th>
<th>コンソール（手動）</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>操作ステップ数</strong></td>
<td>約5ステップ</td>
<td><strong>約50〜60クリック</strong></td>
</tr>
<tr>
<td><strong>所要時間</strong></td>
<td>5〜10分</td>
<td><strong>30〜60分</strong></td>
</tr>
<tr>
<td><strong>ミスのリスク</strong></td>
<td>低い（テンプレート通り）</td>
<td><strong>高い</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> 1コマンド</td>
<td><strong>4サービスを個別に手動削除</strong></td>
</tr>
<tr>
<td><strong>コード管理</strong></td>
<td>Git で管理可能</td>
<td><strong>管理不可</strong>（画面操作は記録されない）</td>
</tr>
<tr>
<td><strong>環境の複製</strong></td>
<td><code>sam deploy</code> だけ</td>
<td><strong>最初から全手順繰り返し</strong></td>
</tr>
</tbody>
</table>
<p>「それでもコンソール操作を知っておく価値はあるか？」という問いに対して、答えは <strong>Yes</strong> です。</p>
<p><strong>コンソール操作が特に有効な場面：</strong></p>
<ul>
<li><strong>障害調査</strong> — 実際にどのリソースがどう設定されているか目視確認する</li>
<li><strong>SAMのデバッグ</strong> — SAMでデプロイしたリソースをコンソールで確認・修正する</li>
<li><strong>初学習</strong> — 各サービスの設定項目を理解するための最初の一歩</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版と全く同じ構成・機能のAPIを構築します。</p>
<pre><code class="language-plaintext">インターネット
  ↓ HTTPS
API Gateway（Prod ステージ）
  ↓ Lambdaプロキシ統合
Lambda（MemoFunction / Python 3.12）
  ↓ boto3
DynamoDB（memo-api-dynamodb-stack-Memos テーブル）</code></pre>
<table>
<thead>
<tr>
<th>メソッド</th>
<th>パス</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>POST</td>
<td>/memos</td>
<td>メモ作成</td>
</tr>
<tr>
<td>GET</td>
<td>/memos</td>
<td>メモ一覧取得</td>
</tr>
<tr>
<td>GET</td>
<td>/memos/{id}</td>
<td>メモ1件取得</td>
</tr>
<tr>
<td>PUT</td>
<td>/memos/{id}</td>
<td>メモ更新</td>
</tr>
<tr>
<td>DELETE</td>
<td>/memos/{id}</td>
<td>メモ削除</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc4">全体の作業順序</span></h2>
<p>SAMは依存関係を自動解決しますが、コンソールでは<strong>依存する順番通りに</strong>作成する必要があります。</p>
<pre><code class="language-plaintext">① DynamoDB テーブル作成
      ↓（テーブル名が必要）
② IAM ロール作成（Lambda実行用）
      ↓（ロールARNが必要）
③ Lambda 関数作成（zipアップロード・環境変数設定）
      ↓（関数ARNが必要）
④ API Gateway 作成・リソース・メソッド設定・デプロイ
      ↓
⑤ Lambda に API Gateway からの実行許可を確認・付与</code></pre>
<p>この順序を守らないと、設定画面で参照先リソースが見つからずエラーになります。</p>
<hr>
<h2><span id="toc5">① DynamoDB テーブル作成</span></h2>
<p><strong>AWSコンソール → DynamoDB → テーブル → 「テーブルの作成」</strong></p>
<p><!-- ![DynamoDB テーブル作成画面](images/dynamodb-create-table.jpg) --></p>
<h3><span id="toc6">設定値</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>テーブル名</td>
<td><code>memo-api-dynamodb-stack-Memos</code></td>
</tr>
<tr>
<td>パーティションキー</td>
<td><code>memoId</code>（タイプ: 文字列）</td>
</tr>
<tr>
<td>テーブル設定</td>
<td>「設定のカスタマイズ」を選択</td>
</tr>
<tr>
<td>キャパシティーモード</td>
<td><strong>オンデマンド</strong>（PAY_PER_REQUEST）</td>
</tr>
<tr>
<td>その他</td>
<td>デフォルトのまま</td>
</tr>
</tbody>
</table>
<p>「テーブルの作成」ボタンをクリック。作成完了まで数十秒待ちます。</p>
<p><strong>▶ 控えておく情報：</strong></p>
<ul>
<li>テーブル名: <code>memo-api-dynamodb-stack-Memos</code></li>
</ul>
<blockquote>
<p><strong>キャパシティーモードはオンデマンドを選ぶ理由：</strong><br />デフォルトの「プロビジョンド」はあらかじめ読み書き容量を指定して課金されます。学習目的ではアクセスがない時間も課金されてしまうため、アクセスがあった分だけ課金される「オンデマンド」を選択します。SAMの <code>BillingMode: PAY_PER_REQUEST</code> に相当します。</p>
</blockquote>
<hr>
<h2><span id="toc7">② IAM ロール作成（Lambda実行用）</span></h2>
<p><strong>AWSコンソール → IAM → ロール → 「ロールを作成」</strong></p>
<p>SAMでは <code>DynamoDBCrudPolicy</code> を1行書くだけで自動生成されていたIAMロールを、ここでは手動で作成します。</p>
<h3><span id="toc8">2-1. 信頼ポリシーの設定</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>信頼されたエンティティタイプ</td>
<td><strong>AWS のサービス</strong></td>
</tr>
<tr>
<td>ユースケース</td>
<td><strong>Lambda</strong></td>
</tr>
</tbody>
</table>
<p>「次へ」をクリックします。</p>
<h3><span id="toc9">2-2. 許可ポリシーのアタッチ（CloudWatch Logs 用）</span></h3>
<p>検索ボックスに <code>AWSLambdaBasicExecutionRole</code> と入力してチェックを入れます。</p>
<p>→ 「次へ」</p>
<h3><span id="toc10">2-3. ロール名を設定して作成</span></h3>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>ロール名</td>
<td><code>memo-api-lambda-role</code></td>
</tr>
</tbody>
</table>
<p>「ロールを作成」をクリックします。</p>
<h3><span id="toc11">2-4. DynamoDB CRUD 権限をインラインポリシーで追加</span></h3>
<p>作成したロール <code>memo-api-lambda-role</code> を開き → 「許可を追加」→「インラインポリシーを作成」→「JSON」タブ を選択して以下を貼り付けます：</p>
<pre><code class="language-json">{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:DeleteItem",
        "dynamodb:Scan",
        "dynamodb:Query"
      ],
      "Resource": "arn:aws:dynamodb:ap-northeast-1:*:table/memo-api-dynamodb-stack-Memos"
    }
  ]
}</code></pre>
<p>ポリシー名（例: <code>DynamoDBCrudPolicy-Memos</code>）を入力して「ポリシーの作成」をクリックします。</p>
<p><strong>▶ 控えておく情報：</strong></p>
<ul>
<li>ロール ARN（例: <code>arn:aws:iam::123456789012:role/memo-api-lambda-role</code>）</li>
</ul>
<blockquote>
<p><strong>SAMとの差分：</strong> SAMの <code>DynamoDBCrudPolicy</code> は必要な6つのDynamoDBアクションとCloudWatch Logs権限を1行で自動付与します。コンソールでは「管理ポリシーのアタッチ」と「インラインポリシーの作成」の2手順が必要です。</p>
</blockquote>
<hr>
<h2><span id="toc12">③ Lambda 関数作成</span></h2>
<h3><span id="toc13">3-1. Lambdaコードをzipファイルに圧縮する（ローカル作業）</span></h3>
<p><code>src/app.py</code> と <code>src/requirements.txt</code> を zip 圧縮します。</p>
<p><strong>Windowsエクスプローラーでの操作：</strong></p>
<ol>
<li><code>src/</code> フォルダを開く</li>
<li><code>app.py</code> と <code>requirements.txt</code> を両方選択</li>
<li>右クリック → 「ZIPファイルに圧縮」</li>
<li><code>lambda.zip</code> という名前で保存</li>
</ol>
<blockquote>
<p><strong>【注意】フォルダごとではなくファイルを直接zipする</strong></p>
<p><code>src/</code> フォルダ自体を右クリックしてzipすると、中身のパスが <code>src/app.py</code> になります。LambdaはCodeUri直下に <code>app.py</code> があることを期待するため、<strong>フォルダの中身のファイルを選択してからzip</strong>してください。フォルダごと圧縮するとパスが変わって <code>Handler: app.lambda_handler</code> が見つからずエラーになります。</p>
</blockquote>
<p>コードの内容は<a href="https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/#step3">SAM版ハンズオン記事のStep 3</a>を参照してください。</p>
<h3><span id="toc14">3-2. Lambda 関数の作成</span></h3>
<p><strong>AWSコンソール → Lambda → 関数 → 「関数の作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>作成方法</td>
<td>一から作成</td>
</tr>
<tr>
<td>関数名</td>
<td><code>MemoFunction</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>「既存のロールを使用する」→ <code>memo-api-lambda-role</code> を選択</td>
</tr>
</tbody>
</table>
<p>「関数の作成」をクリックします。</p>
<h3><span id="toc15">3-3. コードのアップロード</span></h3>
<p>関数ページ → 「コードソース」セクション → 「アップロード元」→「.zip ファイル」→ <code>lambda.zip</code> を選択 → 「保存」</p>
<h3><span id="toc16">3-4. ハンドラーの設定</span></h3>
<p>「コード」タブ → 画面を下にスクロール → 「ランタイム設定」→「編集」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>ハンドラ</td>
<td><code>app.lambda_handler</code></td>
</tr>
</tbody>
</table>
<p>「保存」をクリックします。</p>
<blockquote>
<p><strong>ハンドラーを変更する理由：</strong><br />Lambda のデフォルトハンドラーは <code>lambda_function.lambda_handler</code>（<code>lambda_function.py</code> を参照）。本ハンズオンのコードは <code>app.py</code> なので、変更しないと <code>No module named &#39;lambda_function&#39;</code> エラーになります。</p>
</blockquote>
<h3><span id="toc17">3-5. 環境変数の設定</span></h3>
<p>「設定」タブ → 「環境変数」→「編集」→「環境変数を追加」</p>
<table>
<thead>
<tr>
<th>キー</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>TABLE_NAME</code></td>
<td><code>memo-api-dynamodb-stack-Memos</code></td>
</tr>
</tbody>
</table>
<p>「保存」をクリックします。</p>
<blockquote>
<p><strong>SAMとの差分：</strong> SAMでは <code>template.yaml</code> の <code>Environment.Variables.TABLE_NAME: !Ref MemosTable</code> が自動でテーブル名を解決して設定します。コンソールでは①で作成したテーブル名を手動でコピーして貼り付ける必要があります。</p>
</blockquote>
<h3><span id="toc18">3-6. タイムアウトの設定</span></h3>
<p>「設定」タブ → 「一般設定」→「編集」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>タイムアウト</td>
<td>0分 <strong>30秒</strong></td>
</tr>
<tr>
<td>メモリ</td>
<td>128 MB</td>
</tr>
</tbody>
</table>
<p>「保存」をクリックします。</p>
<p><strong>▶ 控えておく情報：</strong></p>
<ul>
<li>関数 ARN（例: <code>arn:aws:lambda:ap-northeast-1:123456789012:function:MemoFunction</code>）</li>
</ul>
<hr>
<h2><span id="toc19">④ API Gateway 作成・設定・デプロイ</span></h2>
<p>ここが<strong>最も手順が多い</strong>セクションです。5エンドポイント × 複数設定 = 大量のクリック作業になります。SAMが <code>Events:</code> セクションの数行で自動処理していた部分を全て手動で設定します。</p>
<h3><span id="toc20">4-1. REST API の作成</span></h3>
<p><strong>AWSコンソール → API Gateway → 「APIを作成」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>API タイプ</td>
<td><strong>REST API</strong>（「構築」ボタン）</td>
</tr>
<tr>
<td>API 名</td>
<td><code>MemoApi</code></td>
</tr>
<tr>
<td>エンドポイントタイプ</td>
<td>リージョン</td>
</tr>
</tbody>
</table>
<p>「APIを作成」をクリックします。</p>
<h3><span id="toc21">4-2. リソース /memos の作成</span></h3>
<p>「リソース」→「リソースを作成」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>リソースパス</td>
<td><code>/</code></td>
</tr>
<tr>
<td>リソース名</td>
<td><code>memos</code></td>
</tr>
<tr>
<td>CORS</td>
<td>チェックしない</td>
</tr>
</tbody>
</table>
<p>「リソースを作成」をクリックします。</p>
<h3><span id="toc22">4-3. POST /memos メソッドの作成</span></h3>
<p><code>/memos</code> リソースを選択 →「メソッドを作成」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>メソッドタイプ</td>
<td><strong>POST</strong></td>
</tr>
<tr>
<td>統合タイプ</td>
<td><strong>Lambda 関数</strong></td>
</tr>
<tr>
<td>Lambda プロキシ統合</td>
<td><strong>オン</strong>（重要）</td>
</tr>
<tr>
<td>Lambda 関数</td>
<td><code>MemoFunction</code> を選択</td>
</tr>
</tbody>
</table>
<p>「メソッドを作成」をクリックします。</p>
<blockquote>
<p><strong>「Lambda プロキシ統合」をオンにする理由：</strong><br />オンにすると、HTTPリクエスト全体（メソッド・パス・ボディ・ヘッダー）がそのままLambdaの <code>event</code> に渡されます。オフにすると、マッピングテンプレートを別途設定する必要があり手順が大幅に増えます。SAMはデフォルトでプロキシ統合を使用します。</p>
</blockquote>
<h3><span id="toc23">4-4. GET /memos メソッドの作成</span></h3>
<p><code>/memos</code> リソースを選択 →「メソッドを作成」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>メソッドタイプ</td>
<td><strong>GET</strong></td>
</tr>
<tr>
<td>統合タイプ</td>
<td>Lambda 関数</td>
</tr>
<tr>
<td>Lambda プロキシ統合</td>
<td><strong>オン</strong></td>
</tr>
<tr>
<td>Lambda 関数</td>
<td><code>MemoFunction</code></td>
</tr>
</tbody>
</table>
<p>「メソッドを作成」をクリックします。</p>
<h3><span id="toc24">4-5. リソース /memos/{id} の作成</span></h3>
<p><code>/memos</code> リソースを選択 →「リソースを作成」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>リソース名</td>
<td><code>{id}</code></td>
</tr>
</tbody>
</table>
<p>「リソースを作成」をクリックします。</p>
<blockquote>
<p><strong><code>{id}</code> は波括弧ごと入力する</strong><br /><code>{id}</code> と入力することで API Gateway がパスパラメータとして認識し、Lambda の <code>event[&#39;pathParameters&#39;][&#39;id&#39;]</code> で受け取れるようになります。</p>
</blockquote>
<h3><span id="toc25">4-6. GET /memos/{id} メソッドの作成</span></h3>
<p><code>/memos/{id}</code> リソースを選択 →「メソッドを作成」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>メソッドタイプ</td>
<td><strong>GET</strong></td>
</tr>
<tr>
<td>統合タイプ</td>
<td>Lambda 関数</td>
</tr>
<tr>
<td>Lambda プロキシ統合</td>
<td><strong>オン</strong></td>
</tr>
<tr>
<td>Lambda 関数</td>
<td><code>MemoFunction</code></td>
</tr>
</tbody>
</table>
<p>「メソッドを作成」をクリックします。</p>
<h3><span id="toc26">4-7. PUT /memos/{id} メソッドの作成</span></h3>
<p><code>/memos/{id}</code> リソースを選択 →「メソッドを作成」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>メソッドタイプ</td>
<td><strong>PUT</strong></td>
</tr>
<tr>
<td>統合タイプ</td>
<td>Lambda 関数</td>
</tr>
<tr>
<td>Lambda プロキシ統合</td>
<td><strong>オン</strong></td>
</tr>
<tr>
<td>Lambda 関数</td>
<td><code>MemoFunction</code></td>
</tr>
</tbody>
</table>
<p>「メソッドを作成」をクリックします。</p>
<h3><span id="toc27">4-8. DELETE /memos/{id} メソッドの作成</span></h3>
<p><code>/memos/{id}</code> リソースを選択 →「メソッドを作成」</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>メソッドタイプ</td>
<td><strong>DELETE</strong></td>
</tr>
<tr>
<td>統合タイプ</td>
<td>Lambda 関数</td>
</tr>
<tr>
<td>Lambda プロキシ統合</td>
<td><strong>オン</strong></td>
</tr>
<tr>
<td>Lambda 関数</td>
<td><code>MemoFunction</code></td>
</tr>
</tbody>
</table>
<p>「メソッドを作成」をクリックします。</p>
<h3><span id="toc28">4-9. API のデプロイ</span></h3>
<p>「APIをデプロイ」ボタンをクリックします。</p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>ステージ</td>
<td><strong>新しいステージ</strong></td>
</tr>
<tr>
<td>ステージ名</td>
<td><code>Prod</code></td>
</tr>
</tbody>
</table>
<p>「デプロイ」をクリックします。</p>
<p>ステージ画面の「呼び出し URL」に表示されるURLを控えておきます：</p>
<pre><code class="language-plaintext">https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod</code></pre>
<p><strong>▶ 控えておく情報：</strong></p>
<ul>
<li>呼び出し URL（テストで使います）</li>
</ul>
<hr>
<h2><span id="toc29">⑤ Lambda に API Gateway からの実行許可を確認・付与</span></h2>
<p>API GatewayがLambdaを呼び出す権限を確認します。</p>
<p><strong>Lambda プロキシ統合でメソッドを作成した際に「Lambda関数に権限を追加しますか？」という確認ダイアログが表示されて「OK」をクリックした場合は、この手順は自動で完了しています。</strong></p>
<p>もし <code>403 Forbidden</code> エラーが出た場合は、以下の手順で手動付与します：</p>
<p><strong>Lambda → 対象関数 → 「設定」タブ → 「リソースベースのポリシーステートメント」→「追加」</strong></p>
<table>
<thead>
<tr>
<th>設定項目</th>
<th>値</th>
</tr>
</thead>
<tbody>
<tr>
<td>プリンシパル</td>
<td><code>apigateway.amazonaws.com</code></td>
</tr>
<tr>
<td>ソース ARN</td>
<td><code>arn:aws:execute-api:ap-northeast-1:*:*/Prod/*/*</code></td>
</tr>
<tr>
<td>アクション</td>
<td><code>lambda:InvokeFunction</code></td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc30">テスト（CMDでの動作確認）</span></h2>
<p>テスト手順はSAM版と同じです。コンソールで取得した呼び出し URLを使って実行します。</p>
<pre><code class="language-cmd">set API_URL=https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod</code></pre>
<h3><span id="toc31">POST /memos — メモを作成する</span></h3>
<pre><code class="language-cmd">curl -s -X POST "%API_URL%/memos" -H "Content-Type: application/json" -d "{\"title\":\"初めてのメモ\",\"content\":\"DynamoDBに保存されます\"}"</code></pre>
<p>レスポンス例：</p>
<pre><code class="language-json">{
  "memoId": "6150433b-4834-4cfe-81f5-266d3dad9e57",
  "title": "初めてのメモ",
  "content": "DynamoDBに保存されます",
  "createdAt": "2026-02-20T10:00:00.000000+00:00",
  "updatedAt": "2026-02-20T10:00:00.000000+00:00"
}</code></pre>
<h3><span id="toc32">GET /memos — メモ一覧を取得する</span></h3>
<pre><code class="language-cmd">curl -s "%API_URL%/memos"</code></pre>
<h3><span id="toc33">GET /memos/{id} — メモ1件を取得する</span></h3>
<pre><code class="language-cmd">curl -s "%API_URL%/memos/6150433b-4834-4cfe-81f5-266d3dad9e57"</code></pre>
<h3><span id="toc34">PUT /memos/{id} — メモを更新する</span></h3>
<pre><code class="language-cmd">curl -s -X PUT "%API_URL%/memos/6150433b-4834-4cfe-81f5-266d3dad9e57" -H "Content-Type: application/json" -d "{\"title\":\"更新後タイトル\",\"content\":\"内容も更新しました\"}"</code></pre>
<h3><span id="toc35">DELETE /memos/{id} — メモを削除する</span></h3>
<pre><code class="language-cmd">curl -s -X DELETE "%API_URL%/memos/6150433b-4834-4cfe-81f5-266d3dad9e57"</code></pre>
<blockquote>
<p>CMDでのテストの詳細な注意点（変数未設定によるCloudFront 400エラーなど）は<a href="https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/#step9">SAM版ハンズオン記事のStep 9</a>を参照してください。</p>
</blockquote>
<hr>
<h2><span id="toc36">⑥ リソースの削除（コンソール）</span></h2>
<p><strong>削除する順番が重要です（依存関係の逆順）。</strong> SAMなら <code>sam delete</code> 1コマンドで完了するところを、4サービスを個別に手動削除します。</p>
<h3><span id="toc37">1. API Gateway を削除する</span></h3>
<p><strong>API Gateway → <code>MemoApi</code> を選択 → 「削除」→ 確認テキストを入力 → 「削除」</strong></p>
<h3><span id="toc38">2. Lambda を削除する</span></h3>
<p><strong>Lambda → 関数 → <code>MemoFunction</code> を選択 → 「アクション」→「削除」→ 確認テキストを入力 → 「削除」</strong></p>
<h3><span id="toc39">3. IAM ロールを削除する</span></h3>
<p><strong>IAM → ロール → <code>memo-api-lambda-role</code> を選択 → 「削除」→ ロール名を入力 → 「削除」</strong></p>
<h3><span id="toc40">4. DynamoDB テーブルを削除する</span></h3>
<p><strong>DynamoDB → テーブル → <code>memo-api-dynamodb-stack-Memos</code> → 「削除」→ テーブル名を入力して確認 → 「削除」</strong></p>
<blockquote>
<p><strong>SAMとの差分：</strong> SAMの <code>sam delete</code> は CloudFormation スタックを削除することで、S3・Lambda・API Gateway・DynamoDB・IAMロールを一括で削除します。コンソールでは依存関係の逆順に4サービスを個別に削除する必要があります。</p>
</blockquote>
<hr>
<h2><span id="toc41">まとめ</span></h2>
<h3><span id="toc42">今回の手順で確認したこと</span></h3>
<p>コンソール操作を通じて、SAMが裏側で自動処理している内容が明確になりました：</p>
<table>
<thead>
<tr>
<th>SAMの記述</th>
<th>コンソールでやること</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>BillingMode: PAY_PER_REQUEST</code></td>
<td>DynamoDB作成時に「オンデマンド」を選択</td>
</tr>
<tr>
<td><code>DynamoDBCrudPolicy</code></td>
<td>IAMロール作成 + インラインポリシーのJSON作成</td>
</tr>
<tr>
<td><code>Handler: app.lambda_handler</code></td>
<td>Lambda作成 + zipアップロード + 環境変数設定</td>
</tr>
<tr>
<td><code>Events: Type: Api</code></td>
<td>API Gateway作成 + リソース5個 + メソッド5個 + デプロイ</td>
</tr>
<tr>
<td><code>sam delete</code></td>
<td>4サービスを依存関係の逆順に個別削除</td>
</tr>
</tbody>
</table>
<h3><span id="toc43">コンソール操作で学べたこと</span></h3>
<ul>
<li><strong>IAMロールの構造</strong> — 信頼ポリシー（誰がロールを使えるか）とアクセス許可ポリシー（何ができるか）の2層構造</li>
<li><strong>API Gatewayの仕組み</strong> — リソース（パス）とメソッド（HTTPメソッド）を組み合わせてエンドポイントを定義する</li>
<li><strong>Lambdaプロキシ統合</strong> — リクエスト全体をeventとしてLambdaに渡す仕組み</li>
<li><strong>リソース間の依存関係</strong> — 作成順序・削除順序が決まっている理由</li>
</ul>
<h3><span id="toc44">どちらを使うべきか</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>（各設定の意味を理解する）</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="toc45">関連記事</span></h2>
<ul>
<li>SAM版ハンズオン — VS Codeで全自動デプロイ</li>
</ul>

<a rel="noopener" href="https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/" title="AWS初心者ハンズオン - Lambda＋API Gateway＋DynamoDBでメモアプリAPIを作ろう【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-lambda-apigateway-dynamodb-memo-api-featured-1b1cce-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-lambda-apigateway-dynamodb-memo-api-featured-1b1cce-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-lambda-apigateway-dynamodb-memo-api-featured-1b1cce-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-lambda-apigateway-dynamodb-memo-api-featured-1b1cce-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-lambda-apigateway-dynamodb-memo-api-featured-1b1cce-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初心者ハンズオン - Lambda＋API Gateway＋DynamoDBでメモアプリAPIを作ろう【Windows対応】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめに「AWSのサーバーレスを試してみたい」「Lambda・API Gateway・DynamoDBを組み合わせて何か作ってみたい」と思っていませんか？この記事では、AWS SAM（Serverless Application Model...</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.20</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-lambda-apigateway-dynamodb/">AWSコンソールだけでメモアプリAPIを構築する手順【Lambda＋API Gateway＋DynamoDB / SAMとの比較付き】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-console-lambda-apigateway-dynamodb/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWS初心者ハンズオン - Lambda＋API Gateway＋DynamoDBでメモアプリAPIを作ろう【Windows対応】</title>
		<link>https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/</link>
					<comments>https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/#respond</comments>
		
		<dc:creator><![CDATA[caymezon]]></dc:creator>
		<pubDate>Fri, 20 Feb 2026 10:13:40 +0000</pubDate>
				<category><![CDATA[AWS Basic]]></category>
		<category><![CDATA[Cloud & Infra]]></category>
		<category><![CDATA[API Gateway]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[DynamoDB]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SAM]]></category>
		<category><![CDATA[VSCode]]></category>
		<category><![CDATA[サーバーレス]]></category>
		<category><![CDATA[ハンズオン]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://caymezon.com/?p=20172</guid>

					<description><![CDATA[<p>目次 はじめに前提条件必要なツールAWS認証の確認アーキテクチャと使用サービス使用するAWSサービスAPIエンドポイント設計Step 1: プロジェクトフォルダの作成フォルダ構造作業ディレクトリを開くStep 2: SA [&#8230;]</p>
<p>The post <a href="https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/">AWS初心者ハンズオン - Lambda＋API Gateway＋DynamoDBでメモアプリAPIを作ろう【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-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">前提条件</a><ol><li><a href="#toc3" tabindex="0">必要なツール</a></li><li><a href="#toc4" tabindex="0">AWS認証の確認</a></li></ol></li><li><a href="#toc5" tabindex="0">アーキテクチャと使用サービス</a><ol><li><a href="#toc6" tabindex="0">使用するAWSサービス</a></li><li><a href="#toc7" tabindex="0">APIエンドポイント設計</a></li></ol></li><li><a href="#toc8" tabindex="0">Step 1: プロジェクトフォルダの作成</a><ol><li><a href="#toc9" tabindex="0">フォルダ構造</a></li><li><a href="#toc10" tabindex="0">作業ディレクトリを開く</a></li></ol></li><li><a href="#toc11" tabindex="0">Step 2: SAMテンプレートの作成（template.yaml）</a><ol><li><a href="#toc12" tabindex="0">template.yaml のポイント解説</a></li></ol></li><li><a href="#toc13" tabindex="0">Step 3: Lambda関数の作成（src/app.py）</a></li><li><a href="#toc14" tabindex="0">Step 4: requirements.txtの作成</a></li><li><a href="#toc15" tabindex="0">Step 5: Gitリポジトリの初期化</a></li><li><a href="#toc16" tabindex="0">Step 6: samconfig.tomlの作成</a></li><li><a href="#toc17" tabindex="0">Step 7: sam build（ビルド）</a></li><li><a href="#toc18" tabindex="0">Step 8: sam deploy（デプロイ）</a><ol><li><a href="#toc19" tabindex="0">samconfig.tomlがある場合</a></li><li><a href="#toc20" tabindex="0">初回に対話式で設定する場合（--guided）</a></li><li><a href="#toc21" tabindex="0">デプロイ完了の確認</a></li></ol></li><li><a href="#toc22" tabindex="0">Step 9: 動作テスト</a><ol><li><a href="#toc23" tabindex="0">VSCode上のターミナルの選択肢</a></li><li><a href="#toc24" tabindex="0">CMD でのテスト手順</a></li><li><a href="#toc25" tabindex="0">Git Bash でのテスト手順（参考）</a></li></ol></li><li><a href="#toc26" tabindex="0">Step 10: AWS管理コンソールで確認</a><ol><li><a href="#toc27" tabindex="0">DynamoDB</a></li><li><a href="#toc28" tabindex="0">Lambda</a></li><li><a href="#toc29" tabindex="0">CloudWatch Logs（エラー確認）</a></li></ol></li><li><a href="#toc30" tabindex="0">Step 11: リソースの削除</a><ol><li><a href="#toc31" tabindex="0">削除完了の確認</a></li></ol></li><li><a href="#toc32" tabindex="0">トラブルシューティング一覧</a></li><li><a href="#toc33" tabindex="0">まとめ</a></li><li><a href="#toc34" tabindex="0">SAMがやってくれていたことをコンソールで確認する</a></li><li><a href="#toc35" tabindex="0">次のステップ</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">はじめに</span></h2>
<p>「AWSのサーバーレスを試してみたい」「Lambda・API Gateway・DynamoDBを組み合わせて何か作ってみたい」と思っていませんか？</p>
<p>この記事では、<strong>AWS SAM（Serverless Application Model）</strong> を使って、<strong>メモの作成・取得・更新・削除ができるREST API</strong>をゼロから構築するハンズオンを紹介します。</p>
<p><strong>このハンズオンで実際に作るもの：</strong></p>
<pre><code class="language-plaintext">インターネット
  ↓ HTTPS
API Gateway（Prod ステージ）
  ↓ プロキシ統合
Lambda（Python 3.12）
  ↓ boto3
DynamoDB（メモデータを保存）</code></pre>
<p><strong>この記事の特徴：</strong></p>
<ul>
<li>Macユーザー向けの記事が多い中、<strong>Windows（VSCode）での実際の操作手順</strong>を詳細に解説</li>
<li>実際にハマった <strong>Windowsならではのエラーと対処法</strong> を丁寧に紹介</li>
<li>VSCode上でCMD・PowerShell・Git Bashを使い分ける際の注意点も解説</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="toc2">前提条件</span></h2>
<p>以下のツールがインストール・設定済みであることを確認してください。</p>
<h3><span id="toc3">必要なツール</span></h3>
<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="toc4">AWS認証の確認</span></h3>
<pre><code class="language-cmd">aws sts get-caller-identity</code></pre>
<p>上記コマンドでアカウントIDが表示されれば認証設定済みです。表示されない場合は <code>aws configure</code> で認証情報を設定してください。</p>
<hr>
<h2><span id="toc5">アーキテクチャと使用サービス</span></h2>
<h3><span id="toc6">使用するAWSサービス</span></h3>
<table>
<thead>
<tr>
<th>サービス</th>
<th>役割</th>
<th>料金</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>API Gateway</strong></td>
<td>HTTPリクエストの受付・ルーティング</td>
<td>100万リクエスト/$3.50</td>
</tr>
<tr>
<td><strong>Lambda</strong></td>
<td>ビジネスロジックの実行（Python）</td>
<td>100万リクエスト無料枠あり</td>
</tr>
<tr>
<td><strong>DynamoDB</strong></td>
<td>メモデータの永続化（NoSQL）</td>
<td>PAY_PER_REQUESTで使った分だけ</td>
</tr>
<tr>
<td><strong>S3</strong></td>
<td>SAMのデプロイパッケージ置き場</td>
<td>自動作成・少量なのでほぼ無料</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>学習目的の短時間ハンズオンであれば、ほぼ無料枠内で収まります。</strong><br />ただし、ハンズオン完了後は必ずリソースを削除してください。</p>
</blockquote>
<h3><span id="toc7">APIエンドポイント設計</span></h3>
<table>
<thead>
<tr>
<th>メソッド</th>
<th>パス</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>POST</td>
<td>/memos</td>
<td>メモ作成</td>
</tr>
<tr>
<td>GET</td>
<td>/memos</td>
<td>メモ一覧取得</td>
</tr>
<tr>
<td>GET</td>
<td>/memos/{id}</td>
<td>メモ1件取得</td>
</tr>
<tr>
<td>PUT</td>
<td>/memos/{id}</td>
<td>メモ更新</td>
</tr>
<tr>
<td>DELETE</td>
<td>/memos/{id}</td>
<td>メモ削除</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc8">Step 1: プロジェクトフォルダの作成</span></h2>
<h3><span id="toc9">フォルダ構造</span></h3>
<pre><code class="language-plaintext">memo-api-dynamodb/
├── template.yaml       # SAMテンプレート（インフラ定義）
├── samconfig.toml      # デプロイ設定（gitignore対象・手動作成が必要）
├── README.md
└── src/
    ├── app.py          # Lambda関数（CRUD処理）
    └── requirements.txt</code></pre>
<h3><span id="toc10">作業ディレクトリを開く</span></h3>
<p>VSCodeでターミナルを開き、プロジェクトを管理したいディレクトリに移動します。</p>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects
mkdir memo-api-dynamodb
cd memo-api-dynamodb
mkdir src</code></pre>
<hr>
<h2><span id="toc11">Step 2: SAMテンプレートの作成（template.yaml）</span></h2>
<p><code>memo-api-dynamodb/template.yaml</code> を作成します。このファイルがAWSリソース全体の設計図です。</p>
<pre><code class="language-yaml">AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Memo API with Lambda, API Gateway, and DynamoDB

Globals:
  Function:
    Runtime: python3.12
    Timeout: 30
    MemorySize: 128
    Environment:
      Variables:
        # Lambda関数からDynamoDBテーブル名を参照するための環境変数
        TABLE_NAME: !Ref MemosTable

Resources:

  # DynamoDB テーブル
  MemosTable:
    Type: AWS::DynamoDB::Table
    Properties:
      # スタック名をテーブル名に含めることで、複数環境でも名前が衝突しない
      TableName: !Sub "${AWS::StackName}-Memos"
      # PAY_PER_REQUEST: アクセスがない時間は課金ゼロ（学習・開発に最適）
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: memoId
          AttributeType: S   # S = String
      KeySchema:
        - AttributeName: memoId
          KeyType: HASH      # パーティションキー（一意のID）

  # Lambda 関数（全エンドポイントを1つの関数で処理）
  MemoFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src/
      Handler: app.lambda_handler
      Description: CRUD handler for Memo API
      Policies:
        # DynamoDBCrudPolicy: SAM組み込みのポリシーテンプレート
        # GetItem / PutItem / UpdateItem / DeleteItem / Scan / Query が自動付与される
        - DynamoDBCrudPolicy:
            TableName: !Ref MemosTable
      Events:
        # POST /memos - メモ作成
        CreateMemo:
          Type: Api
          Properties:
            Path: /memos
            Method: post
        # GET /memos - メモ一覧取得
        ListMemos:
          Type: Api
          Properties:
            Path: /memos
            Method: get
        # GET /memos/{id} - メモ1件取得
        GetMemo:
          Type: Api
          Properties:
            Path: /memos/{id}
            Method: get
        # PUT /memos/{id} - メモ更新
        UpdateMemo:
          Type: Api
          Properties:
            Path: /memos/{id}
            Method: put
        # DELETE /memos/{id} - メモ削除
        DeleteMemo:
          Type: Api
          Properties:
            Path: /memos/{id}
            Method: delete

# Outputs: デプロイ後に表示される情報
Outputs:
  MemoApiUrl:
    Description: "Memo API エンドポイント URL"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod"
  MemoFunctionArn:
    Description: "Lambda 関数 ARN"
    Value: !GetAtt MemoFunction.Arn
  DynamoDBTableName:
    Description: "DynamoDB テーブル名"
    Value: !Ref MemosTable</code></pre>
<h3><span id="toc12">template.yaml のポイント解説</span></h3>
<p><strong><code>Transform: AWS::Serverless-2016-10-31</code></strong><br />CloudFormationをSAM用に拡張する宣言。これがないと <code>AWS::Serverless::Function</code> などのSAMリソースが使えません。</p>
<p><strong><code>BillingMode: PAY_PER_REQUEST</code></strong><br />DynamoDBの課金モード。リクエストがない時間は課金ゼロなので、学習・開発用途に最適です。</p>
<p><strong><code>DynamoDBCrudPolicy</code></strong><br />SAMが提供する組み込みポリシーテンプレート。自分でIAMポリシーをゼロから書く必要がなく、必要最小限の権限（CRUD操作のみ）が自動付与されます。</p>
<hr>
<h2><span id="toc13">Step 3: Lambda関数の作成（src/app.py）</span></h2>
<p><code>memo-api-dynamodb/src/app.py</code> を作成します。</p>
<pre><code class="language-python">"""
メモアプリ API - Lambda 関数
Lambda + API Gateway + DynamoDB による CRUD API の実装
"""
import json
import os
import uuid
from datetime import datetime, timezone

import boto3

# DynamoDB クライアント初期化
# テーブル名は環境変数 TABLE_NAME から取得（template.yaml で設定）
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ['TABLE_NAME'])


# -------------------------------------------------------
# ヘルパー関数
# -------------------------------------------------------

def success(body, status_code=200):
    """成功レスポンスを生成する共通関数"""
    return {
        'statusCode': status_code,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*',  # CORS対応
        },
        'body': json.dumps(body, ensure_ascii=False),
    }


def error(message, status_code=400):
    """エラーレスポンスを生成する共通関数"""
    return {
        'statusCode': status_code,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*',
        },
        'body': json.dumps({'error': message}, ensure_ascii=False),
    }


def now_iso():
    """現在時刻を ISO 8601 形式（UTC）で返す"""
    return datetime.now(timezone.utc).isoformat()


# -------------------------------------------------------
# CRUD 処理
# -------------------------------------------------------

def create_memo(body):
    """POST /memos - メモを新規作成する"""
    if not body:
        return error('リクエストボディが空です', 400)

    data = json.loads(body)
    title = data.get('title', '').strip()
    content = data.get('content', '').strip()

    if not title:
        return error('title は必須です', 400)

    memo_id = str(uuid.uuid4())  # UUID でユニークなIDを自動生成
    timestamp = now_iso()

    item = {
        'memoId': memo_id,
        'title': title,
        'content': content,
        'createdAt': timestamp,
        'updatedAt': timestamp,
    }
    table.put_item(Item=item)

    return success(item, 201)


def list_memos():
    """GET /memos - メモ一覧を取得する"""
    result = table.scan()  # テーブル全件取得
    items = result.get('Items', [])

    # createdAt の降順（新しい順）でソート
    items.sort(key=lambda x: x.get('createdAt', ''), reverse=True)

    return success({'memos': items, 'count': len(items)})


def get_memo(memo_id):
    """GET /memos/{id} - 指定IDのメモを1件取得する"""
    result = table.get_item(Key={'memoId': memo_id})
    item = result.get('Item')

    if not item:
        return error(f'memoId={memo_id} のメモが見つかりません', 404)

    return success(item)


def update_memo(memo_id, body):
    """PUT /memos/{id} - 指定IDのメモを更新する"""
    if not body:
        return error('リクエストボディが空です', 400)

    # 更新前に存在確認
    check = table.get_item(Key={'memoId': memo_id})
    if not check.get('Item'):
        return error(f'memoId={memo_id} のメモが見つかりません', 404)

    data = json.loads(body)
    title = data.get('title', '').strip()
    content = data.get('content', '').strip()

    if not title:
        return error('title は必須です', 400)

    timestamp = now_iso()

    result = table.update_item(
        Key={'memoId': memo_id},
        UpdateExpression='SET title = :title, content = :content, updatedAt = :updatedAt',
        ExpressionAttributeValues={
            ':title': title,
            ':content': content,
            ':updatedAt': timestamp,
        },
        ReturnValues='ALL_NEW',  # 更新後の全属性を返す
    )

    return success(result['Attributes'])


def delete_memo(memo_id):
    """DELETE /memos/{id} - 指定IDのメモを削除する"""
    # 削除前に存在確認
    check = table.get_item(Key={'memoId': memo_id})
    if not check.get('Item'):
        return error(f'memoId={memo_id} のメモが見つかりません', 404)

    table.delete_item(Key={'memoId': memo_id})

    return success({'message': f'memoId={memo_id} を削除しました'})


# -------------------------------------------------------
# エントリーポイント（ルーター）
# -------------------------------------------------------

def lambda_handler(event, context):
    """
    API Gateway からのリクエストを受け取り、
    HTTPメソッドとパスに応じて適切な関数に振り分ける
    """
    http_method = event.get('httpMethod', '')
    path = event.get('path', '')
    path_parameters = event.get('pathParameters') or {}
    body = event.get('body')

    try:
        if http_method == 'POST' and path == '/memos':          # POST /memos - メモ作成
            return create_memo(body)

        elif http_method == 'GET' and path == '/memos':         # GET /memos - メモ一覧取得
            return list_memos()

        elif http_method == 'GET' and 'id' in path_parameters:  # GET /memos/{id} - メモ1件取得
            return get_memo(path_parameters['id'])

        elif http_method == 'PUT' and 'id' in path_parameters:  # PUT /memos/{id} - メモ更新
            return update_memo(path_parameters['id'], body)

        elif http_method == 'DELETE' and 'id' in path_parameters:  # DELETE /memos/{id} - メモ削除
            return delete_memo(path_parameters['id'])

        else:
            return error('エンドポイントが存在しません', 404)

    except json.JSONDecodeError:
        return error('リクエストボディのJSONが不正です', 400)
    except Exception as e:
        print(f'Unexpected error: {e}')  # CloudWatch Logs に記録
        return error('サーバー内部エラーが発生しました', 500)</code></pre>
<hr>
<h2><span id="toc14">Step 4: requirements.txtの作成</span></h2>
<p><code>memo-api-dynamodb/src/requirements.txt</code> を作成します。</p>
<pre><code class="language-plaintext"># boto3 is included in the Lambda runtime, no need to list it here.
# Add external libraries here if needed.
# Example: requests==2.31.0</code></pre>
<blockquote>
<p><strong>【Windows注意点】<code>requirements.txt</code> に日本語コメントを書いてはいけない</strong></p>
<p><code>requirements.txt</code> に日本語コメントを書くと、<code>sam build</code> で以下のエラーが発生します：</p>
<pre><code class="language-plaintext">Build Failed
Error: PythonPipBuilder:ResolveDependencies - 'cp932' codec can't decode byte 0x84 in position 43: illegal multibyte sequence</code></pre>
<p><strong>原因：</strong> Windows の SAM CLI（PythonPipBuilder）は <code>requirements.txt</code> を <code>cp932</code>（Shift-JIS）で読み込もうとします。UTF-8で書かれた日本語文字をcp932として解釈しようとするとエラーになります。</p>
<p><strong>対処：</strong> <code>requirements.txt</code> のコメントは必ず英語で書きましょう。<code>template.yaml</code> のコメントはSAMがpipに直接渡さないため日本語でも問題ありません。</p>
</blockquote>
<hr>
<h2><span id="toc15">Step 5: Gitリポジトリの初期化</span></h2>
<pre><code class="language-cmd">cd C:\my-aws\aws-learning-projects\memo-api-dynamodb
git init</code></pre>
<p><code>.gitignore</code> を作成します：</p>
<pre><code class="language-plaintext"># SAM関連（デプロイ設定・ビルド成果物）
samconfig.toml
.aws-sam/

# Python
__pycache__/
*.pyc
.venv/

# テスト用の一時ファイル
test_*.json</code></pre>
<blockquote>
<p><strong><code>samconfig.toml</code> はGit管理外にする理由：</strong> リージョン名やスタック名など環境固有の設定が含まれるためです。チームで開発する場合も、各自が自分の環境に合わせて作成します。</p>
</blockquote>
<p>初期コミット：</p>
<pre><code class="language-cmd">git add template.yaml src/app.py src/requirements.txt .gitignore README.md
git commit -m "memo-api-dynamodb: プロジェクトフォルダと基本ファイルを作成"</code></pre>
<hr>
<h2><span id="toc16">Step 6: samconfig.tomlの作成</span></h2>
<p><code>samconfig.toml</code> は <code>.gitignore</code> で管理外になっているため、手動で作成します。<code>memo-api-dynamodb/samconfig.toml</code> を新規作成し、以下を貼り付けてください：</p>
<pre><code class="language-toml">version = 0.1

[default.deploy.parameters]
stack_name = "memo-api-dynamodb-stack"
resolve_s3 = true
s3_prefix = "memo-api-dynamodb-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>samconfig.toml</code> は <strong><code>memo-api-dynamodb/</code> フォルダの直下</strong> に置く必要があります。<br />別のフォルダに置いてしまうと、<code>sam deploy</code> で以下のエラーが発生します：</p>
<pre><code class="language-plaintext">Error: Missing option '--stack-name', 'sam deploy --guided' can be used to provide and save needed parameters for future deploys.</code></pre>
</blockquote>
<hr>
<h2><span id="toc17">Step 7: sam build（ビルド）</span></h2>
<pre><code class="language-cmd">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

Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {stack-name} --watch
[*] Deploy: sam deploy --guided</code></pre>
<hr>
<h2><span id="toc18">Step 8: sam deploy（デプロイ）</span></h2>
<h3><span id="toc19">samconfig.tomlがある場合</span></h3>
<pre><code class="language-cmd">sam deploy</code></pre>
<h3><span id="toc20">初回に対話式で設定する場合（--guided）</span></h3>
<p><code>samconfig.toml</code> を作成していない場合は <code>--guided</code> オプションで対話式に設定できます。自動的に <code>samconfig.toml</code> が生成されます：</p>
<pre><code class="language-cmd">sam deploy --guided</code></pre>
<p>以下のように順番に聞かれます：</p>
<pre><code class="language-plaintext">Stack Name [sam-app]: memo-api-dynamodb-stack   ← これを入力
AWS Region [ap-northeast-1]: Enter（そのままEnter）
Confirm changes before deploy [Y/n]: Y（そのままEnter）
Allow SAM CLI IAM role creation [Y/n]: Y（そのままEnter）
Disable rollback [y/N]: y    ← yを入力
Save arguments to configuration file [Y/n]: Y（そのままEnter）
SAM configuration file [samconfig.toml]: Enter（そのままEnter）
SAM configuration environment [default]: Enter（そのままEnter）</code></pre>
<p>最後に変更内容が表示されて <code>Deploy this changeset?</code> と聞かれるので <code>y</code> を入力します。</p>
<h3><span id="toc21">デプロイ完了の確認</span></h3>
<p>デプロイが完了すると、ターミナルに <strong>Outputs</strong> が表示されます：</p>
<pre><code class="language-plaintext">CloudFormation outputs from deployed stack
---------------------------------------------------------------------------------------------------------------
Outputs
---------------------------------------------------------------------------------------------------------------
Key                 MemoApiUrl
Description         Memo API エンドポイント URL
Value               https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod
---------------------------------------------------------------------------------------------------------------</code></pre>
<p><strong>この URL を控えておいてください。</strong> テストで使います。</p>
<hr>
<h2><span id="toc22">Step 9: 動作テスト</span></h2>
<p>デプロイで取得したURLを使ってAPIをテストします。</p>
<h3><span id="toc23">VSCode上のターミナルの選択肢</span></h3>
<p>VSCodeでは複数のターミナルが使えますが、コマンドの書き方が異なります：</p>
<table>
<thead>
<tr>
<th>ターミナル</th>
<th>変数定義</th>
<th>変数参照</th>
<th>curl</th>
<th>特徴</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>CMD</strong></td>
<td><code>set VAR=値</code></td>
<td><code>%VAR%</code></td>
<td><code>curl</code></td>
<td>Windowsデフォルト</td>
</tr>
<tr>
<td><strong>PowerShell</strong></td>
<td><code>$VAR = &quot;値&quot;</code></td>
<td><code>$VAR</code></td>
<td><code>curl.exe</code></td>
<td>PowerShell組み込みcurlと区別が必要</td>
</tr>
<tr>
<td><strong>Git Bash</strong></td>
<td><code>VAR=&quot;値&quot;</code></td>
<td><code>${VAR}</code></td>
<td><code>curl</code></td>
<td>bash構文が使える</td>
</tr>
</tbody>
</table>
<hr>
<h3><span id="toc24">CMD でのテスト手順</span></h3>
<p>まずAPI URLを変数にセットします：</p>
<pre><code class="language-cmd">set API_URL=https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod</code></pre>
<h4>POST /memos — メモを作成する</h4>
<pre><code class="language-cmd">curl -s -X POST "%API_URL%/memos" -H "Content-Type: application/json" -d "{\"title\":\"初めてのメモ\",\"content\":\"DynamoDBに保存されます\"}"</code></pre>
<p>レスポンス例：</p>
<pre><code class="language-json">{
  "memoId": "6150433b-4834-4cfe-81f5-266d3dad9e57",
  "title": "初めてのメモ",
  "content": "DynamoDBに保存されます",
  "createdAt": "2026-02-20T10:00:00.000000+00:00",
  "updatedAt": "2026-02-20T10:00:00.000000+00:00"
}</code></pre>
<p><strong>返ってきた <code>memoId</code> を控えておいてください。</strong> 以降のコマンドで使います。</p>
<h4>GET /memos — メモ一覧を取得する</h4>
<pre><code class="language-cmd">curl -s "%API_URL%/memos"</code></pre>
<h4>GET /memos/{id} — メモ1件を取得する</h4>
<pre><code class="language-cmd">curl -s "%API_URL%/memos/6150433b-4834-4cfe-81f5-266d3dad9e57"</code></pre>
<h4>PUT /memos/{id} — メモを更新する</h4>
<pre><code class="language-cmd">curl -s -X PUT "%API_URL%/memos/6150433b-4834-4cfe-81f5-266d3dad9e57" -H "Content-Type: application/json" -d "{\"title\":\"更新後タイトル\",\"content\":\"内容も更新しました\"}"</code></pre>
<blockquote>
<p><strong>【Windows CMD 注意点】PUT/DELETEでのURL変数エラー</strong></p>
<p>以下のように <code>%MEMO_ID%</code> を使って変数でIDを指定しようとするとエラーが発生することがあります：</p>
<pre><code class="language-cmd">set MEMO_ID=6150433b-4834-4cfe-81f5-266d3dad9e57
curl -s -X PUT "%API_URL%/memos/%MEMO_ID%" ...</code></pre>
<pre><code class="language-plaintext">400 ERROR - Bad request (Generated by cloudfront)</code></pre>
<p><strong>原因：</strong> CMDでは変数を <code>set</code> してもターミナルセッションを閉じると消えます。新しいターミナルを開いて <code>%MEMO_ID%</code> を使うと変数が未設定のまま <code>%MEMO_ID%</code> という文字列がURLに含まれてしまいます。CloudFrontは <code>%</code> をパーセントエンコーディングの開始として解釈するため、不正なURLとして400エラーを返します。</p>
<p><strong>対処：</strong> UUIDを直接URLに貼り付けて実行してください。</p>
</blockquote>
<h4>DELETE /memos/{id} — メモを削除する</h4>
<pre><code class="language-cmd">curl -s -X DELETE "%API_URL%/memos/6150433b-4834-4cfe-81f5-266d3dad9e57"</code></pre>
<h4>エラー確認（404テスト）</h4>
<p>削除済みのIDで取得を試みて404が返ることを確認：</p>
<pre><code class="language-cmd">curl -s "%API_URL%/memos/6150433b-4834-4cfe-81f5-266d3dad9e57"</code></pre>
<pre><code class="language-json">{"error": "memoId=6150433b-4834-4cfe-81f5-266d3dad9e57 のメモが見つかりません"}</code></pre>
<hr>
<h3><span id="toc25">Git Bash でのテスト手順（参考）</span></h3>
<p>bash構文が使えるので、より読みやすく書けます：</p>
<pre><code class="language-bash">API_URL="https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod"
MEMO_ID="6150433b-4834-4cfe-81f5-266d3dad9e57"

# POST
curl -s -X POST "${API_URL}/memos" \
  -H "Content-Type: application/json" \
  -d '{"title":"初めてのメモ","content":"テスト"}'

# GET一覧
curl -s "${API_URL}/memos"

# PUT
curl -s -X PUT "${API_URL}/memos/${MEMO_ID}" \
  -H "Content-Type: application/json" \
  -d '{"title":"更新後タイトル","content":"内容も更新"}'

# DELETE
curl -s -X DELETE "${API_URL}/memos/${MEMO_ID}"</code></pre>
<blockquote>
<p><strong>VSCodeでGit Bashターミナルを使う方法：</strong><br />ターミナルパネルの右上にある <code>+</code> ボタンの横の <code>∨</code> をクリック → <strong>Git Bash</strong> を選択</p>
</blockquote>
<hr>
<h2><span id="toc26">Step 10: AWS管理コンソールで確認</span></h2>
<p>テスト後、AWSマネジメントコンソールからも各サービスの状態を確認できます。</p>
<p><!-- ![AWS管理コンソール DynamoDB確認](images/dynamodb-console.jpg) --></p>
<h3><span id="toc27">DynamoDB</span></h3>
<p><strong>DynamoDB → テーブル → <code>memo-api-dynamodb-stack-Memos</code> → 「テーブルアイテムの探索」</strong></p>
<p>作成したメモのデータが保存されていることを確認できます。</p>
<h3><span id="toc28">Lambda</span></h3>
<p><strong>Lambda → 関数 → <code>memo-api-dynamodb-stack-MemoFunction-XXXX</code></strong></p>
<p>関数の設定・環境変数・モニタリングが確認できます。</p>
<h3><span id="toc29">CloudWatch Logs（エラー確認）</span></h3>
<p><strong>Lambda → 対象関数 → 「モニタリング」タブ → 「CloudWatch Logs を表示」</strong></p>
<p>エラーが発生した場合はここでログを確認します。<code>print()</code> で出力した内容もここに記録されます。</p>
<hr>
<h2><span id="toc30">Step 11: リソースの削除</span></h2>
<p><strong>課金を止めるために、ハンズオン完了後は必ずリソースを削除してください。</strong></p>
<pre><code class="language-cmd">sam delete --stack-name memo-api-dynamodb-stack --region ap-northeast-1</code></pre>
<p>対話式で確認が入ります：</p>
<pre><code class="language-plaintext">        Are you sure you want to delete the stack memo-api-dynamodb-stack in the region ap-northeast-1 ? [y/N]: y
        Are you sure you want to delete the folder memo-api-dynamodb-stack in S3 which contains the artifacts? [y/N]: y</code></pre>
<p>両方 <code>y</code> で進めると数分で削除が完了します。</p>
<h3><span id="toc31">削除完了の確認</span></h3>
<pre><code class="language-cmd">aws cloudformation describe-stacks --stack-name memo-api-dynamodb-stack --region ap-northeast-1</code></pre>
<pre><code class="language-plaintext">An error occurred (ValidationError) when calling the DescribeStacks operation: Stack with id memo-api-dynamodb-stack does not exist</code></pre>
<p>このメッセージが表示されれば削除完了です。</p>
<blockquote>
<p><strong>注意：</strong> DynamoDB テーブル内のデータも同時に削除されます。必要なデータは事前にエクスポートしてください。</p>
</blockquote>
<hr>
<h2><span id="toc32">トラブルシューティング一覧</span></h2>
<p>実際のハンズオン中に遭遇したエラーと対処法をまとめました。</p>
<table>
<thead>
<tr>
<th>症状</th>
<th>原因</th>
<th>対処</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>sam build</code> が <code>&#39;cp932&#39; codec can&#39;t decode...</code> エラー</td>
<td><code>requirements.txt</code> に日本語コメントが含まれている</td>
<td>コメントを英語にする</td>
</tr>
<tr>
<td><code>sam deploy</code> が <code>Missing option &#39;--stack-name&#39;</code> エラー</td>
<td><code>samconfig.toml</code> がない、または置き場所が違う</td>
<td><code>memo-api-dynamodb/</code> 直下に作成する</td>
</tr>
<tr>
<td>PUT/DELETE で CloudFront 400 Bad Request</td>
<td>URL に <code>%MEMO_ID%</code> が未展開のまま含まれている</td>
<td>UUIDを直接URLに貼り付ける</td>
</tr>
<tr>
<td>CMD で <code>&#39;API_URL&#39; は認識されていません</code></td>
<td>bash構文（<code>API_URL=&quot;...&quot;</code> ）をCMDで実行した</td>
<td>CMDでは <code>set API_URL=...</code> 形式を使う</td>
</tr>
<tr>
<td>PowerShell で <code>curl</code> がエラー</td>
<td>PowerShell組み込みの <code>Invoke-WebRequest</code> が呼ばれている</td>
<td><code>curl.exe</code> と明示的に <code>.exe</code> を付ける</td>
</tr>
<tr>
<td>API が 500 を返す</td>
<td>Lambda内部エラー</td>
<td>CloudWatch Logsでエラー内容を確認</td>
</tr>
</tbody>
</table>
<hr>
<h2><span id="toc33">まとめ</span></h2>
<p>今回のハンズオンで実現したこと：</p>
<ul>
<li><strong>SAMテンプレート1ファイル</strong>でLambda・API Gateway・DynamoDBの3サービスを一括定義</li>
<li><strong>CRUD 5エンドポイント</strong>（POST/GET/GET{id}/PUT/DELETE）を持つREST APIを構築</li>
<li><code>sam build</code> → <code>sam deploy</code> → <code>sam delete</code> の<strong>サーバーレスアプリのライフサイクル</strong>を体験</li>
<li><strong>Windows特有のハマりポイント</strong>（cp932エラー・CMDの変数・curlの書き方の違い）を解消</li>
</ul>
<p>Macで書かれたAWSチュートリアルをWindowsで試してエラーが出た経験がある方も多いと思います。この記事でそのハマりポイントが解決できれば幸いです。</p>
<hr>
<h2><span id="toc34">SAMがやってくれていたことをコンソールで確認する</span></h2>
<p>「SAMは便利だけど、裏で何をやっているのかわからない」と感じた方向けに、<strong>全く同じAPIをAWSコンソールのみで手動構築する手順</strong>を比較記事としてまとめました。</p>
<p><strong>コンソールで手動構築すると何が起きるか（一部抜粋）：</strong></p>
<table>
<thead>
<tr>
<th>SAMの記述1行</th>
<th>コンソールでやること</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>DynamoDBCrudPolicy</code></td>
<td>IAMロール作成 + インラインポリシーのJSON作成</td>
</tr>
<tr>
<td><code>Events: Type: Api</code>（5行）</td>
<td>API Gatewayのリソース5個 + メソッド5個 + デプロイ</td>
</tr>
<tr>
<td><code>sam delete</code></td>
<td>4サービスを依存関係の逆順に個別手動削除</td>
</tr>
</tbody>
</table>
<p>操作ステップ数はSAMの<strong>約5ステップ</strong>に対してコンソール手動は<strong>約50〜60クリック</strong>。SAMの価値をコンソール操作を通じて実感できます。</p>
<ul>
<li>AWSコンソールだけでメモアプリAPIを構築する手順【SAMとの比較付き】</li>
</ul>

<a rel="noopener" href="https://caymezon.com/aws-handson-console-lambda-apigateway-dynamodb/" title="AWSコンソールだけでメモアプリAPIを構築する手順【Lambda＋API Gateway＋DynamoDB / SAMとの比較付き】" 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-console-lambda-apigateway-dynamodb-featured-36dc8a-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-console-lambda-apigateway-dynamodb-featured-36dc8a-160x90.jpg 160w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-console-lambda-apigateway-dynamodb-featured-36dc8a-120x68.jpg 120w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-console-lambda-apigateway-dynamodb-featured-36dc8a-320x180.jpg 320w, https://caymezon.com/wp-content/uploads/2026/02/aws-handson-console-lambda-apigateway-dynamodb-featured-36dc8a-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コンソールだけでメモアプリAPIを構築する手順【Lambda＋API Gateway＋DynamoDB / SAMとの比較付き】</div><div class="blogcard-snippet internal-blogcard-snippet">はじめにこの記事は、SAM版ハンズオン記事の比較版です。SAM版ではコマンド数本でインフラが完成しましたが、「その裏で何が起きているのか？」「SAMを使わない場合はどれだけ手間がかかるのか？」 を実感してもらうために、全く同じメモアプリAP...</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.20</div></div></div></div></a>
<hr>
<h2><span id="toc35">次のステップ</span></h2>
<p>このハンズオンを完成させたら、以下の発展的な内容にもチャレンジしてみてください：</p>
<ul>
<li><strong>API Key認証の追加</strong> — 外部からの不正アクセスを防ぐ</li>
<li><strong>Cognito認証の追加</strong> — ユーザーごとにメモを管理する</li>
<li><strong>フロントエンドと連携</strong> — React/Vue.jsからこのAPIを呼び出す</li>
<li><strong>CI/CDパイプラインの構築</strong> — GitHub ActionsでSAMデプロイを自動化</li>
</ul>
<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-lambda-apigateway-dynamodb-memo-api/">AWS初心者ハンズオン - Lambda＋API Gateway＋DynamoDBでメモアプリAPIを作ろう【Windows対応】</a> first appeared on <a href="https://caymezon.com">CayTech Lab</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://caymezon.com/aws-handson-lambda-apigateway-dynamodb-memo-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
