【AWS】AWS LambdaとAmazon DynamoDBを使ってCRUD APIを開発(Management Console上)

AWS

1. 概要

前回はAmazon DynamoDBを「PartiQL for DynamoDB」で操作する内容でした。今回は「Lambda」と「DynamoDB」をつないでCRUD APIを開発する内容となります。

2. AWSアカウントにサインアップ

2-1. 前提条件

3. テーブルを作成

3-1. テーブルを作成

【公式】Amazon DynamoDBとは(マネージド NoSQL データベース)| AWS

4. Lambda関数を作成

4-1. Lambda関数を作成

  • 関数名
    • http-crud-tutorial-function
  • 実行ロール
    • AWS ポリシーテンプレートから新しいロールを作成
      • ロール名
        • 「SimpleMicroserviceAccessRole」を入力
  • ポリシーテンプレート – オプション
    • 「シンプルなマイクロサービスのアクセス権限」を選択

4-2. コードの置き換え

import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, ScanCommand, PutCommand, GetCommand, DeleteCommand } from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient({});

const dynamo = DynamoDBDocumentClient.from(client);

const tableName = "http-crud-tutorial-items";

export const handler = async (event, context) => {
  let body;
  let statusCode = 200;
  const headers = {
    "Content-Type": "application/json"
  };

  try {
    switch(event.routeKey) {
      case "DELETE /items/{id}":
        await dynamo.send(
          new DeleteCommand({
            TableName: tableName,
            Key: {
              id: event.pathParameters.id
            }
          })
        );
        body = `Deleted item ${event.pathParameters.id}`;
        break;
      case "GET /items/{id}":
        body = await dynamo.send(
          new GetCommand({
            TableName: tableName,
            Key: {
              id: event.pathParameters.id
            }
          })
        );
        body = body.Item;
        break;
      case "GET /items":
        body = await dynamo.send(
          new ScanCommand({TableName: tableName})
        );
        body = body.Items;
        break;
      case "PUT /items":
        let requestJSON = JSON.parse(event.body);
        await dynamo.send(
          new PutCommand({
            TableName: tableName,
            Item: {
              id: requestJSON.id,
              price: requestJSON.price,
              name: requestJSON.name
            }
          })
        );
        body = `Put item ${requestJSON.id}`;
        break;
      default: 
        throw new Error(`Unsupported route: "${event.routeKey}"`);
    }
  } catch (err) {
    statusCode = 400;
    body = err.message;
  } finally {
    body = JSON.stringify(body);
  }

  return {
    statusCode,
    body,
    headers
  };
};
  • 置き換え後「Deploy」

5. HTTP APIを作成

5-1. HTTP APIを作成

  • 「HTTP API」を選択
  • API名
    • http-crud-tutorial-api

6. ルートを作成

6-1. ルートを作成

  • 「メソッド」と「パス」をそれぞれ選択・入力(4つ)
    • GET /items/{id}
    • GET /items
    • PUT /items
    • DELETE /items/{id}

7. 統合を作成

7-1. 統合を作成

  • この統合をルートにアタッチする
    • スキップ
  • 統合タイプ
    • Lambda関数
  • Lambda関数
    • 「http-crud-tutorial-function」を入力

8. 統合をルートにアタッチ

8-1. 統合をルートにアタッチ

  • 左メニュー(ペイン)からルート(パス)を選択
  • 既存の統合を選択する
    • 「http-crud-tutorial-function」を選択
  • 統合をアタッチする

※すべてのルートを繰り返しアタッチ

9. APIをテスト

9-1. URLを取得

  • 「詳細」ページ
    • URLを呼び出す

9-2. APIの呼び出し

  • 9-2-1. 項目の作成または更新
curl -X "PUT" -H "Content-Type: application/json" -d "{\"id\": \"123\", \"price\": 12345, \"name\": \"myitem\"}" https://1234567890.execute-api.ap-northeast-1.amazonaws.com/items

“Put item 123”

  • 9-2-2. すべての項目を取得
curl https://1234567890.execute-api.ap-northeast-1.amazonaws.com/items

[{“price”:12345,”id”:”123″,”name”:”myitem”}]

  • 9-2-3. Console画面で確認

  • 9-2-4. 1 つの項目を取得
curl https://1234567890.execute-api.ap-northeast-1.amazonaws.com/items/123

{“price”:12345,”id”:”123″,”name”:”myitem”}

  • 9-2-5. 項目を削除
curl -X "DELETE" https://1234567890.execute-api.ap-northeast-1.amazonaws.com/items/123

“Deleted item 123”

  • 9-2-6. すべての項目を取得
curl https://1234567890.execute-api.ap-northeast-1.amazonaws.com/items

[]

10. リソースをクリーンアップ

※必要に応じ削除

  • DynamoDBテーブルを削除
  • HTTP APIを削除
  • Lambda関数を削除
  • Lambda関数のロググループを削除
  • Lambda関数の実行ロールを削除

11. 備考

Amazon DynamoDBをPartiQLで操作する内容でした。

12. 参考

  1. チュートリアル: Lambda と DynamoDB を使用した CRUD API の構築 – Amazon API Gateway

投稿者プロフィール

Sondon
開発好きなシステムエンジニアです。
卓球にハマってます。

関連記事

  1. AWS

    【AWS】AWS Step Functions with Lambda…

  2. AWS

    【AWS】Redash on EC2 が突然 502 Bad Gate…

  3. AWS

    【AWS】Github ActionsやAWS SAMを使ってAWS …

  4. AWS

    【AWS】API Gateway + Lambda + SESで汎用メ…

  5. AWS

    【AWS】AWS SAMを使い、CLIでGraphQL APIを開発(…

  6. AWS

    【AWS EC2】シミュレーションプログラムを動かしてみた

最近の記事

制作実績一覧

  1. Checkeys