LoginSignup
3
3

More than 1 year has passed since last update.

Serverless Framework × TypeScript のローカル開発環境構築メモ(DynamoDB Local 編)

Last updated at Posted at 2022-01-16

Serverless Framework × TypeScript のローカル開発環境構築メモ(Serverless Offline編)
Serverless Framework × TypeScript のローカル開発環境構築メモ(DynamoDB Local 編)[今回]
Serverless Framework × TypeScript のローカル開発環境構築メモ(S3 Local編)

前回はServerless Frameworkをローカル実行する方法を記事にしました。今回はその続きで、DynamoDBをローカルで立てるプラグインServerless DynamoDB Localについて述べます。

Serverless DynamoDB Local のインストール

前回と同様にaws-nodejs-templateを使って環境を作成します。template.yamlファイルを使って書く記事が沢山上がっているのですが、TypeScriptで書いた方が変数の取り込みなど便利すぎるのでtsで書く方法を述べます。(といってもyamlをJSONに直すだけですが笑)あとでリソース用のバケットも準備するのでディレクトリ名はresourcesとしています。

$ serverless create --template aws-nodejs-typescript --path resources
$ cd resources
$ npm install

こんな感じのディレクトリ構成で進めます。api側は前回作ったAPIで、今回は新たにresourcesを足しました。

backends
├── api
│   ├── README.md
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   ├── serverless.ts
│   ├── src
│   ├── tsconfig.json
│   └── tsconfig.paths.json
└── resources
│   ├── README.md
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   ├── serverless.ts
│   ├── src
│   ├── tsconfig.json
│   └── tsconfig.paths.json

ここからは、公式に従ってインストールしていきましょう。まず、npmでserverless-dynamodb-localをインストールします。

$ npm install -D serverless-dynamodb-local

次に、serverless.tsの不要な部分を削除しつつ、次のように書き換えます。なお、stage"local"としました。

serverless.ts
import type { AWS } from "@serverless/typescript";

const serverlessConfiguration: AWS = {
  service: "resources",
  frameworkVersion: "2",
  plugins: ["serverless-esbuild", "serverless-dynamodb-local"],
  provider: {
    name: "aws",
    runtime: "nodejs14.x",
    stage: "local",
  },
  package: { individually: true },
  custom: {
    esbuild: {
      bundle: true,
      minify: false,
      sourcemap: true,
      exclude: ["aws-sdk"],
      target: "node14",
      define: { "require.resolve": undefined },
      platform: "node",
      concurrency: 10,
    },
  },
};

module.exports = serverlessConfiguration;

重要なのは、pluginsの最後に"serverless-dynamodb-local"を足したことです。(必ずビルド用プラグインの後に書いてください)さらに、この環境に次のコマンドでDynamoDB Localをインストールします。

$ npx sls dynamodb install

以上でインストールは完了です!

DynamoDB Localの起動

前項でServerless DynamoDB Localのインストールは完了しました。次は、serverless.tsresourcesを足していきます。serverless.tsserverlessConfigurationに次のキーとオブジェクトを足してください。

serverless.ts
const serverlessConfiguration: AWS = {
  ...
  resources: {
    Resources: {
      DynamoDBTable: {
        Type: "AWS::DynamoDB::Table",
        Properties: {
          TableName: "test",
          AttributeDefinitions: [
            {
              AttributeName: "DataType",
              AttributeType: "S",
            },
            {
              AttributeName: "ID",
              AttributeType: "S",
            },
          ],
          KeySchema: [
            {
              AttributeName: "DataType",
              KeyType: "HASH",
            },
            {
              AttributeName: "ID",
              KeyType: "RANGE",
            },
          ],
          ProvisionedThroughput: {
            ReadCapacityUnits: 1,
            WriteCapacityUnits: 1,
          },
        },
      },
    },
  },
  ...
}

このresorcesAWSの公式に従って書いていけば良いです。たくさんのオプションがあるので戸惑うかもしれませんが、基本はPK, SK, GSIなどのテーブル設定と1秒当たりのスループットの最大値を設定するだけです。

次に、DynamoDB LocalのConfigを書いていきます。serverlessConfiguration.customに次を足します。

serverless.ts
const serverlessConfiguration: AWS = {
  ...
  custom: {
    ...
    dynamodb: {
      stages: ["local"],
      start: {
        port: 8000,
        inMemory:true,
        migrate:true,
        seed: true,
      },
      seed: {
        local: {
          sources: [
            {
              table: "test",
              sources: ["./seed/test.json"],
            },
          ],
        },
      },
    },
  },
}

ここで、stagesにはローカル実行したいステージを記載します。また、startにはローカル実行する場合の設定を書き、start.seed=trueの場合はDB起動時のシード値としてseedに書いたソースがインポートされます。なお、seed/test.jsonには以下のようなデータを入れました。

seed/test.json
[
  {
    "DataType": "Hoge",
    "ID": "HOGE_1"
  },
  {
    "DataType": "HUGA",
    "ID": "HUGA_2"
  }
]

 ここまでできると、次のコマンドで起動できます。(注意:Javaがインストールされていないとエラーが出ることがあるようです)

$ npx sls dynamodb start

次が表示されると、localhost:8000にDynamoDBが立っていることになります。

Dynamodb Local Started, Visit: http://localhost:8000/shell
Serverless: DynamoDB - created table test
Seed running complete for table: test

接続確認

ここではAPIも同時に立てて、DynamoDB Localにアクセスできるか確認しましょう。前回のようにLambda関数をローカルで実行します。

まず、sdkをインストールします。

$ npm install @aws-sdk/client-dynamodb

次に、Lambda関数を書いていきます。api/src/functions/hello/handler.tsに次を足します。

api/src/functions/hello/handler.ts
import {
  DynamoDBClient,
  DynamoDBClientConfig,
  ScanCommand,
} from "@aws-sdk/client-dynamodb";
const ClientConfig: DynamoDBClientConfig = {
  endpoint: "http://localhost:8000",
};
const dynamodb = new DynamoDBClient(ClientConfig);

さらにハンドラ関数内で次のようにDynamoDBアクセスを行います。ここではそのままレスポンスにDBのデータを入れました。

api/src/functions/hello/handler.ts
const hello: ValidatedEventAPIGatewayProxyEvent<typeof schema> = async (
  event
) => {
  ...
  const result = await dynamodb.scan({
    TableName:"test"
  }).promise();
  const data = result.Items;
  ...
  return formatJSONResponse({
    data,
    event,
  });
};

ここまでやれば、あとはローカルで実行してみるだけ!

$ npx sls invoke local -f hello

次のようなレスポンスが帰ってきたらOKです。

{
    "statusCode": 200,
    "body": "{\"data\":[{\"DataType\":{\"S\":\"HUGA\"},\"ID\":{\"S\":\"HUGA_2\"}},{\"DataType\":{\"S\":\"Hoge\"},\"ID\":{\"S\":\"HOGE_1\"}}],\"event\":\"\"}"
}

まとめ

今回はServerless DynamoDB Localを使ってDynamoDBのローカル開発環境を整えてみました。まとめると次のような感じでした。

  1. serverless createでServerless Frameworkの環境構築
  2. npm install -D serverless-dynamodb-localでnpmモジュールをインストール
  3. serverless.tsにプラグインを記載してnpx sls dynamodb installでServerless環境にインストール
  4. serverless.tsresourcesを追加し、custumにDynamoDB Localの設定を記載
  5. npx sls dynamodb startで起動
  6. 接続確認

少し手間がかかりますが、実際に立てられさえすればローカル開発がめちゃめちゃ捗ります!ぜひ使ってみてください。

次回はさらにS3 Bucketをローカル環境に追加してみます。ぜひこれからも最高のエンジニアライフを!!

3
3
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
3
3