7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DynamoDB + AppSync設計パターン(備忘録)

Last updated at Posted at 2020-09-29

はじめに

プロジェクトでDynamoDB + AppSyncを利用したサービスの設計をしたので、その時のハマりポイント等を備忘録として残します。

DynamoDB設計の備忘録

DynamoDBに対してScanすることは避ける。
なぜ??? → テーブルを総ナメにする為。

設計ポイント

1. 関連するデータをまとめる
DynamoDBはできるだけ、少ないテーブルを維持する必要がある。

2. GSI(グローバル・セカンダリ・インデックス)を利用する
GSIを利用すると、同一テーブルでPKを切り替えることができます。つまり、特定のGSIを作成することで、メインのテーブルでサポートできるクエリとは異なるクエリを有効にできるのです。これがすごく使えます。

ユースケース : 例えばoperation[query]を使用している前提で、SKを範囲指定し検索した結果をfeachしたい場合、メインのテーブルのPKに対し一意になるような値[例えばuuid等]を設定していると、通常の[query]で範囲検索をしfeachすることができません。その場合、テーブルにある他のカラムをPKとしたい時にGSIが利用できます。

RDBMSとDynamoDBの違い

RDBMS
クエリの最適化は、スキーマ設計に依存しないので、正規化が重要です。

DynamoDB
よく使われるクエリを早く問い合わせできるようにスキーマを設計します。

AppSyncにおけるスキーマ/リゾルバ設計の備忘録

DynamoDBに対する操作ができるOperationの一覧

GetItem
Partation keyを条件として指定し、一件のアイテム取得

PutItem
1件のアイテムを書き込む

Update
1件のアイテムを更新

Delete
1件のアイテム削除

Query
Partation KeyとSort Keyの複合条件にマッチするアイテム群を取得

BatchGet
複数のプライマリキーを指定して、マッチするアイテム群を取得

Scan
テーブルを総ナメにする

重要 : DynamoDBに対するQuery or Scanのオペレーションでは最大で1MBのデータしか取得できない。
その為、Scanを利用してしまうと、項目内のデータサイズによっては全て取得しきれない可能性がある(テーブル内データを総ナメにする為)。

  • では、どうするのか
    答えは、Projectionの利用です。
    DynamoDB は、デフォルトですべての項目属性を返します。すべての属性ではなく、一部の属性のみを取得するには、Projectionを使用します。

  • projectionは分かったけど、どう設定するのか
    まず、DynamoDB側でインデックスの設定を行います。
    その際に[属性]という項目があるので、必要な項目のみ記載します。記載されない項目は、削ぎ落ちます。つまり、ここがインターフェースになるということです。

次にAppSync側の設定です。
Operationに[Query]を利用している場合、リゾルバ内のオプション項目[select]を使用し、
ALL_PROJECTED_ATTRIBUTES]を設定します。
ALL_PROJECTED_ATTRIBUTESとは、インデックスにクエリを実行する場合のみ使用できます。インデックスに投射されたすべての属性を取得します。つまり、これで、見たい項目のみに絞り込みができます。

[設定例]

"select" : "ALL_PROJECTED_ATTRIBUTES"

おまけ (AppSyncに対する認証はどうするべき・・)

いくつかある認証方式の中で、よく使われるものを抜粋

[API_KEY認証]

  • 利用方法
    クライアント側に認証用のAPI_KEYを埋め込みApp Syncを利用します。

  • 問題点
    API_KEYが発行されるとdefaultで7日後に有効期限が切れます。
    API_KEYは、最大 365 日間有効に設定可能で、該当日からさらに最大 365 日、既存の有効期限を延長できます。
    API_KEYは、パブリック API の公開が安全であるユースケース、または開発目的での使用が推奨されます。

[AMAZON_COGNITO_USER_POOLS認証]

  • 利用方法
    GraphQL オペレーションを送信するときに authorizaton ヘッダーで AWS AppSyncに送信します。

引用

DynamoDB Projection
AppSync Projectionの利用

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?