Skip to main content

AWS AppSync

Overview

AWS AppSyncは GraphQL API の開発を簡単に行うことができるサーバーレスサービス。
AppSyncは GraphQL API に関するセットアップ機能をフルマネージドで提供し、AWS WAFやCloudWatch・X-Rayの組み込みサポートにより、API保護・モニタリング・追跡できるためメンテナンスコストを削減できる。

tip

GraphQL とはMeta社が提供しているWeb APIのクエリ言語で、特徴として少ないリクエストで複数のリソースにアクセス可能で最小限のデータのみを取得できるメリットある。

AppSync コスト

次の場合に料金が発生する。

  1. クエリとデータ変更操作
  2. データへのリアルタイム更新受信時
  3. GraphQL API専用のキャッシュインスタンス

AppSyncの利用シーン

AppSyncの利用シーンは次のようなものがある。

  1. AWS上でGraphQLを利用したい場合
  2. オフライン時でもアプリケーションを操作したい時
  3. 複数の利用者が共同編集を行うチャットアプリケーション

AppSync用語

スキーマ

GraphQLスキーマは、どのようなデータ機能をクライアントアプリケーションに対して実行可能にするk

リゾルバー

クライアントから受け取ったGraphQLリクエストをデータソース操作用の命令に変換したりする

AppSyncのリゾルバ種類

AppSyncには2種類のリゾルバがある。

  1. ユニットリゾルバ 1つのデータソースに対して、1ステップでマッピングを行う
  2. パイプラインリゾルバ 複数の関数(Function)を順に実行し、柔軟なビジネスロジックを定義可能

パイプラインリゾルバは以下のようなケースでよく使われる。

  • DynamoDBに2回アクセスする(例:Userを取得し、そのUserが参加しているChatRoom一覧を返す)
  • 認可ロジックを前段で挟む
  • 複数のデータソースを跨ぐ操作(例:LambdaとDynamoDBを組み合わせる)

Query(取得)

Mutation(データ更新)

Subscription(データ購読)

AppSync の Subscription は、クライアントが特定のイベント(データ更新)をリアルタイムで受信するための仕組みであり、チャットアプリケーションでの新着メッセージ受信などに最適な用途。 例えばユーザーが特定のチャットルームに入室し、そのルームで新しいメッセージが投稿されたとき、他のユーザーがリアルタイムでそのメッセージを受信できるようになる。

  • Subscription は WebSocket 接続で維持される(=サーバーがクライアントの接続を保持)
  • 一つのチャットルーム = 一つの subscription トピック(roomIdで分離)という設計が多い
  • Amplify クライアントライブラリ(aws-amplify)を使うと Subscription のセットアップが簡単
  • Lambda を挟まずとも、AppSync → DynamoDB のマッピングだけで実現可能

利用例(チャットアプリ)

# サブスクリプション定義
subscription OnMessageAdded($roomId: ID!) {
onMessageAdded(roomId: $roomId) {
id
content
sender
createdAt
}
}

# ミューテーション
mutation SendMessage($roomId: ID!, $content: String!) {
sendMessage(roomId: $roomId, content: $content) {
id
content
sender
createdAt
}
}

オフラインでのデータアクセスに対応

Amplify DataStoreを使用することでオフラインであってもローカルデバイス上でデータのQuery(取得)やMutation(更新)が行える。
Mutation (更新) が行われた場合、オンラインになった際に AWS AppSync サービスに変更がアップロードされ、競合があった場合は解決される。

Resource