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関連の記事を書く予定です。