🎉

serverless framework + TypeScript +DynamoDB のローカル環境

2020/09/18に公開

参考
Serverless アプリケーションをローカルで開発する - Qiita

手順を整理。DynamoDBも使用。

1. sls create

sls create -t aws-nodejs-typescript -p my-api

2. plugin

npm i -D serverless-offline serverless-dynamodb-local

serverless.ts に追加

  plugins: [
    'serverless-webpack',
    'serverless-dynamodb-local',
    'serverless-offline',
  ]

3. JDKがなければJDKをインストール

dynamodb-localのためにjavaが必要。
Ubuntuなら以下などでインストール。

sudo apt install openjdk-14-jdk

4. sls dynamodb install

以下を実行してインストール。
.dynamodb以下に実行ファイルがダウンロードされる。

sls dynamodb install

5. dynamodb local用に設定

serverless.ts に以下設定

  custom: {
    // ...
    dynamodb: {
      stages: ['dev'],
      start: {
        port: 8000,
        inMemory: true,
        migrate: true,
        seed: false,
      },
    },
  },
  resources: {
    Resources: {
      JankensTable: {
        Type: 'AWS::DynamoDB::Table',
        Properties: {
          TableName: 'jankens',
          AttributeDefinitions: [
            {
              AttributeName: 'player',
              AttributeType: 'S',
            },
            {
              AttributeName: 'unixtime',
              AttributeType: 'N',
            },
          ],
          KeySchema: [
            {
              AttributeName: 'player',
              KeyType: 'HASH',
            },
            {
              AttributeName: 'unixtime',
              KeyType: 'RANGE',
            },
          ],
          ProvisionedThroughput: {
            ReadCapacityUnits: 1,
            WriteCapacityUnits: 1,
          },
        },
      },
    },
  },

6. sls dynamodb start

dynamodb localが起動してテーブルが登録される

7. npm i -S aws-sdk

npm i -S aws-sdk

8. LambdaでDynamoDBクライアントの初期化を分岐

https://github.com/dherault/serverless-offline#the-processenvis_offline-variable

上記にあるように process.env.IS_OFFLINE でserverless-offline環境かどうか分岐ができる。

import { DynamoDB } from 'aws-sdk'

const dynamodb = process.env.IS_OFFLINE
  ? new DynamoDB({
      region: 'localhost',
      endpoint: 'http://localhost:8000',
    })
  : new DynamoDB()

などする。

Discussion