🐥

開発用にDynamoDB Shell / PartiQL を試す

2023/06/23に公開

概要

以前から、主に開発時ですが、サクッとDynamoDBのレコードをチェックしたい、値を変更したいという時に、既存のツールでの作業に煩わしさを感じていたところ

AWSブログの以下の記事が目に止まり
DynamoDB Shell — Amazon DynamoDB のコマンドラインインターフェイスを使用してデータを取得する

SQLライクにDynamoDBが操作できるという、CLIツール DynamoDB Shellを試してみました。
また記述中にPartiQLもあったことを思い出したので、せっかくなのでこちらも試してみました。

本記事では

  • 注意事項
  • これまで使っていたツール
  • DynamoDB Shellの紹介
  • PartiQLの紹介

を順に記載していきます。

注意事項

DynamoDBを使用する際、私が主に利用する開発言語はNode.js、たまにPythonです。
主にLambdaで何か作るときに利用しています。
また、DynamoDBで大量レコードを扱ったことがあまりないため(肝心な観点がなくて申し訳ない)
その点考慮漏れがあるかもしれませんが、ご注意ください。
開発環境限定、あるいはだいたい1回のScanに収まる程度の規模の話とお考えください

補足1

1 回の Scan リクエストで、最大 1 MB のデータを取得できます
DynamoDB でのスキャンの使用

補足2
はじめ気が付かなかったですが、DynamoDB ShellのReadme.md にはしっかり以下のように書いてありました。本番での利用は避けましょう。

WARNING ddbsh is provided for your use on an AS-IS basis, is not supported for production use cases, and should only be used for non-production and experimental use cases.

もし、他に便利なツールや手法をご存知な方、大規模レコードを扱っている方の視点での指摘がございましたら、気軽にコメントください。

これまで使っていたツール

  • AWS CLI
    コマンドを作るのが複雑で面倒です。
    RDBのように、さっとSQLを書いて実行できる気がしません。
    私が不慣れなこともありますが、割と構文を忘れたり間違えたりで時間がかかります。
    普段まず使いません。
aws dynamodb scan \
  --table-name hogeTable \
  --filter-expression "attribute_name = :attributeValue" \
  --expression-attribute-values '{":attributeValue":{"S":"your_attribute_value"}}'
  • AWS Console
    みなさん使ったことがあるとは思いますが、開発用の件数が少ないテーブルならかなり使えます。値の書き換えや並び替えも直感的です。
    ただ、普段コンソールにログインしないので、思い立ったときに2段階認証を逐一するのが煩わしいです。
    (認証コードを取得するため携帯を開いたり、そもそもブラウザを開くと目に入る通知やニュースが気になって、作業が中断することが多々あります。。。)

  • NoSQL Workbench
    インストールして使うGUIツールです。Operation Builderが今回の用途で使う機能ですが、データモデリングツールなども同梱されています。
    だいたいコンソールと同じですが、一覧画面から値を書き換えることができません。
    ScanItem,GetItem,UpdateItem...とコマンドを切り替えるたびに画面も切り替わってしまうのも使いづらいです。ブラウザだと複数Window開いて、交互に使えば済みますが、これはそうもいきません。
    NoSQL Workbench Download

  • 開発中のコードを流用した自前のスクリプト
    結局、普段よく使うのが、開発中のコードに手を入れたスクリプトで、これをterminalから実行しています。
    CLIも似たようなものですが、開発中のものが流用できるため負担が少ないです。

現状は、一覧表示したいときにコンソールやWorkBenchを使い、だいたいは自前のスクリプトで済ませることが多いです。

DynamoDB Shellを試す

ここからは、DynamoDB Shellを試します。使い始めるのは非常に簡単です。

基本となる資料は以下になります。
Github

インストール

開発環境はMacなのでbrewでinstallしました。

brew tap aws/tap
brew install aws-ddbsh

接続

% ddbsh
ddbsh - version 0.5.1
us-east-1> 

region変更

~/.aws/config の設定は間違っていないはずなのですが反映されず
以下のように手動で切り換えます。

us-east-1> connect ap-northeast-1;

SELECT

DynamoDBでの操作の置き換えが目的なので単純なSQLのみ試しています。
単純なwhere句であれば、スタンダードナSQLを書くように記述できます。

ただし、limit や ソート(order by) はできないようです。
これは困りますね。。。

explain を文頭につけると、実際に実行した場合に使われるDynamoDBのコマンドを表示してくれるのが便利です。
これでGetItem、Query、Scanのいずれが使われるか事前に確認できるわけですね。

explain select * from tablename.indexname where keyname="keyvalue";

上記のように table名.index名とすると 指定したindexを使って検索しくれます。
(ScanでなくGetItemやQueryになる)

特にGSIを使う場合は、明示的に指定が必要です。

UPDATE/INSERT/DELETE

こちらも基本的な構文は使えそうです。

select 同様 explain を文頭につけると、explain無しで実行した場合に使われるDynamoDBのコマンドを表示してくれます。
DeleteはDeleteItemで1件ずつ削除するので、絞り込みをしそびれるとexplainで大量のDeleteItemが表示されます。

PartiQL

PublicKeyの記事を引用するとAWSがオープンソースとして公開している言語で

SQL互換の構文に最小限の拡張を施すことで、リレーショナル形式のデータベースだけでなく、
KVSやJSONなどを含むNoSQLデータベースやCSVファイルなど、
さまざまなデータソースに対して横断的に検索できる問い合わせ言語およびそのリファレンス実装です

AWS、SQL互換の新問い合わせ言語「PartiQL」をオープンソースで公開。RDB、KVS、JSON、CSVなどをまとめて検索可能

利用するためにパッケージのインストールなどセットアップは必要なく、コンソール、NoSQL Workbench、CLIで、ほぼそのまま実行可能です。

SELECT

今回はCLIから実行します。
PartiQLもDynamoDBのコマンドを置き換える程度のクエリなら直感的に書けそうです。
特に独自な構文はありません。

aws dynamodb execute-statement \
--statement "SELECT id, createdAt FROM hogeTable where id='hogeId'"

ただしlimitは使えません。。。

sortは可能ですが、プライマリーキーで絞り込み、 Ordeb By句でパーティションキーかソートキーを指定します。GSIを使う場合は テーブル名だけでなく "table名.index名" のような形でindex名を加えてSQLを書く必要があります。

INSERT

SQLとは構文が若干異なります。
言葉で説明するより例をみていただいたほうが早いです。
慣れれば問題なさそうです。

aws dynamodb execute-statement \
--statement "INSERT INTO hogeTable value {'id':'hogeId4', 'createdAt':1684496889 }" 

UPDATE

updateも同様です。
なおカラム型がドキュメント型の場合も問題なく対応できます。

aws dynamodb execute-statement \
--statement "UPDATE hogeTable set col={'hoge': 'fuga'}  where id='id123' "

DELETE

こちらもほぼそのままです。

aws dynamodb execute-statement \
--statement "delete FROM hogeTable where id='hogeId4' "

まとめ

limitやソートができなかったり、一手間かかるのは難があります。
ただ、CLIに比べ、コマンド実行のハードルがだいぶ低くなるは利点です。
完全に既存の方法を置き換えるほどではないですが、使い所によっては便利な気はしています。
2〜3ヶ月経ってまだ使っているかは怪しい気もしますが。

Discussion