Amazon Web Services ブログ

DynamoDB Shell — Amazon DynamoDB のコマンドラインインターフェイスを使用してデータを取得する

(本記事は 2023/02/17に投稿された Query data with DynamoDB Shell – a command line interface for Amazon DynamoDB を翻訳した記事です。)

DynamoDB を初めて使用する人にとっては、習得に時間がかかる場合があるため、Amazon DynamoDB 用のオープンソースのコマンドラインインターフェイスである DynamoDB シェル (ddbsh) を開発しました。ddbsh の目的の 1 つは、DynamoDB を初めて使用するユーザーに、使い慣れた SQL のようなコマンドを実行することから始められる、シンプルで直感的な環境を提供することです。ddbsh のクエリ言語は SQL から派生したもので、DynamoDB 固有の拡張機能を備えています。

例えば、次のようなコマンドを実行して ddbsh を使用してテーブルを作成することができます

create table ddbsh_demo (id number) primary key (id hash);

Hello DynamoDB shell から ddbsh の概要を簡単に説明し、Getting started with dynamodb-shell からグローバルセカンダリインデックスの作成とクエリについてもう少し詳しく説明しています。ddbsh README.md ファイルには、詳細なコマンドの使用法と例を記載しています。

この記事では2つのトピックを取り上げています。最初に DynamoDB に接続し、それから DynamoDB ローカルに接続する方法を学習します。次に、SQL WHERE句を使用してデータをフィルタリングする方法を学習します。

始めるためには、Github 上の AWS Labs から ddbsh のソースコードをダウンロードし、手順に従ってビルドしてください。

AWSリージョンに接続する

ddbsh は AWS C++ SDK を使用しています。AWS コマンドラインインターフェイス (AWS CLI) のドキュメントに記載されているように、接続パラメータを設定することができます。詳しくは AWS CLI を設定する環境変数をご覧ください。

リージョンに接続するには

    1. AWS CLI 設定ファイル内に記載されるデフォルトのリージョン、 AWS アクセスキー、 AWS シークレットキーが適切であるかをまず確認します。設定ファイルの配置パスは、ご利用の OS によって異なる場合があります。確認方法については AWS CLI ドキュメンテーションを参照してください。また、リージョンの設定項目については、 DynamoDB ローカルDynamoDB (ウェブサービス) のドキュメンテーションも合わせて確認してください。設定ファイルは、直接ファイルを編集するほか、aws configureコマンドを使用する、環境変数を設定して DynamoDB への接続するといった方法も利用できます。
    2. AWS CLI を使用して DynamoDB に接続できるかどうかを確認してください。例えば、次のように実行できます。
      aws dynamodb list-tables
    3. エラーがあれば解決してください。上記のコマンドをエラーなく実行すると、次のインタラクティブセッションに示すように、デフォルトのリージョンに接続できます。
      % ddbsh
      ddbsh - version 0.2
      us-east-1>
    4. プロンプトではコマンドを実行することができます。コマンドのリストを表示するには、 HELP コマンドを実行してください。コマンドはセミコロン(;)で終了します。
      us-east-1> help;
      HELP - provide help in ddbsh
      
         HELP <keyword> [keyword [keyword ...]]
      […]

DynamoDB ローカルに接続する

このステップを開始する前に、ddbsh バージョン 0.2 以上、AWS SDK バージョン 1.11 以上であることを確認してください。

DynamoDB ローカルに接続するには

  1. コンピュータ上で DynamoDB をローカルでデプロイするに従ってインストールします。
  2. ターミナルセッションで、 DynamoDB ローカルインスタンスに接続する環境変数を設定します。
    % export AWS_ACCESS_KEY_ID="fakeMyKeyId"
    % export AWS_SECRET_ACCESS_KEY="fakeSecretAccessKey"
    % export AWS_DEFAULT_REGION="dynamodb-local"
    % export DDBSH_ENDPOINT_OVERRIDE="http://localhost:8000"
  3. 2番目のターミナルセッションを開き、 DynamoDB をローカルで起動します。
    % java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar
  4. 最初のターミナルセッションに戻ります。次のような AWS CLI コマンドを使用して、 DynamoDB ローカルに接続できます。
    % aws dynamodb  --endpoint-url http://localhost:8000  list-tables
    {
        "TableNames": []
    }
  5. これができれば、ddbshでローカルインスタンスに接続できます。
    % ddbsh
    ddbsh - version 0.2
    dynamodb-local (*)>

リージョン名の後の括弧 (*) 内のアスタリスクは、非標準のエンドポイントが使用されていることを示します。これで DynamoDB ローカルに接続されていることが分かります。 DynamoDB ローカルは開発およびテストで利用できますが、一部AWS上のリソースとは挙動が異なる場合があり、テストに応じて使い分けをしてください。詳しくは DynamoDB Local の使用に関する注意事項をご確認ください。

WHERE 句によるデータのフィルタリング

WHERE 句は SELECTUPDATEDELETEUPSERT と共に使用できます。WHERE 句には、論理和 ( AND ) と論理論理和 ( OR ) で結合できる複数の論理式を含めることができます。また、NOT 演算子を使用して論理式を否定することもできます。

次の論理表現がサポートされています。

  • attribute op valueという形式で op 値の論理比較ができます。attribute はテーブルの attribute を表し、op は <、>、<=、>=、=、または != が使用できます。
  • attribute_exists(attr)は、 Item に attribute が存在する場合、true と評価されます。
  • begins_with(attr, prefix)は、 attribute が prefix で始まる場合、true と評価されます。
  • attr between value and valueは、指定された 2 つの値の間に attribute がある場合に true と評価されます。
  • attribute_type (attr, type)は、 attribute が指定された type であれば true と評価されます。

次のサンプルデータを考えてみましょう。

dynamodb-local (*)> select * from exprtest;
{a: 2, b: 2}
{a: 1, b: 2}
{a: 3, b: cooperate}
{a: 5, c: coffee}
{a: 4, b: coffee}
dynamodb-local (*)>

クエリのサンプルは次のとおりです。

dynamodb-local (*)> select * from exprtest where a > 3 and a < 5;
{a: 4, b: coffee}

dynamodb-local (*)> select * from exprtest where a between 2 and 5;
{a: 2, b: 2}
{a: 3, b: cooperate}
{a: 5, c: coffee}
{a: 4, b: coffee}

dynamodb-local (*)> select * from exprtest where begins_with(b, "co");
{a: 3, b: cooperate}
{a: 4, b: coffee}

dynamodb-local (*)> select * from exprtest where attribute_exists(c);
{a: 5, c: coffee}

dynamodb-local (*)> select * from exprtest where attribute_exists(c) and a != 3;
{a: 5, c: coffee}

dynamodb-local (*)> select * from exprtest where attribute_exists(c) or a = 3;
{a: 3, b: cooperate}
{a: 5, c: coffee}

dynamodb-local (*)> select * from exprtest where attribute_type(b, string);
{a: 3, b: cooperate}
{a: 4, b: coffee}
dynamodb-local (*)>

括弧を使用して項目をグループ化することで、より複雑なクエリを作成できます。

dynamodb-local (*)> select * from exprtest where attribute_type(b, string) or ( a = 5 and c = "coffee");
{a: 3, b: cooperate}
{a: 5, c: coffee}
{a: 4, b: coffee}

EXPLAINコマンドを使用すると、 ddbsh がクエリを実行する方法を確認できます。

dynamodb-local (*)> explain select * from exprtest where attribute_type(b, string) or ( a = 5 and c = "coffee");
Scan({
   "TableName":   "exprtest",
   "ReturnConsumedCapacity":   "NONE",
   "FilterExpression":   "attribute_type(#apaa1, :vpaa1) OR (#apaa2 = :vpaa2 AND #apaa3 = :vpaa3)",
   "ExpressionAttributeNames":   {
      "#apaa1":   "b",
      "#apaa2":   "a",
      "#apaa3":   "c"
   },
   "ExpressionAttributeValues":   {
      ":vpaa1":   {
         "S":   "S"
      },
      ":vpaa2":   {
         "N":   "5"
      },
      ":vpaa3":   {
         "S":   "coffee"
      }
   },
   "ConsistentRead":   false
})
dynamodb-local (*)>

WHERE 句は UPDATE でも使用できます。

dynamodb-local (*)> help update;
UPDATE - Update items in a table

   UPDATE <name> SET <update_set> [where clause]

   UPDATE <name> REMOVE <remove list> [where clause]

dynamodb-local (*)>

dynamodb-local (*)> update exprtest set b = 15 where a = 5;
UPDATE (0 read, 1 modified, 0 ccf)
dynamodb-local (*)> select * from exprtest where a = 5;
{a: 5, b: 15, c: coffee}
dynamodb-local (*)>

attribute は削除できます。次の例では、attribute c を削除します。

dynamodb-local (*)> update exprtest remove c where a = 5; 
UPDATE (0 read, 1 modified, 0 ccf)
dynamodb-local (*)> select * from exprtest where a = 5;
{a: 5, b: 15}
dynamodb-local (*)>

クリーンナップ

検証が完了したら、コストが発生しないように、作成した可能性のあるテーブルをすべて削除することを忘れないでください。そのためには ddbshDROP TABLE を使うことができます。 DynamoDB ローカルを停止するには、起動したターミナル (2 番目のセッション) に移動し、 Ctrl-C でシャットダウンします。

まとめ

これで完了です。 ddbsh では、標準 SQL と同じように、  WHERE 句を使用して処理の対象となる項目を絞り込み、テーブルのデータの読み込み、変更、削除することができます。

導入を検討されているお客様から、 DynamoDB API の学習に役立つリソースを求めていると聞いています。 ddbsh の  EXPLAIN コマンドなど、いくつかの解決策を試しています。このツールに関するフィードバックをいただければ幸いです。 DynamoDB を使いやすくするために、 ddbsh に追加できるものはあるでしょうか?

ddbsh に実装してほしい特定の機能や機能がある場合は、サポートチケットを入力するか、amrithie (at) amazon (dot) comに直接メールでお知らせください。具体的には、ユーザーが ddbsh をインストールして使用しやすくする機能など(パッケージングスクリプトの提供など)、プルリクエストしていただける方を歓迎します。既に Homebrew のプルリクエストを頂いています。その他のプルリクエストについても、お気軽に amrithie (at) amazon (dot) com まで直接お問い合わせください。

皆様へ最後のお願いです。 MacOS で ddbsh をインストールするための Homebrew ソリューションをご希望の場合は、 ddbsh の GitHub リポジトリを fork し、スターをつけてウォッチしていただくことで私たちをサポートしてください。 Homebrew リポジトリへのプルリクエストは頂いていますが、 ddbsh の GitHub リポジトリがまだ十分に知られていないため、リクエストは現在ブロックされています。このリクエストを前進させるお手伝いをしていただければと思います。

作者情報

Amrith Kumar はアマゾンウェブサービスのシニアプリンシパルエンジニアとして活動し、 Amazon DynamoDB に従事しています。