AWS AppSync
Overview
AWS AppSyncは GraphQL API の開発を簡単に行うことができるサーバーレスサービス。
AppSyncは GraphQL API に関するセットアップ機能をフルマネージドで提供し、AWS WAFやCloudWatch・X-Rayの組み込みサポートにより、API保護・モニタリング・追跡できるためメンテナンスコストを削減できる。
GraphQL とはMeta社が提供しているWeb APIのクエリ言語で、特徴として少ないリクエストで複数のリソースにアクセス可能で最小限のデータのみを取得できるメリットある。
AppSync コスト
次の場合に料金が発生する。
- クエリとデータ変更操作
- データへのリアルタイム更新受信時
- GraphQL API専用のキャッシュインスタンス
AppSyncの利用シーン
AppSyncの利用シーンは次のようなものがある。
- AWS上でGraphQLを利用したい場合
- オフライン時でもアプリケーションを操作したい時
- 複数の利用者が共同編集を行うチャットアプリケーション
AppSync用語
スキーマ
GraphQLスキーマは、どのようなデータ機能をクライアントアプリケーションに対して実行可能にするk
リゾルバー
クライアントから受け取ったGraphQLリクエストをデータソース操作用の命令に変換したりする
AppSyncのリゾルバ種類
AppSyncには2種類のリゾルバがある。
- ユニットリゾルバ 1つのデータソースに対して、1ステップでマッピングを行う
- パイプラインリゾルバ 複数の関数(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 サービスに変更がアップロードされ、競合があった場合は解決される。