0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AmplifyでDBを用意する

Posted at

導入

皆様こんにちは。
最近デバイス購入欲が上がってしまい、誕生日という言い訳を使って高い買い物をしてしまいました。
今年の目標は節制なのでこれからは我慢します(毎年言ってる)

前回amplify×LambdaでAPIを使えるようにしたので、
その続きとしてDynamoDBを使えるようにしました。

備忘録として記事にしていこうと思います。

全体像(やること)

  1. Amplify に DynamoDB テーブル を追加(storage)
  2. Lambda に テーブルアクセス権限 を付与
  3. Lambda を /posts の CRUD に変更(まずは GET/POST から)
  4. amplify push で反映
  5. ブラウザ(または 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:

    • create
    • read
    • update
    • delete

(最初は全部付けて動かしてから絞る方が迷子になりにくいです)


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) という個人開発環境が作成できました。
一旦次回は仕組みの理解を深める所をやりたいと思います。
大分駆け足で進めた為理解度を上げるフェーズが欲しいです笑

という訳でまたお会いしましょう(`・ω・´)ゞ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?