DynamoDB に docker で入門する

# 基本的なこと

まずはコンテナを立てます。port と名前を設定しておきましょう。

```bash
$ docker run -p 8000:8000 --name sample-dynamo amazon/dynamodb-local:1.13.1
Initializing DynamoDB Local with the following configuration:
Port:	8000
InMemory:	true
DbPath:	null
SharedDb:	false
shouldDelayTransientStatuses:	false
CorsParams:	*
```

まずは、つくったコンテナのテーブルを調べます。ローカルの 8000 で動かしていますので、`--endpoint-url` で以下のようにしておきます。

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

テーブルが存在しないことが分かりました。

次にテーブルを作ります。AttributeName には[予約語](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ReservedWords.html)を使わないように気をつけます。

```bash
$ aws dynamodb create-table \
  --table-name users \
  --attribute-definitions AttributeName=nickname,AttributeType=S \
  --key-schema AttributeName=nickname,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
  --endpoint-url http://localhost:8000
{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "nickname",
                "AttributeType": "S"
            }
        ],
        "TableName": "users",
        "KeySchema": [
            {
                "AttributeName": "nickname",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2020-12-20T18:33:05.236000+09:00",
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": "1970-01-01T09:00:00+09:00",
            "LastDecreaseDateTime": "1970-01-01T09:00:00+09:00",
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 1,
            "WriteCapacityUnits": 1
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/users"
    }
}
```

作ったテーブルを見てみたり消したりするのは以下のコマンド

```bash
# describe table
$ aws dynamodb describe-table --table-name users --endpoint-url http://localhost:8000

# delete table
aws dynamodb delete-table --table-name users --endpoint-url http://localhost:8000 
```

データを入れて、確認してみる

```bash
$ aws dynamodb put-item --table-name users --endpoint-url http://localhost:8000 --item '{"nickname": {"S": "taro"}}'
~/D/s/sam-app
$ aws dynamodb scan --table-name users --endpoint-url http://localhost:8000
{
    "Items": [
        {
            "nickname": {
                "S": "taro"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}
```

以上で基本的な操作ができました。

# 複合プライマリキー

```bash
aws dynamodb create-table \
--table-name users \
--attribute-definitions AttributeName=nickname,AttributeType=S AttributeName=age,AttributeType=N \
--key-schema AttributeName=nickname,KeyType=HASH AttributeName=age,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
--endpoint-url http://localhost:8000
```

# scan するときに filter する

```bash
$ aws dynamodb scan --table-name users --endpoint-url http://localhost:8000 --filter-expression 'nickname = :n' --expression-attribute-values '{":n": {"S": "taro"}}'

$ aws dynamodb scan --table-name users --endpoint-url http://localhost:8000 --filter-expression 'age > :a' --expression-attribute-values '{":a": {"N": "11"}}'
```

cf. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ScanFilter.html