AWS Amplify Framework(4)APIカテゴリ

APIカテゴリ

APIカテゴリは、 REST および、AWS Appsync をはじめとする GraphQL エンドポイントへのHTTPリクエストを行うための機能を、JavascriptライブラリおよびSDKを通じて提供する。AppSyncとの統合を行う場合は、

  1. クライアント側でAPIエンドポイントと認証情報を設定
  2. APIスキーマからJavascriptコードを生成
  3. クエリやミューテーションを実行するアプリコードを生成

という手順で行う。また、 Amplify CLI を用いることでバックエンドとなる AWS Appsync の設定やクライアント側の設定ファイルのダウンロードなどを簡単に行うことができる。

セットアップ

Amplifyプロジェクトのルートディレクトリでamplify add apiコマンドを実行することで、ウィザードに従って自動セットアップを行うことができる。

amplify update api
? Please select from one of the below mentioned services: GraphQL
? Choose the default authorization type for the API Amazon Cognito User Pool
Use a Cognito user pool configured as a part of this project.
? Do you want to configure advanced settings for the GraphQL API No, I am done.

スキーマ

/amplify/backend/api/API_NAME/schema.graphql にあるスキーマファイル(schema.graphql)を編集することで、GraphQLのスキーマを更新することができる。Amplifyプロジェクトをデプロイすると、これらのスキーマがバックエンド側に反映される。

GraphQLトランスフォーマ

Amplifyには、拡張定義された GraphQLディレクティブ が用意されており、これらのディレクティブを用いることで、 データ構造や参照権限などを簡単に記述 することができる。

type User @model @key(fields: ["id", "group"]) {
  id: ID!
  group: String!
  attr: Attr
}

type Attr {
  gender: Int
  age: Int
  areacode: Int
  postcode: Int
}
ディレクティブ 内容
@model @model単位でDynamoDBテーブルが作成される
@key(fields: [KEY, KEY]) DynamoDBに格納する際のプライマリキーとソートキーを定義

スキーマの更新

フロントエンドのコンテンツは、GraphQLデータを操作するためのTypeScriptクラスを経由して、バックエンドと通信を行う。amplify codegen を実行することで、 /arc/graphql/ 以下にGraphQLを操作するためのGraphQLステートメントとタイプを自動生成する。

なお、amplify codegen コマンドは、 team-provider-info.json に格納されている情報を基にAWS上の設定内容を確認し、上記動作を行う。したがって、 team-provider-info.json に正しいリソース情報が格納されていない場合には、 UnhandledPromiseRejectionWarning: AccessDenied: Access Denied エラーが発生する。

AWS DynamoDB(3)使用する上で注意すること

適切なスキーマ設定

DynamoDBは限られた範囲のクエリを効率よく処理できるがそれ以外はコストが掛かる。重要なクエリを安価に効率よく実行できるようなスキーマ設計が需要である。アプリケーションのユースケースを注意深く解析して、単一のテーブルで処理可能な構造とする。

スキーマを構成する上で確認すべき点は、データサイズデータ形式クエリ負荷である。

  • 関連するデータをまとめる
  • ソート順を決定する
  • クエリを分散する
  • グローバルセカンダリインデックスを使用する

パーティションキー

効率的なパーティションキーの設計とし、クエリを分散させる。ただし、一部のパーティションに負荷が偏った場合でも、アダプティブキャパシティが自動的に適用され、ある程度は影響を緩和することができる。

アダプティブキャパシティ

負荷を分散させるために、格納された値を元にパーティションキーにサフィックスを付加する手法も存在する。

キャパシティを上げた状態でOnDemand課金に切り替える

OnDemandを使用する場合は、バーストトラフィックに耐えれるように、まずキャパシティを上げた状態にしておき、それからOnDemand課金に変更する。ただし、課金体系への変更には制限があることから頻繁な変更はできないことに留意が必要。

大きな項目データは、圧縮するかS3に保存する

圧縮したバイナリデータを保存したり、S3に保存してこのオブジェクト識別子をDynamoDBに保存することができる。

時系列データは複数テーブルによる構成も検討する

時系列データの場合、当日データに書き込みや読み込みが偏り、ホットスポットが発生する。これを回避するために期間ごとにテーブルを分割して、バッチ処理で新しいテーブルの作成と新しいテーブルへの切り替えを行う。

クエリの最適化

Scanクエリはなるべく使わない

Scanは非常に低速でデータ数が大きくなると非効率となるので避ける。

条件付き書き込みやアトミックカウンターを使用する

複数が同時に更新する場合は、条件付き書き込みを使用する。