docker-composeを利用して、お手軽にpythonとdynamodb(ローカル)環境を用意する

##準備

<b>構成</b>

```
   dockerPython -- dynamodb -- data(中身空のディレクトリ)
                |           |
                |           -- Dockerfile
                |
                -- python37 -- Dockerfile
                |
                -- docker-compose.yml    
   
```

###dynamodb/Dockerfile
dynamodb_localイメージを取得後、データ用にdataディレクトリを用意しています。

```:dynamodb/Dockerfile
FROM amazon/dynamodb-local

WORKDIR /home/dynamodblocal

RUN mkdir data && chown -R 1000 data
```

###python37/Dockerfile
pythonイメージ取得後、codeディレクトリを作成しています。

```:python37/Dockerfile
FROM python:3.7
ENV PYTHONUNBUFFERED 1
WORKDIR /code
```

[ENV PYTHONBUFFEREDはバッファを無効にしています](https://translate.google.com/translate?hl=ja&sl=en&u=https://www.reddit.com/r/learnpython/comments/5ebkq6/what_does_pythonunbuffered1_do/&prev=search)

###docker-compose.yml

```:docker-compose.yml
version: "3"

services:

  python37:
    build: ./python37
    container_name: python37
    volumes:
      - ../pythonProject/:/code
    tty: true
    ports:
      - 8037:8000
    depends_on:
      - dynamodb

  dynamodb:
    build: ./dynamodb
    container_name: dynamodb
    volumes:
      - ./dynamodb/data:/home/dynamodblocal/data
    ports:
      - 8000:8000
    command: -jar DynamoDBLocal.jar -dbPath ./data
```

volumnsでローカルの対象ディレクトリと同期しています。depends_onは、対象のサービスが立ち上がってから立ち上がるようにしたいときに指定します。[service:dynamodb](https://qiita.com/okashoi/items/f1c757279574d37b812e)
command: -jar DynamoDBLocal.jar -dbPath ./dataは圧縮ファイルを解凍して、dynamodbを起動しています。

## コンテナの立ち上げ

```:コマンド
dockerPython>docker-compose up -d
```

これで、環境構築に関しては、完了しました。

##動くかテストする。

###python

pythonファイルが動くかテストするため、dockerPython下にtest.pyファイルを作成します。

```:test.py
print ('今日も最高!!')
```

作成出来ましたら、コンテナに入ります。

```:コマンド
docker-compose exec python37 bash
```

ローカルのdockerPythonディレクトリとコンテナ内のcodeディレクトリは同期されているはずなので、test.pyを実行してみます。

```:コマンド
root@bc0986cbdd74:/code# python test.py
今日も最高!!
```

表示できましたら、完了です。

###dynamodb

pythonファイルが動いたので、pythonファイルから、dynamodbを動かすテストを行います。
まず、[boto3](https://qiita.com/kimihiro_n/items/f3ce86472152b2676004)というPythonからdynamodbを操作する際の便利ライブラリを利用します。

```:コマンド
pip install boto3
```

インストールが完了しましたら、[テーブル作成用のpythonファイル(create_table.py)をdockerPythonディレクトリ下に用意します。](https://qiita.com/kg1/items/9faf77d7f42e08ae9db6)

```:dockerPython/create_table.py
import boto3

dynamodb = boto3.resource(
    'dynamodb',
    region_name='ap-northeast-1.',
    endpoint_url="http://192.168.99.100:8000",
    aws_access_key_id='ACCESS_ID',
    aws_secret_access_key='ACCESS_KEY'
)

table = dynamodb.create_table(
    TableName='test',
    KeySchema=[
        {
            'AttributeName': 'id',
            'KeyType': 'HASH'
        }
    ],
    AttributeDefinitions=[
        {
            'AttributeName': 'id',
            'AttributeType': 'N'
        }
    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 1,
        'WriteCapacityUnits': 1
    }
)

print('Table status:', table.table_status)
```

importでboto3を利用します。
[boto3でDynamoDB のテーブル操作をするためには、region_name や access_key_id、aws_secret_access_key を設定する必要があるので、設定し、テーブルを作成していきます。'dynamodb'とendpoint_url以外の設定は、ローカル環境のためなんでも大丈夫です](https://qiita.com/kg1/items/9faf77d7f42e08ae9db6)

- <b>TableName</b> テーブル名
- <b>KeySchema</b> プライマリキーの設定
- <b>AttributeName</b> 列名
- <b>KeyType</b> タイプ　HASHでプライマリキーを指定
- <b>AttributeDefinitions</b> 列定義
- <b>AttributeType</b> [データの型指定種類](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBMapper.DataTypes.html)
- <b>ProvisionedThroughput</b> [テーブルに必要な 1 秒あたりの読み取り/書き込み数](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SQLtoNoSQL.CreateTable.html)

[一覧参考記事](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SQLtoNoSQL.CreateTable.html)
それでは実行します。

```:コマンド
root@bc0986cbdd74:/code# python create_table.py
Table status: ACTIVE
```

テーブルが作成され、Active状態になれば完了です。