Dockerコンテナを使ったDynamoDB環境の作成とデータ操作をしてみた
こんにちは。i-Vinci 西村です。
 前回はDocker入門の様な記事を書きましたが、今回は少し応用編としてDockerでDynamoDBを起動してみたいと思います!
AWSのサービスであるDynamoDBですが、残念ながらタダではありません。お金がかかります。💴
 DBへのアクセス(読み込み/書き込み)も課金の対象ではありますが、データの容量や各種オプションも対象になります。
 テーブルごとにオンデマンドモード・プロビジョニングモードを選択することにより料金の計算方法も変わったりと。。
 詳しくはこちらを。👉AWS 料金
少しだけ触ってみたい場合や開発で色々デバッグをしたい時など、
 お金がかかるのではちょっと困りますよね。。😢💴
そこで、dynamodblocalです!
dynamodblocalとは、ローカル端末で動作可能なDynamoDB互換のデータベースです。AWSが公式でリリースしています。
 ローカルで動かすので、課金される心配はありません!😇
 JavaもしくはDocker上で動作しますが、今回はDockerで起動します。
 また、dynamodb-localをGUIで確認できるdynamodb-adminというツールも起動してみましょう。
では、はじめて参りましょう!
※前提
- 使用PC : Mac
 - dockerが既にインストールされていること。
 
目次
4. まとめ
1. そもそもDynamaoDBとは?
DynamoDBとは、AWSが提供するマネージド型のNoSQLデータベースサービスです。
NoSQLとは?
データベースはRDBMSとNoSQLに分けることが出来ます。
 RDBMSは専用のSQLでデータを操作しますが、SQLを使わずにデータの操作が可能なのが、NoSQLです。非RDBMSとも呼ばれます。
 NoSQLには様々なデータモデルが存在しますが、DynamoDBではJSON形式で保存するKey-Value型を採用しています。
AWSの公式ページに分かりやすい解説があるので、詳しくはこちらをご参照ください。 
 👉【AWS公式ドキュメント】 NoSQL データベース とは
 👉【AWS公式ドキュメント】 Amazon DynamoDB とは
ざっくりと概要がわかったところで...
 さっそく初めましょう!
2. Docker composeでDynamoDB環境の作成
今回はDocker composeでdynamodb-localとdynamodb-adminの2つのコンテナを起動します。
 Docker composeについての詳しい説明は今回は割愛しますが、ざっくりと言うと、
 YAML ファイルと言うファイルに必要な情報を設定し、複数のコンテナを容易に構築・実行できる機能です。
 詳しい解説はこちらをご参照下さい。
 👉【Docker公式ドキュメント】Docker Compose 概要
2-1. docker-compose.ymlを作成
任意の場所に作業フォルダを作成し、docker-compose.ymlファイルを作成します。
- {任意の作業フォルダ名}
 - docker-compose.yml
docker-compose.ymlの中身を下記の通り設定します。
version: '3'
services:
  dynamodb-local:
    container_name: dynamodb-trial
    image: amazon/dynamodb-local:latest
    user: root
    command: -jar DynamoDBLocal.jar -sharedDb -dbPath /data
    volumes:
      - dynamodb-local-data:/data
    ports:
      - 8000:8000
  dynamodb-admin:
    container_name: dynamodb-admin-trial
    image: aaronshaf/dynamodb-admin:latest
    environment:
      - DYNAMO_ENDPOINT=dynamodb-local:8000
    ports:
      - 8001:8001
    depends_on:
      - dynamodb-local
volumes:
  dynamodb-local-data:
※YAMLファイルの設定内容について、少し解説
- version : docker-composeで使用するバージョンを指定します。
 - services : 起動するコンテナの定義を"services"の配下に記述します。今回はdynamodb-localとdynamodb-adminを定義しています。
 - command : コンテナ起動時に渡すコマンドを指定します。
※以下オプションの解説。- -jar DynamoDBLocal.jar
"-jar DynamoDBLocal.jar"を指定しないと、containerをstopしたときにtableが消えます。(データの永続化) - -sharedDb
"-sharedDb"を指定した場合、DynamoDB では、認証情報やリージョンごとに別のファイルを使用せずに、単一のデータベースファイルを使用します。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html#DynamoDBLocal.CommandLineOptions 
 - -jar DynamoDBLocal.jar
 - volumes : データをマウントしたいパスを指定します。
今回はトップレベルで”dynamodb-local-data”を指定していますが、これを名前付きボリュームと言います。
名前付きボリュームは複数コンテナから参照可能です。
dyamodb-localで指定しているvolumesでは、名前付きボリュームをコンテナ内のdataディレクトリにマウントしています。 - ports : 公開用のポートを「ホスト側:コンテナ側」形式で指定します。ホスト側の指定は省略できますが、その場合ランダムなポートが選ばれます。
 - depends_on : サービス間の依存関係を指定します。今回はdyamodb-adminをdynamodb-localに依存させているので、起動順はdynamodb-local→dynamodbb-adminとなります。
 
詳しくはこちらを。
 👉【Docker公式ドキュメント】Compose ファイル・リファレンス
2-2. コンテナ起動
dockerがインストールされていれば、docker-composeもインストールされているはずですが、
 念の為下記コマンドで確認しましょう。
$ docker-compose -v
docker-compose version 1.27.4, build 40524192
確認できました。
 それでは下記コマンドでコンテナを起動します。
$ docker-compose up
Creating network "docker-trial_docker-network" with driver "bridge"
Creating dynamodb-trial ... done
Creating dynamodb-admin-trial ... done
Attaching to dynamodb-trial, dynamodb-admin-trial
dynamodb-trial    | Initializing DynamoDB Local with the following configuration:
dynamodb-trial    | Port:   8000
dynamodb-trial    | InMemory:   false
dynamodb-trial    | DbPath: /data
dynamodb-trial    | SharedDb:   true
dynamodb-trial    | shouldDelayTransientStatuses:   false
dynamodb-trial    | CorsParams: *
dynamodb-trial    |
dynamodb-admin-trial |   database endpoint:     dynamodb-local:8000
dynamodb-admin-trial |   region:        us-east-1
dynamodb-admin-trial |   accessKey:         key
dynamodb-admin-trial |
dynamodb-admin-trial |   dynamodb-admin listening on http://localhost:8001 (alternatively http://0.0.0.0:8001)
下記URLにアクセスします。
 http://localhost:8001
 
おめでとうございます🎉dynamodb-local, dynamodb-adminの起動成功です!
続いて、データ操作をしてみましょう。
3. DynamoDBのデータ操作
データ操作はdynamodb-adminで操作するのと、aws cliで操作する方法があります。
 ある程度データ量があるとGUIよりもCLIのほうが楽だったりするので、aws cliで操作する方法も少しご紹介したいと思います!
 以降、CLIとGUIでそれぞれの操作を解説していきます。
3-1. aws cliをインストール
まずはaws cliを使うための下準備です。
 (GUIでの操作だけに興味がある方は、読み飛ばして下さい。)
 pipコマンドでaws cliをインストールします。pipコマンドが入っているか確認しましょう。
$ pip --version
pip 10.0.1 from/Users/{username}/.pyenv/versions/3.6.6/lib/python3.6/site-package/pip (python 3.6)
pipコマンドがインストールされている事を確認出来ました。
 次は、aws cliをインストールしましょう。
$ pip install awscli
 ・・・
インストールが完了したら、下記コマンドで無事インストールされている事を確認します。
$ aws --version
aws-cli/1.18.219 Python/3.6.6 Darwin/20.2.0 botocore/1.19.59
無事、入っていますね。
3-2. テーブルを作成
①CLIで操作
下記コマンドで"Fruits"というテーブルを作成してみます。
 必ず--endpoint-url http://localhost:8000を指定して下さい。
 これを忘れると、AWS上のdynamodbにアクセスしてしまいます。
$ aws dynamodb create-table
--table-name Fruits
--attribute-definitions AttributeName=Id,AttributeType=N
--key-schema AttributeName=Id,KeyType=HASH
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
--endpoint-url http://localhost:8000
確認します。
$ aws dynamodb list-tables --endpoint-url http://localhost:8000
{
  "TableNames":[
      "Fruits"
  ]
}
dynamodb-adminでも確認してみます。
 
 Fruitsというテーブルが出来ていますね!
②GUIで操作
"Vegitables"というテーブルを作成してみます。
 「Create Table」ボタンを押下。
 
 必要情報を入力し、「Submit」ボタンを押下。
 
 Vegitablesというテーブルが出来ていますね!
3-3. DynamoDBにデータを登録
①CLIで操作
先ほど作成したFruitsテーブルにデータを登録してみましょう。
 この時も、--endpoint-url http://localhost:8000を忘れずに。
$ aws dynamodb put-item --table-name Fruits --item '{"Id":{"N":"1"},"Name":{"S":"Apple"}}' --endpoint-url http://localhost:8000
データを取得してみます。
$ aws dynamodb get-item --table-name Fruits --key '{"Id":{"N":"1"}}' --endpoint-url http://localhost:8000
{
    "Item": {
        "Id": {
            "N": "1"
        },
        "Name": {
            "S": "Apple"
        }
    }
}
データが登録出来ました!
②GUIで操作
先ほど作成したVegitablesテーブルにデータを登録してみましょう。
 Vegitablesテーブルを選択し、下記画面から「Create items」ボタンを押下します。
 
JSON形式でデータを設定します。
 "Name"項目に、"Broccoli"を設定し、「Save」ボタンを押下します。
 
4. まとめ
今回はdocker composerでdynamodb-local, dynaodb-adminの2つのコンテナを起動し、aws cli/GUIでテーブルを作成、データの登録までしてみました!
 いかがでしたでしょうか?
 この記事が少しでも読者の皆様のお役に立てましたら、幸いです。
 次回もまたAWS関連の記事を書く予定です。




