節約のためにDynamoDB Localを使っている身としては嬉しいニュースが飛び込んできた。
Amazon DynamoDB 用 NoSQL Workbench が、DynamoDB ローカルのサポートを追加
- [DynamoDB用NoSQL Workbenchとは]
- [NoSQL Workbenchのダウンロード]
- [NoSQL WorkbenchからDynamoDB Localへ接続する]
- [LocalstackとNoSQL Workbench]
- [まとめ]
[DynamoDB用NoSQL Workbenchとは]
NoSQL WorkbenchはAWSから提供されているDynamoDBのためのツールであり、WindowsまたはMacで利用可能なデスクトップアプリケーションである。2019年11月現在はプレビュー版のみ公開されている。
公式の説明によれば次の通り。
NoSQL Workbench は、DynamoDB テーブルの設計、作成、クエリ、管理に役立つデータモデリング、データ可視化、クエリ開発機能を提供する統合可視化ツールです。
データ可視化の部分や基本的なデータの追加操作などは、マネジメントコンソールで利用できる内容とさほど変わりは無いように見えるが、データモデリングやクエリ開発の点ではマネジメントコンソールに無い機能が追加されている。
- 既存のMySQLデータベースからSQLで直接データをインポートしてのデータモデリング
- 作成したデータモデルをDynamoDBに反映する
- DynamoDBのAPIパラメータを細かく設定してクエリなどを実行できる
詳細は公式ブログにゆずるとして……。
2019年9月にNoSQL Workbenchが発表された際は、DynamoDB Localに対応しておらず、一旦インストールはしたものの利用を見送っていた。今回のアナウンスにより、DynamoDB Localにも対応したらしいので、試してみることに。
Amazon DynamoDB 用 NoSQL Workbench が、DynamoDB ローカルのサポートを追加
[NoSQL Workbenchのダウンロード]
NoSQL Workbenchは、以下のページからダウンロードすることができる。ただし、日本語のページのリンクは2019年11月14日(に日付が変わった)時点では0.2.1のリンクになっているので若干注意が必要である。英語版のページは、最新の0.3.0のリンクとなっているので、こちらを利用すると良い。
NoSQL Workbench のダウンロード - Amazon DynamoDB
Download NoSQL Workbench - Amazon DynamoDB
0.2.1をダウンロードした場合でも、自動的にアップデートされるので心配はいらない。
Mac版の0.2.1をベースにインストール手順を見ていく。
ダウンロードしたdmgファイルをクリックすると、おなじみのダイアログが表示される。NoSQL WorkbenchのアイコンをApplicationsのフォルダにドラッグ&ドロップすればインストールは完了。
LanchPadからアプリケーションを起動する。
起動時にインターネットからダウンロードされたアプリであることの確認が入るので「開く」をクリックして先に進む。
起動直後の画面はこんな感じ。
この時、見逃しがちだが右上に次のようなポップアップが表示される。0.2.1をインストールしたが、新しいバージョンである0.3.0が出ているので自動的にダウンロードされる。
左側のメニューの一番下のアイコンをクリックし、Operation builderと書かれた画面を表示する。画面上部の「+ Add connection」というボタンをクリックすると、接続先のDBを追加する画面が開く。
この時点では古いバージョン(0.2.1)なので、AWSリージョンを選択し、アクセスキー情報を入力する画面しか表示されず、DynamoDB Localを利用することはできない。
アプリを一旦終了して再起動すると、バージョンが上がったためか、再度インターネットから取得したアプリであることの確認が入る。問答無用で「開く」を選択する。
メニューから「NoSQL Workbench for Amazon DynamoDB (Preview) > About NoSQL Workbench for Amazon DynamoDB (Preview)」を選択すると、バージョンを確認できる。無事に0.3.0に更新された。
[NoSQL WorkbenchからDynamoDB Localへ接続する]
改めて新規コネクションを追加するダイアログを開くと、次のように画面が変わっており、RemoteとDynamoDB Localのタブが表示されている。
DynamoDB Localのタブを選択すると、DB名とDynamoDB Localのポート番号を入力する欄が表示される。「connect」をクリックするとコネクションが追加される。
この時、DynamoDB Localへアクセスするアクセスキーは自動的に生成される。探したが既にDynamoDB Localで利用しているアクセスキーを設定して、既存のテーブルのデータを読み込む方法はないようだ。
自動生成されたアクセスキーを確認するには、Operation builderページのコネクション一覧から、該当のコネクションの3点リーダ風のボタンをクリックし、さらに表示されたメニューから「View credentials」をクリックする。
「View credentials」をクリックすると、本物のアクセスキーIDやシークレットアクセスキーよりだいぶ短いが、自動生成されたアクセスキーを知ることができる。AWS CLIやAWS SDKを利用してNoSQL Workbenchで生成したテーブルにアクセスする際は、このアクセスキーを使えば良い。
あるいは、DynamoDB Localを起動する際にSharedDBオプションを有効化していれば、アクセスキーを気にする必要はなくなる。SharedDBオプションについては以下のページに説明がある。
DynamoDB 使用に関する注意事項 - Amazon DynamoDB
- -sharedDb オプションを使用すると、DynamoDB は shared-local-instance.db という名前の単一のデータベースファイルを作成します。DynamoDB に接続するプログラムはいずれも、このファイルにアクセスします。このファイルを削除すると、保存されたすべてのデータを失うことになります。
- -sharedDb を省略する場合のデータベースファイルの名前は、myaccesskeyid_region.db で、アプリケーション設定に表示されるとおりの AWS アクセスキー ID と AWS リージョンが使用されます。このファイルを削除すると、保存されたすべてのデータを失うことになります。
[LocalstackとNoSQL Workbench]
ところで、公式のDynamoDB LocalのDockerイメージを利用して開発する場合、SharedDBオプションは以下のように無効となっている。
$ docker run -p 8000:8000 amazon/dynamodb-local Initializing DynamoDB Local with the following configuration: Port: 8000 InMemory: true DbPath: null SharedDb: false shouldDelayTransientStatuses: false CorsParams: *
一方、同じDockerを利用したDynamoDB Localでも最初からSharedDBオプションを有効にしてくれているのがLocalstackだ。
localstack/dynamodb_starter.py at v0.10.5 · localstack/localstack · GitHub
SharedDBオプションが便利なので、LocalstackとNoSQL Workbenchを組み合わせて使えるか試してみる。
Localstackのバージョンを確認すると少し古かったので、念の為バージョンアップしてから臨むことに。
$ localstack -v 0.8.7 $ pip install -U localstack Collecting localstack Downloading https://files.pythonhosted.org/packages/d7/18/2087323ed4aa0b75ad65bb647b9f2fe0ffb3522e8ae65b95221782a42f85/localstack-0.10.5.tar.gz (256kB) (中略) Successfully installed boto3-1.10.16 botocore-1.13.16 dnslib-0.9.10 localstack-0.10.5 localstack-client-0.15 localstack-ext-0.10.59 requests-2.22.0 six-1.13.0 subprocess32-3.5.4 $ localstack -v 0.10.5
最新バージョンのLocalstackを手に入れたので、DynamoDBに絞ってLocalstackを起動する*1。
$ SERVICES=dynamodb localstack start Starting local dev environment. CTRL-C to quit. docker run -it -e SERVICES="dynamodb" -e LOCALSTACK_HOSTNAME="localhost" -e DEFAULT_REGION="us-east-1" -e TEST_AWS_ACCOUNT_ID="000000000000" -e LOCALSTACK_HOSTNAME="localhost" --rm --privileged --name localstack_main -p 8080:8080 -p 8081:8081 -p 4569:4569 -v "/private/var/folders/02/w7f9tqb910g1tn5n3vp6qc1c0000gn/T/localstack:/tmp/localstack" -v "/var/run/docker.sock:/var/run/docker.sock" -e DOCKER_HOST="unix:///var/run/docker.sock" -e HOST_TMP_FOLDER="/private/var/folders/02/w7f9tqb910g1tn5n3vp6qc1c0000gn/T/localstack" "localstack/localstack" 2019-11-13 17:33:26,630 CRIT Supervisor running as root (no user in config file) 2019-11-13 17:33:26,635 INFO supervisord started with pid 1 2019-11-13 17:33:27,644 INFO spawned: 'dashboard' with pid 8 2019-11-13 17:33:27,647 INFO spawned: 'infra' with pid 9 (. .venv/bin/activate; exec bin/localstack start) (. .venv/bin/activate; bin/localstack web) 2019-11-13 17:33:28,662 INFO success: dashboard entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) 2019-11-13 17:33:28,664 INFO success: infra entered RUNNING state, process has stayed up for > than 1 seconds (startsecs) Starting local dev environment. CTRL-C to quit. 2019-11-13T17:33:28:INFO:werkzeug: * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit) 2019-11-13T17:33:28:INFO:werkzeug: * Restarting with stat 2019-11-13T17:33:29:WARNING:werkzeug: * Debugger is active! 2019-11-13T17:33:29:INFO:werkzeug: * Debugger PIN: 195-466-295 Starting mock DynamoDB (http port 4569)... Ready.
デフォルトだとLocalstackのDynamoDB Localは4569番ポートで待ち受けているので、NoSQL Workbenchの画面を開き、新規コネクションを追加する。
追加後のコネクション一覧。
試しにサンプルで登録されているモデルからテーブルを追加してみる。登録されている適当なモデルを選択し、Visualizerページの左のメニューから「Commit to DynamoDB」のボタンをクリックすると、コミット先のDynamoDBを選択することができる。登録済みのコネクションから選択するだけでなく、ここで新規に接続先を追加することもできるようだ。
先ほど追加した「localstack」コネクションを選択し、Commitボタンをクリックすると、テーブルやインデックス、データが無事追加された。
$ aws dynamodb --endpoint http://localhost:4569 scan --table-name Employee { "Count": 7, "Items": [ { "Skills": { "SS": [ "executive management" ] }, "LastName": { "S": "Stiles" }, "LoginAlias": { "S": "johns" }, "FirstName": { "S": "John" }, "ManagerLoginAlias": { "S": "NA" } }, (中略) ], "ScannedCount": 7, "ConsumedCapacity": null }
[まとめ]
- NoSQL Workbench for Amazon DynamoDB(プレビュー版)にDynamoDB Localサポートが追加された
- DynamoDB LocalをベースにしているLocalstackにも接続することができる
- DynamoDB LocalのSharedDBオプションを利用するとNoSQL Workbench以外からの接続が必要になった場合に便利
- SharedDBオプションはLocalstackの場合最初から有効なので公式Dockerイメージよりこちらが便利そう
もうすぐre:Inventが始まるからか、AWSのアップデートが激しさを増してきた気がする。DynamoDB本体も小さくていいから何かしらアップデートがあるといいな……CloudTrail対応APIの拡大とか。期待!