はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須DynamoDB でテーブルを作成し、項目を出し入れした経験
- あると良い「主キー」という言葉のイメージ
※ コマンドラインや SSH などの操作は一切ありません。すべてブラウザのコンソール上で完結します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
「あるユーザーの注文を全部見たい」というように、1つのキーに対して複数のデータがぶら下がる場面はよくあります。DynamoDB では、パーティションキー(グループを決めるキー)に加えて「ソートキー」(そのグループの中での並び順・絞り込みを決めるキー)を組み合わせた複合キーを使うことで、こうした構造を表現できます。
今回は、1人のユーザーが複数件の注文を持つというデータを実際に登録し、Query 操作を使って「あるユーザーの注文だけ」を効率よく取り出す体験をします。
ソートキーを使わずに、ユーザーIDだけをキーにしてもいいのでは?
パーティションキーだけだと、同じユーザーIDの項目は1件しか持てません(同じキーの項目は上書きされてしまいます)。1人のユーザーが複数件の注文を持てるようにするには、注文ごとに違う値になるソートキー(例:注文日時)が必要です。
Query と Scan は何が違うの?
Query はパーティションキー(と必要に応じてソートキーの条件)を指定して、該当する項目だけを効率よく取得します。Scan はテーブル全体を読み込んでから絞り込むため、テーブルが大きくなるほど時間も読み込み量(コスト)も増えます。特定のキーで絞り込めるときは Query を使うのが基本です。
パーティションキー+ソートキーの複合キーを持つテーブルを作り、1人のユーザーに対して複数件の注文データを登録したあと、Query 操作でそのユーザーの注文だけを取得できる状態にする。
つくる構成
テーブルのキー設計と、絞り込みに使う2つの操作の違いをイメージで確認しておきましょう。
入力例
Query
パーティションキーを指定して絞り込む。必要に応じてソートキーの条件も加えられる。該当する項目だけを効率よく読み込む。
Scan
テーブル全体を読んでから絞り込む。テーブルが大きくなるほど時間も読み込み量も増えていく。
要件
以下の要件を満たし、複合キーを使った Query 操作の絞り込みを確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | パーティションキー(例:UserId、文字列)とソートキー(例:OrderDate、文字列)を持つテーブルを1つ作成する(テーブル名は自由、例:Orders)。 |
| 3 | 同じ UserId の値を持ち、OrderDate の値が異なる注文項目を3〜4件登録する(自由な属性、例:商品名、金額を添える)。別の UserId の項目も1〜2件登録する。 |
| 4 | 「項目を探索」の Query 機能で、特定の UserId を指定し、そのユーザーの注文だけが取得できることを確認する。 |
| 5 | ソートキーの条件(例:「より大きい」「の間」などの比較演算子)を追加し、絞り込みがさらに効くことを確認する。 |
構築の進め方
「複合キーのテーブルを作る → データを登録する → Query で絞り込む」という順番で進みます。
-
マネジメントコンソールにサインインし、リージョンを東京に合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
DynamoDB コンソールで「テーブルを作成」を開き、パーティションキーとソートキーを設定する
DynamoDB コンソールの「テーブルを作成」画面で、パーティションキーとソートキーをそれぞれ自由に決めます(例:
UserId/OrderDate、両方とも文字列)。入力例
パーティションキーUserId(文字列)ソートキーOrderDate(文字列)ソートキーは「追加項目」として設定するテーブル作成画面では、パーティションキーの入力欄の下に「並べ替えキーを追加」のような項目があります。ここでソートキーの名前と型を指定します。
-
テーブル名を決めて作成する
テーブル名を自由に決めて(例:
Orders)、テーブルを作成します。作成が完了するまで少し待ちます。 -
「項目を作成」から、同じ UserId・異なる OrderDate を持つ項目を3〜4件登録する
テーブルの「項目を探索」画面から「項目を作成」を選び、同じ
UserIdの値で、OrderDateの値だけを変えた項目を3〜4件作成します。商品名や金額など、自由な属性を追加してもかまいません。 -
比較用に、別の UserId を持つ項目も1〜2件登録する
後で Query の絞り込み効果を確認しやすくするため、異なる
UserIdを持つ項目も1〜2件追加しておきます。 -
「項目を探索」のクエリ機能に切り替え、特定の UserId で実行する
「項目を探索」画面の操作モードを「クエリ」に切り替え、パーティションキーの欄に手順4で使った特定の
UserIdの値を入力して実行します。そのユーザーの項目だけが返ってくることを確認しましょう。モードの切り替えを忘れずに「スキャン」モードのままだとテーブル全体が読み込まれてしまいます。クエリモードになっているかを確認してから実行しましょう。
-
ソートキーの条件(比較演算子)を追加して再度実行する
クエリの条件に、ソートキー(
OrderDate)に対する比較演算子(例:「より大きい」「の間」など)を追加し、再度実行します。結果がさらに絞り込まれることを確認します。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「期待した件数と違う結果になる」
パーティションキーに入力した値が、実際に登録した値と完全に一致しているか見直してみましょう。また、「項目を探索」画面の操作モードがクエリになっているか、スキャンのままになっていないかも確認してみましょう。
「項目数が思ったより少ない」
複合キーのテーブルでは、パーティションキーとソートキーの組み合わせでテーブル全体の一意性が決まります。同じ組み合わせの項目を登録しようとすると、新しい内容で上書きされてしまいます。各項目のソートキーの値が、本当にすべて異なっているかを見直してみましょう。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。DynamoDB コンソールを開いて、次を順に確かめましょう。
- テーブルの詳細画面で、キースキーマにパーティションキーとソートキーの両方が表示されている。
- 「項目を探索」の一覧で、登録した項目数が想定どおりになっている。
- 特定の
UserIdで Query を実行した結果の件数が、そのユーザーに登録した項目数と一致している。 - ソートキーの条件(比較演算子)を追加すると、結果件数がさらに減っている。
- 同じ条件でスキャンを行った場合と比べて、Query の結果件数の違い(絞り込みの効き方の違い)が確認できる。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- ソートキーに「日時」を使うと、結果はどんな順番で返ってきそうでしょうか。
ヒント
ソートキーは、その名のとおりパーティション内での並び順を決める役割を持っています。文字列や数値としての大小関係が、結果の並び順にどう反映されそうか考えてみましょう。 - パーティションキーの値の種類(ユーザー数)が少なく、1つのパーティションキーに項目が極端に集中すると何が起きそうでしょうか。
ヒント
DynamoDB は内部的にパーティションキーの値を使ってデータを分散して保存しています。特定の値に項目が集中すると、その一部分だけに負荷が偏ってしまう可能性があります。 - 「あるユーザーの、ある日付以降の注文だけ」を取得したい場合、ソートキーの条件をどう指定すればよさそうでしょうか。
ヒント
パーティションキーで対象のユーザーを絞り込んだうえで、ソートキーに対してどの比較演算子を組み合わせれば「その日付以降」を表現できるか、今回試した条件を振り返ってみましょう。
後片づけ
作成したテーブルを削除して片づけましょう。
- 作成したテーブルを削除する:DynamoDB コンソールの「テーブル」一覧から、今回作成したテーブル(手順3で付けた名前、例:
Orders)を選び、削除する。
削除するのは、このハンズオンで自分が作ったものだけ
テーブルの一覧には、すでに別の用途で使っているテーブルが並んでいるかもしれません。間違えて削除しないよう、このハンズオンのために付けた名前のものだけを選んで削除してください。
コストに関する注意: DynamoDB はオンデマンドモードであれば使った分だけの課金で、今回程度の少量の読み書きは無料利用枠の範囲内に収まることが多いです。ただし、テーブルを削除せず放置すると、保存容量に応じた料金がわずかに発生し続ける点に注意してください。後片づけを忘れないようにしましょう。