導入
皆様こんにちは。
最近デバイス購入欲が上がってしまい、誕生日という言い訳を使って高い買い物をしてしまいました。
今年の目標は節制なのでこれからは我慢します(毎年言ってる)
前回amplify×LambdaでAPIを使えるようにしたので、
その続きとしてDynamoDBを使えるようにしました。
備忘録として記事にしていこうと思います。
全体像(やること)
- Amplify に DynamoDB テーブル を追加(storage)
- Lambda に テーブルアクセス権限 を付与
- Lambda を /posts の CRUD に変更(まずは GET/POST から)
-
amplify pushで反映 - ブラウザ(または curl)で動作確認
1) DynamoDB テーブルを追加(Amplify storage)
blog_backend のルートで実行:
cd D:\React\blog_backend
amplify add storage
聞かれたらだいたいこう選ぶとOKです(最短構成):
-
Service:
NoSQL Database -
Table name:
posts -
Partition key:
id(type:string) -
Add sort key?:
No -
Add global secondary indexes?:
No -
Configure advanced settings?:
No
これでローカルに storage が追加されます。
2) Lambda に DynamoDB 権限を付ける(重要)
次に:
amplify update function
-
対象関数:
hello -
Permissions / Resource access permissions が聞かれたら Yes
-
「どのカテゴリにアクセス?」で
storageを選ぶ -
テーブル
postsを選ぶ -
権限はまずこれでOK:
createreadupdatedelete
(最初は全部付けて動かしてから絞る方が迷子になりにくいです)
3) REST API ルートを追加(/posts を生やす)
いま helloApi が /hello だけなら、追加します。
amplify update api
- 対象:
helloApi - 追加で
pathを作る:/posts - メソッド:
GET,POST(まずはこの2つ) - それぞれ Lambda は hello を紐づけ(同じ関数で分岐させます)
ここは「API Gateway 側のルーティング」を増やす作業です。
4) Lambda(hello)を CRUD 対応に書き換え
以下のファイルを編集します(Node.js想定):
amplify/backend/function/hello/src/index.js
(または src/app.js など、テンプレにより違う場合あり)
まずは GET /posts と POST /posts が動く最小実装を貼ります。
const { DynamoDBClient } = require("@aws-sdk/client-dynamodb");
const {
DynamoDBDocumentClient,
ScanCommand,
PutCommand,
} = require("@aws-sdk/lib-dynamodb");
const client = new DynamoDBClient({ region: process.env.AWS_REGION });
const docClient = DynamoDBDocumentClient.from(client);
// ★ Amplify が自動で注入するテーブル名(重要)
const TABLE_NAME = process.env.STORAGE_POSTS_NAME;
exports.handler = async (event) => {
try {
const method = event.httpMethod;
const path = event.path;
// ---- GET /posts ----
if (path.endsWith("/posts") && method === "GET") {
const result = await docClient.send(
new ScanCommand({
TableName: TABLE_NAME,
})
);
return response(200, { items: result.Items ?? [] });
}
// ---- POST /posts ----
if (path.endsWith("/posts") && method === "POST") {
const body = JSON.parse(event.body || "{}");
const item = {
id: crypto.randomUUID(),
title: body.title,
content: body.content,
createdAt: new Date().toISOString(),
};
await docClient.send(
new PutCommand({
TableName: TABLE_NAME,
Item: item,
})
);
return response(201, item);
}
// ---- fallback ----
return response(404, { message: "Not Found" });
} catch (err) {
console.error(err);
return response(500, { message: "Internal Server Error", error: err.message });
}
};
function response(statusCode, body) {
return {
statusCode,
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
},
body: JSON.stringify(body),
};
}
5) デプロイ
amplify push
完了したら REST API endpoint が出ます。
例:
https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
6) 動作確認(ブラウザ / curl)
一覧(GET)
/dev/posts
追加(POST)
PowerShell なら:
$base="https://xxxxx.execute-api.ap-northeast-1.amazonaws.com/dev"
Invoke-RestMethod -Method Post -Uri "$base/posts" -ContentType "application/json" -Body (@{
title="first post"
content="hello dynamodb"
} | ConvertTo-Json)
次に:
Invoke-RestMethod -Method Get -Uri "$base/posts"
で一覧が返ればOKです。
まとめ
という事でChatGPTに手順を出力させてやってみました。
細かい理解は一旦後回しでかなり動くものが出来てきました。
これで
FE(React)× BE(Lambda)× DB(Dynamo) という個人開発環境が作成できました。
一旦次回は仕組みの理解を深める所をやりたいと思います。
大分駆け足で進めた為理解度を上げるフェーズが欲しいです笑
という訳でまたお会いしましょう(`・ω・´)ゞ