クライアント側のミューテーションによって実行されない外部データベースの更新を AWS AppSync サブスクライバーに通知するにはどうすればよいですか?
最終更新日: 2021 年 10 月 6 日
外部データベースの変更が行われ、かつ、それがクライアント側のミューテーションを通じて実行されたものではない場合、アプリケーションのクライアントはリアルタイムで更新する必要があります。AWS AppSync を使用してサブスクライバーにこれらの変更を通知するにはどうすればよいですか?
簡単な説明
ローカルリゾルバーを使用すると、データソースを呼び出すことなく、外部データベースの変更をリアルタイムでサブスクライバーに通知できます。
以下の手順に従って、データが Amazon DynamoDB テーブルのデータソースに書き込まれるときにサブスクライバーにリアルタイムで更新情報を知らせる GraphQL API の例を作成します。
注: ローカルリゾルバーの使用は、サブスクライバーがリアルタイムデータを必要とする場合に便利です。例えば、ローカルリゾルバーは、最新の料金表とフライト時刻を定期的に更新する必要がある航空会社のアプリケーションで役立ちます。
解決方法
ウィザードを使用して GraphQL API を作成する
AWS AppSync ガイド付きスキーマウィザードを使用して、新しい GraphQL API を作成します。詳細については、「GraphQL API の設計」を参照してください。
1. AWS AppSync コンソールを開きます。
2. [API を作成] を選択します。
3. [Getting Started] ページの [Customize your API or import from Amazon DynamoDB] で、[Create with wizard]、[Start] の順に選択します。
4. [Create a model] ページで、次の手順を実行します。
[Name the model] で、モデルの名前を入力できます。このセットアップ例では、モデル名 (MyModelType) は変更しないでください。
[Configure model fields] で、アプリのデータ型を定義できます。このセットアップ例では、デフォルトのフィールド名 (id および title) とタイプは変更しません。
(オプション) [Configure model table (optional)] を展開してインデックスを追加します。
[Create] を選択します。
5. [Create resources] ページで、API の名前を入力し、[Create] を選択します。AWS AppSync は指定されたとおりに API を作成し、API の [Queries] (クエリ) ページを開きます。
テストサブスクリプションを作成する
1. AWS AppSync コンソールの API の [Queries] ページで、複製したブラウザタブまたはウィンドウを開きます。
2. 複製したブラウザタブまたはウィンドウで、クエリエディタに次のように入力します。
subscription sub1 {
onCreateMyModelType{
id
title
}
}
このオペレーションでは、createMyModelType ミューテーションへのサブスクリプションを作成します。
3. 開始ボタン ([Execute Query]) を選択し、[sub1] を選択します。複製したブラウザタブまたはウィンドウがミューテーションにサブスクライブされます。
4. 元のブラウザタブまたはウィンドウで、開始ボタン ([Execute Query] (クエリを実行)) を選択し、[createMyModelType] を選択します。これでミューテーションが実行されます。結果は、元のブラウザタブまたはウィンドウと、複製された (サブスクリプション) ブラウザタブまたはウィンドウの両方で確認できます。
5. サブスクリプションの動作が示されたら、複製したブラウザタブまたはウィンドウを閉じます。
None タイプのデータソースを作成する
None データソースタイプは、リクエストマッピングテンプレートをレスポンスマッピングテンプレートに直接渡します。
1. 元のブラウザタブまたはウィンドウで、AWS AppSync コンソールの左のナビゲーションペインにある [Data Sources] を選択します。
2. [Create Data Source] を選択します。
3. [New Data Source] ページの [Create new Data Source] で、以下の操作を行います。
[Data source name] に名前を入力します。たとえば、real_time_data です。
[Data source type] で、[None] を選択します。
4. [Create] (作成) を選択します。
詳細については、Attaching a data source を参照してください。
スキーマにミューテーションを追加する
データベースの更新を None 型のデータソースに渡すミューテーションでスキーマを更新します。
1. AWS AppSync コンソールの左のナビゲーションペインで、[Schema] を選択します。
2. スキーマエディタの [type Mutation {] で、次を上書きします。
createMyModelType(input: CreateMyModelTypeInput!): MyModelType
これにより、次のようになります。
addMyModelType(id : ID! , title : String!): MyModelType
3. スキーマエディタの [type Subscription {] で、次を上書きします。
@aws_subscribe(mutations: ["createMyModelType"])
これにより、次のようになります。
@aws_subscribe(mutations: ["addMyModelType"])
注意: これらを上書きする代わりに、新しいミューテーションタイプと対応するサブスクリプションを作成することもできます。
4. [Save Schema] (スキーマを保存) を選択します。
詳細については、Designing your schema を参照してください。
サブスクリプションにリゾルバーをアタッチする
1. AWS AppSync コンソールで、API の [Schema] ページにある [Resolvers] の [Mutation] まで下にスクロールします。または、[Filter types] に [Mutation] と入力します。
2. [addMyModelType(...): MyModelType] の横の [Resolver] で、[Attach] を選択します。
3. [Create new Resolver] ページの [Data source name] で、前に作成した None type データソースの名前を選択します。(例: real_time_data)
4. [Configure the request mapping template] (リクエストマッピングテンプレートを設定します) で、次を上書きします。
"payload": {
"hello": "local",
}
これにより、次のようになります。
"payload": $util.toJson($context.args)
4. [Save Resolver] (リゾルバーを保存) を選択します。
詳細については、Configuring resolvers を参照してください。
新しいテストサブスクリプションを作成する
1. AWS AppSync コンソールの左のナビゲーションペインで、[Queries] を選択します。
2. API の [Queries] ページで、複製したブラウザタブまたはウィンドウを開きます。
3. 複製されたブラウザタブまたはウィンドウのクエリエディタで、次を上書きします。
mutation createMyModelType($createmymodeltypeinput: CreateMyModelTypeInput!) {
createMyModelType(input: $createmymodeltypeinput) {
id
title
}
}
これにより、次のようになります。
subscription sub1 {
onCreateMyModelType{
id
title
}
}
4. 開始ボタン ([Execute Query]) を選択し、[sub2] を選択します。複製したブラウザタブまたはウィンドウがミューテーションにサブスクライブされます。
新しいテストミューテーションを作成する
1. 元のブラウザタブまたはウィンドウで、API の [Queries] (クエリ) ページのクエリエディタで次を上書きします。
mutation createMyModelType($createmymodeltypeinput: CreateMyModelTypeInput!) {
createMyModelType(input: $createmymodeltypeinput) {
id
title
}
}
これにより、次のようになります。
mutation mutation1 {
addMyModelType(id:"5",title:"new update"){
id
title
}
}
このオペレーションでは、[addMyModelType] ミューテーションが作成されます。
2. 開始ボタン ([Execute Query]) を選択し、[mutation1] を選択します。
3. 複製した (サブスクリプション) ブラウザタブまたはウィンドウで、サブスクライバーがリアルタイムで更新を受信することを確認します。
(オプション) ユースケースの例を参照する
クライアントアプリケーションを構築してこれらの概念を適用するときは、料金表とフライト時刻を提供する航空会社アプリケーションのユースケースの例を考えてみます。この場合、DynamoDB テーブルでフライトの詳細が変更されたときにサブスクライブしているクライアントに通知するには、次の操作を行います。
1. DynamoDB ストリームをトリガーとして使用する AWS Lambda 関数を作成します。Lambda 関数は、DynamoDB テーブルが更新されるたびに呼び出されます。詳細については、Amazon DynamoDB で AWS Lambda を使用するを参照してください。
2. 適切な更新をフィルタリングし、AWS AppSync へのミューテーション呼び出しを実行するロジックを Lambda 関数コードに含めます。これにより、AWS AppSync はサブスクリプションを通じてサブスクライバーに通知します。詳細については、Tutorial: AWS Lambda resolvers を参照してください。
3. AWS AppSync で、ローカルリゾルバーを持つ新しいミューテーションフィールド (例: publishPrice) を追加します。
4. サブスクリプションフィールド (例: onPriceUpdate) でそのミューテーションをサブスクライブします。
スキーマの例
type flightDetails {
id: ID!
src: String!
destn: String!
price : Int
}
type Mutation {
# A local resolver targeting a None data source that publishes the message to subscribed clients.
publishPrice(price: Int): flightDetails
}
type Subscription {
# Notified whenever *publishPrice* is called.
onPriceUpdate: Message
@aws_subscribe(mutations: ["publishPrice"])
}
type Query { ... }
詳細については、Designing your schema を参照してください。
5. DynamoDB ストリームをトリガーとして使用する別の AWS Lambda 関数を作成します。この関数では、publishPrice ミューテーションを呼び出します。publishPrice ミューテーションにはローカルリゾルバーがあるため、データが再び DynamoDB に書き込まれることはありません。このようにして、AWS AppSync を PubSub ブローカーとして使用できます。
詳細と別のユースケースの例については、Tutorial: Local resolvers を参照してください。
関連情報
Resolver tutorials (AWS AppSync デベロッパーガイド)