AWS SAMでサーバーレスアプリケーション！その２（DynamoDB）

#前回の続き
前回の記事（https://qiita.com/futo_creid/items/82a4c25ccb7a55f6c514）で
SAMを使用して、ローカルで簡単なWEBAPIを作成しました。
ただこれだと、決まった結果しか返すことしかできないので、DBからデータを持ってきたいと思います。
なので今回はDB構築したいと思います。
構築するDBはサーバーレスアプリケーションでよくセットで使われるDynamoDBです。

---
#１：実施環境
・Windows10 Home
・Docker Toolbox OR Docker for Windows 
・Python
・AWS SAM CLI

---
#２：構成
DynamoDB local


---
#３：環境準備

##１．APIGATEWAY＆Lambda
前回の記事（https://qiita.com/futo_creid/items/82a4c25ccb7a55f6c514）
参照です。

以下の作業は

```
C:\Users\ユーザ名\samtest
```
フォルダ内で実施します。（ユーザ名はログインユーザ名で）

##２．AWS設定
以下を実施し、AWSの初期設定を行います。
ローカルでの実施なので適当な値です。（東京リージョンにはしていますが）

```
aws configure
AWS Access Key ID [None]: ZipID
AWS Secret Access Key [None]: ZipSecret
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

#４：実装
DynamoDBを構築していきます！

##１．コンテナ作成

PowerShellを開きます。
以下を実行して、DynamoDBを落としてきます。

```
docker pull amazon/dynamodb-local
```
以下を実行して、ネットワークを作成します。

```
docker network create api-network
```
以下を実行して、Dockerのコンテナを作成します。

```
docker run --network api-network --name dynamodb -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
docker run --network api-network --name dynamodb -d -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -inMemory -sharedDb
```
実行して以下の表示が出たら作成が終わっているので、ctrl+cで実行から離脱します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172553/86980ebd-817d-f815-dbb3-3e546e0e5b77.png)

###・DynamoDBを起動する
再起動など、一度コンテナを停止した場合は以下でDynamoDBを起動します。

```
docker start dynamodb
```

##２．テーブル作成
http://192.168.99.100:8000/shell/
にアクセスするとDynamoDBを操作できる画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172553/4827d1a4-e660-e03f-802d-beef081f2073.png)


そこで1行目から以下を入力します。

```CreateTable
var params = {
    TableName: 'ZipData',
    KeySchema: [ // The type of of schema.  Must start with a HASH type, with an optional second RANGE.
        { // Required HASH type attribute
            AttributeName: 'Zip',
            KeyType: 'HASH',
        }
    ],
    AttributeDefinitions: [ // The names and types of all primary and index key attributes only
        {
            AttributeName: 'Zip',
            AttributeType: 'S', // (S | N | B) for string, number, binary
        }
    ],
    ProvisionedThroughput: { // required provisioned throughput for the table
        ReadCapacityUnits: 1, 
        WriteCapacityUnits: 1, 
    },
};
dynamodb.createTable(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});
```

入力したら画面内の以下の▶のボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172553/6123a1e7-e9cc-551a-5db3-c691a02f3262.png)

すると画面右側にこんな画面が表示され、テーブルの作成が完了します！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172553/686c4a30-809f-f1d4-b504-1562e3e16550.png)

##３．データ追加
次は以下のコマンドを入力してデータを作成します。

```
var params = {
    TableName: 'ZipData',
    Item: {
        Zip: '1000006',
        Data: '東京都千代田区有楽町',
    },
	ReturnValues: 'NONE', // optional (NONE | ALL_OLD)
    ReturnConsumedCapacity: 'NONE', // optional (NONE | TOTAL | INDEXES)
    ReturnItemCollectionMetrics: 'NONE', // optional (NONE | SIZE)
};
docClient.put(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});
```

##４．データ参照
データが追加されているはずなので、以下のコマンドで確認します。

```
var params = {
    TableName: 'ZipData',
};
docClient.scan(params, function(err, data) {
    if (err) ppJson(err); // an error occurred
    else ppJson(data); // successful response
});
```
以下のような結果が返ってくるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172553/6aad63fe-37d3-303b-0313-3c761daa5cfd.png)

また、これだとデータすべてが返ってきてしまうので、
単体を指定する場合は以下を実行します。

```
var params = {
    TableName: 'ZipData',
    Key:{
         Zip: '1000006'
    }
};
docClient.get(params, function(err, data){
    if(err){
        console.log(err);
    }else{
        console.log(data.Item.Data);
    }
});
```
以下の結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172553/14b63d1b-a567-25f8-e0ea-e533743eba7c.png)

##終わりに
今回でDynamoDBがローカルに構築でき、また、データが操作できるようになりました。
次回はAPIからこのデータを操作したいと思います。