あいつの日誌β

働きながら旅しています。

DynamoDB と Lambda を local で動作させるチュートリアル

久しぶりに DynamoDB の案件がやってきたので素振りをしようと思ったらすっかりやり方が分からなくなっているのでメモを残しました。

なお、私のシステム環境は以下の通りです。

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.2
BuildVersion:   19C57

% java -version
java version "13.0.2" 2020-01-14
Java(TM) SE Runtime Environment (build 13.0.2+8)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.2+8, mixed mode, sharing)

% node -v
v12.13.1

% sls -v
Framework Core: 1.61.2
Plugin: 3.2.7
SDK: 2.2.1
Components Core: 1.1.2
Components CLI: 1.4.0

% aws --version
aws-cli/1.17.5 Python/2.7.16 Darwin/19.2.0 botocore/1.14.

awscli は dynamodb に直接クエリを発行して動作確認したいだけなので、必ずしも必要というわけではないです。serverless cli はこのチュートリアルにおいては必ず必要です。

プロジェクトの雛形を作成する

sls create --template aws-nodejs --path dynamodb-local-tutorial && cd $_
yarn init -y
mkdir seeds
touch seeds/articles.json

DynamoDB を offline で動作できるようにする

yarn add -D aws-sdk serverless-offline serverless-dynamodb-local
serverless dynamodb install

テストデータを用意

`seeds/articles.json` に以下の様にテストデータとなる JSON を用意しておきます。

[
{
  "id": "1",
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "description": "quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto",
  "isFavorite": false
},
{
  "id": "2",
  "title": "qui est esse",
  "description": "est rerum tempore vitae sequi sint nihil reprehenderit dolor beatae ea dolores neque fugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis qui aperiam non debitis possimus qui neque nisi nulla",
  "isFavorite": true
}
]

serverless.yml を修正

service: aws-nodejs-rest-dynamodb

plugins:
  - serverless-dynamodb-local
  - serverless-offline

custom:
  dynamodb:
    stages:
      - ${self:provider.stage}
    start:
      port: 8000
      inMemory: true
      migrate: true
      seed: true
    seed:
      development:
        sources:
          - table: articles
            sources: [./seeds/articles.json]

provider:
  name: aws
  runtime: nodejs12.x
  region: ap-northeast-1
  environment:
    DYNAMODB_TABLE: articles
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"

resources:
  Resources:
    ArticlesTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: articles
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1

この状態で sls dynamodb start を実行すると local で動作するようになります。

ここまでの動作確認

awscli を使って動作確認をします。

% aws dynamodb list-tables --endpoint-url http://localhost:8000
% aws dynamodb scan --table-name hotels --endpoint-url http://localhost:8000

Lambda 経由で動作させる

今度は Lamdba を動作させます。

yarn add aws-sdk express serverless-http

serverless.yml を少し修正します。

+
+functions:
+  app:
+    handler: handler.main
+    events:
+      - http:
+          method: ANY
+          path: '/'
+          cors: true
+      - http:
+          method: ANY
+          path: '{proxy+}'
+          cors: true

serverless offline を実行してから以下のコマンドの動作確認をします。

BASE_URL="http://localhost:3000"
curl -s -X GET "${BASE_URL}/api/articles"
curl -s -X GET "${BASE_URL}/api/articles/1" | jq .
curl -s -X PUT "${BASE_URL}/api/articles/1/favorite"
curl -s -X GET "${BASE_URL}/api/articles/1" | jq .article.isFavorite
curl -s -X PUT "${BASE_URL}/api/articles/1/unfavorite"
curl -s -X GET "${BASE_URL}/api/articles/1" | jq .article.isFavorite

まとめ

というわけで 8000 port で DyanamoDB を、3000 port で Lamdba を実行できました。あとは sls deploy して本番に公開したり、 sls remove したりすると良いでしょう。

こちらからは以上です。