AWS AppSyncで複数のミューテーションをサブスクライブする

2022.01.26

ども、ゲストブロガーのNTT東日本 大瀧です。

AWS AppSyncは様々なAWSサービスにGraphQL APIを提供するサービスで、GraphQL自体を利用するほかに更新された内容を購読するサブスクライブ機能を利用したいケースもあったりします。 サブスクライブ機能のサンプルをインターネットで探してみると特定のひとつのミューテーションを購読する例しか見つからなかったため、本記事では例えばDynamoDBテーブルのデータについての複数種類の操作をざっくりまとめて購読する例を紹介します。

複数ミューテーションのサブスクライブ

サブスクライブの定義はGraphQLのスキーマのうち Subscription タイプで定義します。以下のような感じです。

type Subscription {
	onCreateUserConfig(config: ID, id: ID): UserConfig
		@aws_subscribe(mutations: ["createUserConfig"])
	onUpdateUserConfig(config: ID, id: ID): UserConfig
		@aws_subscribe(mutations: ["updateUserConfig"])
	onDeleteUserConfig(config: ID, id: ID): UserConfig
		@aws_subscribe(mutations: ["deleteUserConfig"])
}

リクエストに複数のサブスクリプションを含めるとDuplicated operationというエラーが返ってくるため、購読のリクエストで指定できるサブスクリプションは1つだけということがわかります。一方で、単一のサブスクリプション定義にはミューテーションを複数指定できるので、以下のようなサブスクリプションを定義し、それを用いてリクエストする手が使えます。

onSomethingUserConfigを追加

type Subscription {
          :
	onSomethingUserConfig(config: ID, id: ID): UserConfig
		@aws_subscribe(mutations: ["createUserConfig","updateUserConfig","deleteUserConfig"])
}

ドキュメントでは以下に記載があります。

@aws_subscribe(mutations: ["",..,""]) は、ミューテーション入力の配列を受け取るため、サブスクリプションをトリガーする複数のミューテーションを指定できます。

GraphQLエクスプローラで onSomethingUserConfig で購読リクエストを送ってみると...

「3個のミューテーションにサブスクライブしました」と表示されました!購読できています。

まとめ

AWS AppSyncで複数のミューテーションをサブスクライブするためのスキーマ例をご紹介しました。DynamoDB Streamsよりも手軽にデータ更新をキャッチできる便利な方法だと思うので、皆さんも試してみてください!(ただしキャッチできるのはAppSync経由での更新に限ります)