Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
105
Help us understand the problem. What are the problem?

posted at

updated at

DynamoDB Localの導入

まえがき

別記事でaws-sam-initを導入して、サーバーレスアプリケーションの開発を便利に進めることができるようになったが、やはりサーバーレスならDBとしてはDynamoDBが相性が良く、組み合わせて使いたい。
とはいえ、RDBのOracleDBやPostgreSQLと違って、DynamoDBってAWS固有のプロダクトだからローカルで試せないよね・・・どうせ安いし本物のDynamoDB使っても良いけど、なんだかなぁ・・・開発だし・・・
はい。天下のAWSさんはローカルで動かせるDynamoDBちゃんを公開してくれています。是非、使わせてもらいましょう。

※追記: 2020年のAWS DevDayにてDynamoDBに関する講演を行う機会がありました。貴重な機会を頂きありがとうございました。
    その際にDynamoDB Localについても言及しています。参考程度に併せてご覧ください。

前提

下記の公式の手順をベースに、Dockerを使ってDynamoDB Localをインストール/実行させるまでの手順を示す。
DynamoDB ローカル (ダウンロード可能バージョン) のセットアップ

また、DynamoDB Localの簡単な管理のためにGUIも導入する。

本手順の実行環境: Ubuntu 18.04 LTS

DynamoDB Localのdockerイメージを取得

下記のdockerイメージが、Amazonが公開している正式なDynamoDB Localになるので、これを使う。

amazon/dynamodb-local
DynamoDB local
DynamoDB local is a downloadable version of DynamoDB that enables developers to develop and test applications > using a version of DynamoDB running in your own development environment.

※もしそもそもdockerをインストールできていないのであれば、こちらを参考にどうぞ

$ docker pull amazon/dynamodb-local
$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
lambci/lambda           python3.6           4a6785b2780d        5 weeks ago         1.07GB
amazon/dynamodb-local   latest              26ea09a4a680        4 months ago        446MB

DynamoDB Localの起動

DBなので裏でずっと起動しておいて欲しいので、-dを使ってバックグラウンド実行させる。
また、-sharedDbも指定して、どこからつなげようと単一のDBファイルが使われるようにする。
-inMemoryというオプションもあり、これを使うとデータを保存しない(メモリ内で完結)動作になる。
つまりデータを揮発性なものにしたいのであれば有効なのだが、コンテナそのものが停止すればどうせデータは消失するので指定不要。
データの永続化する方法については後述する。

$ docker run -d -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE                   COMMAND                                             CREATED              STATUS              PORTS                    NAMES
1fc4f480133f130913066fac050e718ceab3a52756496f145b5132dc44c50326   amazon/dynamodb-local   "java -jar DynamoDBLocal.jar -inMemory -sharedDb"   About a minute ago   Up About a minute   0.0.0.0:8000->8000/tcp   suspicious_easley

DynamoDB Localは結構お利口さんである。
デフォルト状態では、本物のDynamoDBと同じように認証情報やリージョンによって、別々のDBファイルを作成する。
そのため、テーブルを作ったはずが他のアプリからはそのテーブルが見えない、といった事象が起こりうる。(各種情報を揃えれば良いだけだが)
というわけで開発段階では、面倒くささを減らすために-sharedDbを使ったほうが何かと便利だと思う。

-sharedDb — -sharedDb を指定した場合、DynamoDB では、認証情報やリージョンごとに別のファイルを使用せずに、単一のデータベースファイルを使用します。
DynamoDB 使用に関する注意事項:コマンドラインオプション

また、使い終わってコンテナを止めたいときは、docker stop [container_id] を実行

データの永続化

DynamoDB Localはコンテナなので保存してあるデータは揮発する。普段の開発シーンや検証シーンではそれで構わないことが多い。
ただし何か理由があってデータを永続化したい場合は、-vでホスト側をマウントさせつつ、cmdとして-dbPath [/path/to/db]をわたすと良い。

$ docker run -d \
> -p 8000:8000 \
> -v `pwd`/db:/home/dynamodblocal/db \  <-- コレ
> amazon/dynamodb-local:latest \
> -jar DynamoDBLocal.jar \
> -sharedDb \
> -dbPath /home/dynamodblocal/db        <-- コレ

この場合、/home/dynamodblocal/shared-local-instance.dbを外に出してあげる形になる。ただし、/home/dynamodblocalをそのままマウントすると問題がある。DynamoDBLocal.jarが存在しないことになってしまう。そのため"-dbPath"でDB保存先を切り替えてあげると、うまくマウントおよびdbファイルの外だしができる。

GUIの導入

DynamoDB Localでは、AWSにあるパブリックのDynamoDBとは異なり、GUIが存在しない。
もちろんコマンドやアプリからなら問題なく操作は可能だが、ちょっと面倒くさいよね・・・ということで、OSSでGUIを作ってくれている人がいるので、ありがたく使わせてもらう。

dynamodb-admin
GUI for DynamoDB Local or dynalite.

準備

nodejsとnpmの導入

dynamodb-adminは、nodejsで動いている。
そのため、nodejsとパッケージ管理ツールのnpmをインストールしておく必要がある。

$ apt update
$ apt install nodejs npm
$ nodejs -v
v8.10.0
$ npm -v
3.5.2

dynamodb-adminのインストール

$ npm install dynamodb-admin -g
$ export DYNAMO_ENDPOINT=http://localhost:8000

実行

$ dynamodb-admin

※プロンプトが戻ってこなくなるので、&を付けてバックグラウンド実行させるか、screenを使って別セッションで実行させるような形のほうが良いと思う

確認

Webブラウザからhttp://localhost:8001にアクセスして、下記のような画面が確認できればOK
あとは、テーブルを作ったり、アイテムを作ったりして、アプリ側からも取得などできれば問題なし。※別記事で書くと思う

2019-01-16-14-51-31.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
105
Help us understand the problem. What are the problem?