メインコンテンツまでスキップ

AWS AppSync

Overview​

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

ヒント

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​