AWS DynamoDB/DocumentDBをローカルで確認する手順(自分用メモ)

# 概要
AWS DynamoDB/DocumentDBをローカルで確認する手順

## 環境
Microsoft Windows [Version 10.0.19041.388]
Docker version 19.03.8, build afacb8b

SAM CLI, version 0.53.0
aws-sdk@2.727.1



# DynamoDB Local

## DynamoDB ローカル セットアップ
DynamoDB ローカル (ダウンロード可能バージョン) のセットアップ
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.html

に手順がある

DynamoDB Docker イメージをインストールする
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.Docker.html
を実施

```
version: '3.7'
services:
 dynamodb-local:
   image: amazon/dynamodb-local:latest
   container_name: dynamodb-local
   ports:
    - "8000:8000"
```

コンソール出力

```
>docker-compose up
Creating network "sample-sam-node_default" with the default driver Pulling dynamodb-local (amazon/dynamodb-local:latest)...
latest: Pulling from amazon/dynamodb-local
638b75f800bf: Pull complete
a455ee0c5c58: Pull complete
c7e215ba3460: Pull complete
Digest: sha256:c8aeb014edfff8b93d7f14054cb9d2a1be214d62b7c5b61eb7fb40893a8404bb
Status: Downloaded newer image for amazon/dynamodb-local:latest
Creating dynamodb-local ... done
Attaching to dynamodb-local
dynamodb-local    | Initializing DynamoDB Local with the following configuration:
dynamodb-local    | Port:       8000
dynamodb-local    | InMemory:   true
dynamodb-local    | DbPath:     null
dynamodb-local    | SharedDb:   false
dynamodb-local    | shouldDelayTransientStatuses:       false
dynamodb-local    | CorsParams: *
```

## GUIツールからの操作
dynamodb-admin
https://github.com/aaronshaf/dynamodb-admin

```
npm install -g dynamodb-admin
set DYNAMO_ENDPOINT=http://localhost:8000
dynamodb-admin
```

コンソール

```
>dynamodb-admin
  database endpoint:    http://localhost:8000
  region:               ap-northeast-1
  accessKey:            xxx

  dynamodb-admin listening on http://localhost:8001 (alternatively http://0.0.0.0:8001)
```

以下読み替え
ハッシュキー(Hash Attribute Name) → パーティションキー
レンジキー(Range Attribute Name (Optional)) → ソートキー

## VSCodeからのデバッグ

1. VS CodeにAWS Toolkitをインストール
2. Code Lensから「Add Debug Configuration」をクリック


```
"launch": {
	"configurations": [
		{
			"type": "aws-sam",
			"request": "direct-invoke",
			"name": "sample-sam-node:app.lambdaHandler (nodejs10.x)",
			"invokeTarget": {
				"target": "code",
				"projectRoot": "hello-world",
				"lambdaHandler": "app.lambdaHandler"
			},
			"lambda": {
				"runtime": "nodejs10.x",
				"payload": {},
				"environmentVariables": {}
			}
		}
	]
}
```

コード編集後、VSCodeのDebugボタンを押すとsam build/invokeを呼び出してくれる
以下でdynamodb localへのアクセスを確認

```
let response;
var dynamoOpt = {
    apiVersion: '2012-08-10',
    endpoint: "http://192.168.1.X:8000"
};
var documentClient = new AWS.DynamoDB.DocumentClient(dynamoOpt);

exports.lambdaHandler = async (event, context) => {
    try {
        scanItems = await documentClient.scan({TableName: "sample_table"}).promise();
        response = {
            "statusCode": 200,
            "body": JSON.stringify(scanItems)
        };
    } catch (err) {
        console.log(err);
        return err;
    }

    return response
};
```


# Mongo DB (Document DB)
Document DBがMongo DB互換なのでMongo DBを設置すればよい
Node.jsからの接続はMongoDB NodeJS Driverを利用し、接続先はローカルのIPアドレス

```
docker pull mongo
docker run --it --name sample-mongo mongo
```


## 参考

[AWS SAM CLI + DynamoDB localを使ってローカル上で完結するAPI開発](https://qiita.com/jacoyutorius/items/72984ff07b3b30576d43)

[MongoDBをDockerでインストールする](https://qiita.com/fetaro/items/34e29a21b5f0da6449ef)