久しぶりに 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
したりすると良いでしょう。
こちらからは以上です。