i-Vinci TechBlog
株式会社i-Vinciの技術ブログ

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が既にインストールされていること。

目次

  1. そもそもDynamaoDBとは?
  2. Docker composeでDynamoDB環境の作成
  3. DynamoDBのデータ操作

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

  • 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"
        }
    }
}

dynamodb-adminでも確認してみます。

データが登録出来ました!

②GUIで操作

先ほど作成したVegitablesテーブルにデータを登録してみましょう。

Vegitablesテーブルを選択し、下記画面から「Create items」ボタンを押下します。

JSON形式でデータを設定します。
"Name"項目に、"Broccoli"を設定し、「Save」ボタンを押下します。

データが登録出来ました!

4. まとめ

今回はdocker composerでdynamodb-local, dynaodb-adminの2つのコンテナを起動し、aws cli/GUIでテーブルを作成、データの登録までしてみました!

いかがでしたでしょうか?

この記事が少しでも読者の皆様のお役に立てましたら、幸いです。

次回もまたAWS関連の記事を書く予定です。