DynamoDB用NoSQL WorkbenchでDynamoDB Local (Localstack) に接続する

節約のためにDynamoDB Localを使っている身としては嬉しいニュースが飛び込んできた。

 

Amazon DynamoDB 用 NoSQL Workbench が、DynamoDB ローカルのサポートを追加

 

 

[DynamoDB用NoSQL Workbenchとは]

NoSQL WorkbenchはAWSから提供されているDynamoDBのためのツールであり、WindowsまたはMacで利用可能なデスクトップアプリケーションである。2019年11月現在はプレビュー版のみ公開されている。

 

公式の説明によれば次の通り。

NoSQL Workbench は、DynamoDB テーブルの設計、作成、クエリ、管理に役立つデータモデリング、データ可視化、クエリ開発機能を提供する統合可視化ツールです。

docs.aws.amazon.com

 

データ可視化の部分や基本的なデータの追加操作などは、マネジメントコンソールで利用できる内容とさほど変わりは無いように見えるが、データモデリングやクエリ開発の点ではマネジメントコンソールに無い機能が追加されている。

  • 既存のMySQLデータベースからSQLで直接データをインポートしてのデータモデリング
  • 作成したデータモデルをDynamoDBに反映する
  • DynamoDBのAPIパラメータを細かく設定してクエリなどを実行できる

 

詳細は公式ブログにゆずるとして……。

aws.amazon.com

 

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のフォルダにドラッグ&ドロップすればインストールは完了。

f:id:kidani_a:20191114031925p:plain

 

LanchPadからアプリケーションを起動する。

f:id:kidani_a:20191114032138p:plain

 

起動時にインターネットからダウンロードされたアプリであることの確認が入るので「開く」をクリックして先に進む。

f:id:kidani_a:20191114032214p:plain

 

起動直後の画面はこんな感じ。

f:id:kidani_a:20191114032316p:plain

 

この時、見逃しがちだが右上に次のようなポップアップが表示される。0.2.1をインストールしたが、新しいバージョンである0.3.0が出ているので自動的にダウンロードされる。

f:id:kidani_a:20191114032406p:plain

 

左側のメニューの一番下のアイコンをクリックし、Operation builderと書かれた画面を表示する。画面上部の「+ Add connection」というボタンをクリックすると、接続先のDBを追加する画面が開く。

この時点では古いバージョン(0.2.1)なので、AWSリージョンを選択し、アクセスキー情報を入力する画面しか表示されず、DynamoDB Localを利用することはできない。

f:id:kidani_a:20191114033005p:plain

 

アプリを一旦終了して再起動すると、バージョンが上がったためか、再度インターネットから取得したアプリであることの確認が入る。問答無用で「開く」を選択する。

f:id:kidani_a:20191114032717p:plain

メニューから「NoSQL Workbench for Amazon DynamoDB (Preview) > About NoSQL Workbench for Amazon DynamoDB (Preview)」を選択すると、バージョンを確認できる。無事に0.3.0に更新された。

f:id:kidani_a:20191114032819p:plain

 

[NoSQL WorkbenchからDynamoDB Localへ接続する]

改めて新規コネクションを追加するダイアログを開くと、次のように画面が変わっており、RemoteとDynamoDB Localのタブが表示されている。

f:id:kidani_a:20191114033527p:plain

 

DynamoDB Localのタブを選択すると、DB名とDynamoDB Localのポート番号を入力する欄が表示される。「connect」をクリックするとコネクションが追加される。

f:id:kidani_a:20191114034334p:plain


この時、DynamoDB Localへアクセスするアクセスキーは自動的に生成される。探したが既にDynamoDB Localで利用しているアクセスキーを設定して、既存のテーブルのデータを読み込む方法はないようだ。

 

自動生成されたアクセスキーを確認するには、Operation builderページのコネクション一覧から、該当のコネクションの3点リーダ風のボタンをクリックし、さらに表示されたメニューから「View credentials」をクリックする。

f:id:kidani_a:20191114035254p:plain

 

「View credentials」をクリックすると、本物のアクセスキーIDやシークレットアクセスキーよりだいぶ短いが、自動生成されたアクセスキーを知ることができる。AWS CLIAWS SDKを利用してNoSQL Workbenchで生成したテーブルにアクセスする際は、このアクセスキーを使えば良い。

f:id:kidani_a:20191114035713p:plain

 

あるいは、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の画面を開き、新規コネクションを追加する。

f:id:kidani_a:20191114042102p:plain

 

追加後のコネクション一覧。

f:id:kidani_a:20191114042149p:plain

 

試しにサンプルで登録されているモデルからテーブルを追加してみる。登録されている適当なモデルを選択し、Visualizerページの左のメニューから「Commit to DynamoDB」のボタンをクリックすると、コミット先のDynamoDBを選択することができる。登録済みのコネクションから選択するだけでなく、ここで新規に接続先を追加することもできるようだ。

f:id:kidani_a:20191114042333p:plain



先ほど追加した「localstack」コネクションを選択し、Commitボタンをクリックすると、テーブルやインデックス、データが無事追加された。

f:id:kidani_a:20191114042621p:plain

 

AWS CLIで確認しても同じデータをみることができた。

$ 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の拡大とか。期待!

*1:LocalstackはDynamoDB以外にも、SQSやLambdaなどAWSのかなりのサービスをローカルのマシン上で動作させることができる。