Single Page Application を Serverless Framework と React でやる Tutorial(2)

今回の記事では DynamoDB について学びます。

```
sls create --template aws-nodejs --path serverless-tutorial-two && cd $_
yarn init -y
yarn add aws-sdk --save
yarn add serverless-offline serverless-dynamodb-local --dev
mkdir json migrations
```

`edit serverless.yml` service のすぐ下に plugins を追加します。

```
service: serverless-tutorial-two
plugins:
 - serverless-dynamodb-local
 - serverless-offline
```

local に dynamoDB を install して、動作確認します。

```
sls dynamodb install
sls dynamodb start
```

ブラウザで `http://localhost:8000/shell/` にアクセスすると dynamodb へのクエリを GUI で行う事ができます。コンソール画面に以下を貼り付けて実行して見て下さい。たぶん空の配列が変えると思います。

```
var params = {
    Limit: 100,
};
dynamodb.listTables(params, function(err, data) {
    if (err) ppJson(err);
    else ppJson(data);
});
```

コマンドラインだと以下のようにします

```
aws dynamodb list-tables --endpoint-url http://localhost:8000
```

## テーブルを作成する

AWS CLI を使う場合は下記のように実行すればテーブルが作られます。

```
aws dynamodb create-table --table-name articles --attribute-definitions    AttributeName=id,AttributeType=S \
     --key-schema AttributeName=id,KeyType=HASH \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
    --endpoint-url http://localhost:8000
```

もしくは以下のような json を用意して

```
{
    "TableName": "articles",
    "KeySchema": [
        {   
            "KeyType": "HASH",
            "AttributeName": "id"
        }   
    ],  
    "AttributeDefinitions": [
        {   
            "AttributeType": "S",
            "AttributeName": "id"
        }   
    ],  
    "ProvisionedThroughput": {
        "WriteCapacityUnits": 1,
        "ReadCapacityUnits": 1
    }   
}
```

下記のようなコマンドを実行してもOK

```
aws dynamodb \
create-table \
--endpoint-url http://localhost:8000 \
--cli-input-json file://json/articles.schema.json
```

以下のコマンドで確認ができます。

```
aws dynamodb list-tables --endpoint-url http://localhost:8000
{
    "TableNames": [
        "Articles"
    ]
}
```

## Table にデータをインサート

データをインサートします。以下のような JSON を用意します。
create `json/articleItem.json`

```
{
  "id": {
    "S": "1" 
  },  
  "title": {
    "S": "xxxx"
  },  
  "description": {
    "S": "yyyy"
  },  
  "isFavorite": {
    "BOOL": false
  }
}
```

以下を実行すればデータを挿入できます。

```
aws dynamodb put-item \
--table-name articles \
--item file://json/ArticleItem.json \
--endpoint-url http://localhost:8000
```

以下で確認

```
aws dynamodb scan --table-name articles --endpoint-url http://localhost:8000
```

なんですが `sls dynamodb start` で起動したプロセスを kill するとデータが消えてしまいます。なので `sls dynamodb start` した時点で必要な情報を serverless.yml に記述して都度 migration するようにします。

## Servelerss の migration 機能を使う

`migratios/articles.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 を編集します。以下を追記します。

```
custom:
  dynamodb:
    start:
      port: 8000
      inMemory: true
      migrate: true
      seed: true
    seed:
      development:
        sources:
          - table: articles
            sources: [./migrations/articles.json]

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`　をやり直してプロセスを再起動してから以下のコマンドを実行します。

```
aws dynamodb scan --table-name articles --endpoint-url http://localhost:8000
```

## まとめ

dynamodb を local で実行する方法を学びました。serverless では dynamodb が一番とっつきにくかもしれません。もちろんサービスによっては MySQL など慣れたツールを使うのも良いと思います。その辺りは選択肢が色々あると思います。

次回は Lambda から DynamoDB を呼び出して AWS 上にデプロイする方法を学びます。