Amazon Web Services ブログ
Amazon DynamoDB の使用開始
Amazon DynamoDB は、任意の規模で 1 桁のミリ秒のパフォーマンスを実現するために構築されたキーと値およびドキュメントデータベースです。これは、マルチリージョンでマルチマスターのフルマネージドデータベースで、組み込みのセキュリティ、バックアップとリストア、およびインターネット規模のアプリケーション用のメモリ内キャッシュを備えています。
この記事では、開始するために知っておく必要がある基本的な事項を確認します。テーブルを作成し、DynamoDB テーブルを設計するときの主な考慮事項について学習します。次に、いくつかのサンプル項目を挿入し、最後にそれらをクエリします。サンプル項目は実際の例で、AWS のオープンデータのレジストリからの Amazon Customer Reviews Dataset です。このガイドでは、データセットのビジネス要件および技術要件が DynamoDB 設計にどのように通知されるかについて説明します。この記事は読者に前提知識がないことを想定しています。
まず、ユースケースを分析しましょう。この記事のこのデータセットは、1 日数百万人のユーザーにサービスを提供している e コマースウェブサイトの本番レビューを表しています。特定の製品のレビューにすばやくアクセスし、投稿したすべてのレビューをユーザーが見られるようにしたい場合があるでしょう。
これらの条件は両方とも、大規模なデータセットへの高速アクセスを必要とします。DynamoDB は、それに対する完璧なソリューションです。
テーブルの作成
最初のステップは、テーブルを作成することです。
- 以下のスクリーンショットのプレビューに示すように、AWS マネジメントコンソール のサービスの検索で、DynamoDB を入力して選択します。
- 以下の画像に示すように、[テーブルの作成] を選択します。
- テーブル名 には、
product_reviews
などの名前を入力します。ここで、重要な決定を行います。DynamoDB は、キーを使用して、複数のインスタンスにデータを整理および配布します。キータイプには、次の 2 つの基本的なタイプがあります。
– パーティションキー – これは、DynamoDB が内部ハッシュ関数に使用して、保存するアイテムの物理的な保存場所を決定する値です。
– ソートキー – これは、一致するパーティションキーを持つアイテムをソートするために使用します。複数の値を連結して、複合ソートキーを作成できます。ホットキーを回避するために、データが可能な限り均等に分散されるパーティションキーを選択します。パーティションキーの設計とホットキーの回避の詳細については、ドキュメントの「ワークロードを均等に分散するためのパーティションキーの設計」を参照してください。DynamoDB でさらに読み取りを行い、hash と ranges キーを参照する場合、これらはパーティションキーおよびソートキーの以前の用語です。
DynamoDB テーブルには、テーブル内の各アイテムを一意に識別するプライマリキーが必要です。プライマリキー には以下の 2 つのタイプがあります。
– シンプルキー – これはそれ自体がパーティションキーです。
– 複合キー – これはパーティションキーおよびソートキーです。いずれを選択する場合でも、保存する各アイテムには一意のプライマリキーが必要です。ここで、データセットとプライマリユースケースが、先ほどレイアウトしたプライマリキーコンセプトにどのようにマッピングされるかを考えてみましょう。このテーブルの主な用途は、すべての顧客レビューを維持することです。最も一般的なアクセスパターンは、単一の製品のすべてのレビューを取得することです。
製品の一連のレビューを取得するには、最初に製品に移動します。
product_id
が必要です。これは、そのキーに基づいてレビューをクエリすることを示します。第二に、レビューセクションに移動するとき、review_date
で降順でソートすると便利です。このデータセットの各アイテムには、
customer_id
、review_id
、product_id
、review_date
、およびreview_body
が含まれています。プライマリキーの競合がないことを確認するには、一意のプライマリキーが必要です。
review_id
を含む複合ソートキーを使用します。これを実現するには、パーティションキーを
product_id
に、複合ソートキーをreview_date
およびreview_id
にしてテーブルを作成します。一意性を確保するために、任意の GUID を連結できます。 - パーティションキーには、
product_id
を入力します。 - [ソートキーの追加] チェックボックスを選択します。
- ソートキーには、
review_date-review_id
と入力します。
次のスクリーンショットは、手順 3〜6 を示しています。
ここで、1 つの製品のレビューをクエリする方法があります。このデータセットに対して実行できるセカンダリクエリについて考えてみましょう。一人の顧客のすべてのレビューを検索したり、顧客が気に入った関連製品を確認したい場合があるかもしれません。DynamoDB は、非正規化されたテーブル設計で最適に機能します。テーブルの非正規化により、複数のさまざまなアクセスパターンを最適化することにより、データへの高速アクセスが可能になります。特定の製品のレビューをクエリするのと同じように、アプリケーションによっては、さまざまなクエリ条件を使用してクエリを実行する必要がある場合があります。たとえば、特定の顧客によるレビューを検索する場合です。これを実現するには、グローバルセカンダリインデックス (GSI) を作成します。 詳細については、「グローバルセカンダリインデックス」を参照してください。GSI には、パーティションキーの
customer_id
とソートキーのreview_id
があります。オプションで、日付でリストを事前にソートするには、複合ソートキーと
review_date
が使えるかもしれません。
- テーブル設定で、[デフォルト設定の使用] チェックボックスをオフにします。
- セカンダリインデックスで、[インデックスの追加] を選択します。
- [インデックスの追加] ポップアップで、パーティションキーに
customer_id
を入力します。 - [ソートキーの追加] チェックボックスを選択します。
review_date
と入力します。- インデックス名と予測属性はそのままにします。
- [インデックスの追加] を選択します。
次のスクリーンショットは、手順 9〜13 を示しています。
次のステップでは、テーブルのキャパシティーをプロビジョニングします。2 つのオプションがあります。オンデマンドでは、リクエストごとに支払うことができ、読み取りまたは書き込みのキャパシティーユニットを指定しません。これは、未知のワークロード、予測不可能なアプリケーショントラフィックがあるテーブル、またはリクエストごとの支払いモデルの使いやすさを好む場合に役立ちます。[プロビジョンド] では、読み取りおよび書き込みキャパシティーユニットと Auto Scaling しきい値を指定できます。
- 読み取り/書き込みキャパシティーモードで、[プロビジョンド] チェックボックスを選択します。
- プロビジョンドキャパシティーで、読み取りキャパシティーユニットと書き込みキャパシティーユニットに 5 を入力します。
- Auto Scaling で、読み取りキャパシティーと書き込みキャパシティーチェックボックスの選択を解除します。
次のスクリーンショットは、手順 14〜16 を示しています。
DynamoDB はすべてのデータを透過的に暗号化し、次の 3 つの暗号化モードを用意しています。
– AWS 所有 CMK – DynamoDB はキーを所有します (追加料金なし)。これはデフォルトの暗号化タイプです。
– AWS 管理型 CMK – AWS KMS は、アカウントに保存されているキーを管理します (KMS 料金が適用されます)。
– カスタマー管理型 CMK – キーはアカウントに保存され、お客様がキーを作成、所有、管理します。CMK を完全に制御できます (AWS KMS 料金が適用されます)。この記事ではデフォルト設定を使用します。
- 以下のスクリーンショットのプレビューに示すように、保管時の暗号化で [DEFAULT] チェックボックスを選択します。
- 以下のスクリーンショットに示すように、[作成] を選択します。
数分間、テーブルが作成されました
のメッセージが表示されます。テーブルの作成が完了したら、データセットからレビューを挿入できます。
新しいテーブルにアイテムを追加する
次に、サーバーレスアプリケーションリポジトリの Lambda 関数を使用してレビューを一括挿入します。これはカスタムコードですが、e コマースウェブサイトに使用できる API エンドポイントと考えることができます。
- Lambda コンソールに移動します。
- [関数の作成] をクリックします。下のスクリーンショットとは少し異なるページに移動した可能性があります。[関数の作成] が表示されない場合は、サイドバーの [関数] をクリックします。
- [サーバーレスアプリケーションリポジトリの参照] を選択します。
- 検索ボックスに
getting-started-with-dynamodb-reviews-inserter
を入力します。 - [カスタム IAM ロールまたはリソースポリシーを作成するアプリを表示] チェックボックスをオンにします。
- getting-started-with-dynamodb-reviews-inserter をクリックします。
次のスクリーンショットは、手順 3〜6 を示しています。
- DynamodbDBTableName に
product_reviews
を入力します。これは、テーブルの作成セクションのステップ 3 でテーブルに付けた名前と一致する必要があります。 - [このアプリがカスタム IAM ロールを作成することを確認します] を選択します。
- [デプロイ] をクリックします。
次のスクリーンショットは、手順 7〜9 を示しています。
- 次の画面に、アプリケーションがデプロイされましたのメッセージが表示されます。アプリケーションがデプロイされるのを待ちます。
- 緑色のボックスにアプリケーションがデプロイされましたと表示されたら、下のスクリーンショットに示すように [ReviewInserter] をクリックします。これにより、デプロイされた Lambda 関数にリダイレクトされます。
- 関数コードセクションまでスクロールし、左側のファイルナビゲーターで reviews.json ファイルをダブルクリックして開きます。
- コードエディタで reviews.json タブを選択します。
- ファイルの内容全体を選択してクリップボードにコピーします。
- 右上でドロップダウンを選択し、[テストイベントの設定] をクリックします。
次のスクリーンショットは、手順 12〜15 を示しています。
myTestEvent
などのイベント名を入力します。- 既存のイベントを、
reviews.json
ファイルからクリップボードにコピーしたコードに置き換えます。 - [作成] をクリックします。
次のスクリーンショットは、手順 16〜18 を示しています。
- 以下のスクリーンショットに示すように、[テスト] をクリックします。
これを実行するには少し時間がかかります。レビューを DynamoDB テーブルに挿入しました。
テーブルのクエリ
テーブルをクエリするには、次の手順を実行します。
- DynamoDB コンソールで、メニューから [テーブル] を選択します。
- 作成したテーブルを選択します。
- アイテムタブを選択します。
Lambda 関数が挿入したすべての製品レビューを見ることができます。コンソールの DynamoDB テーブルからデータを選択するには 2 つの方法があります。スキャンとクエリです。スキャンはテーブル内のすべてのアイテムを検索します。通常、普段のトランザクションワークロードには使用しませんが、テーブル上のアイテムを確認するのに役立ちます。クエリを使用すると、クエリを実行するインデックスに基づいて検索パラメータを入力できます。次のスクリーンショットは、製品レビューのリストを示しています。
最初に表示されるアイテムは、ベーステーブルのスキャンです。 - アクションのドロップダウンから、[クエリ] を選択します。
- [
[Table] product_reviews: product_id, review_date-review_id
] を選択します。 product_id
には、B00JG8GOWU
と入力します。- [検索の開始] を選択します。
Kindle Paperwhite のレビューを見ることができます。ID38942812
の顧客は肯定的なレビューを残し、他にどの製品を推奨しているかを確認できます。 - 作成した GSI に切り替えます。
- ドロップダウンメニューから、[クエリ] を選択します。
- [
[Index] customer_id-review_date-index: customer_id, review_date
] を選択します。 customer_id
には、38942812
と入力します。- [検索の開始] を選択します。
次のスクリーンショットは、クエリのオプションを示しています。
DynamoDB は、テーブル全体にクエリが均等に分散されるパーティションキーを選択したときに最適に機能します。特定のキーに対する要求が過度に高くなる状況が発生する可能性があります。product_title
フィールドは、B00JG8GOWU
が Kindle Paperwhite であることを示しています。この製品が発売されると、消費者は他の製品よりも頻繁に Kindle レビューを検索する可能性があります。レビューデータセットのような読み取りが多いワークロードの場合、DynamoDB のフルマネージドキャッシュサービスである Amazon DynamoDB Accelerator (DAX) を使用します。DAX は DynamoDB と API 互換です。これにより、DynamoDB コンソールでクラスターを作成し、クエリエンドポイントを DAX クラスターに変更するのと同じくらい簡単に DAX をセットアップできます。
クリーンアップ
作成した Lambda 関数と DynamoDB テーブルを削除します。
Lambda 関数を削除するには、以下の手順に従います。
- CloudFormation コンソールに移動します。
- [スタック] を選択します。
- スタック serverlessrepo-getting-started-with-dynamodb-reviews-inserter を選択します。
- [削除] をクリックします。
DynamoDB テーブルを削除するには、以下の手順に従います。
- DynamoDB コンソールに移動します。
- テーブルを選択し、[削除] をクリックします。
まとめ
この記事では、DynamoDB テーブルの概要を説明しました。テーブルを作成し、データセットを調べて、パーティションキーとソートキーを選択しました。アプリケーションが必要とするパターンに基づいてデータを効率的にクエリするために、GSI を設定しました。また、Lambda 関数を起動して、サンプルのレビューをテーブルに追加し、スキャンとクエリの違い、およびそれらの実行方法を学習しました。
DynamoDB は、データベースツールボックスにある多くのツールの 1 つです。インターネット規模のアプリケーションをオンラインにするために、高度にスケーラブルなミリ秒レイテンシーのキーバリューデータベースが必要な場合は、DynamoDB をご検討ください。さらに深く掘り下げる準備ができたら、AWS re:Invent 2018: Amazon DynamoDB の詳細情報: DynamoDB (DAT401) の高度なデザインパターンの動画を YouTube でご視聴ください。より高度な機能については、「バックアップと復元」と「正しい DynamoDB パーティションキーの選択」を参照してください。
著者について
William Kalescky は、アマゾン ウェブ サービスのソリューションアーキテクトです。