クライアント側のミューテーションが実行されない外部データベースの更新を AWS AppSync サブスクライバーに通知する方法を教えてください。
クライアント側のミューテーションでは実行されない外部データベースの変更が行われたときに、アプリのクライアントにリアルタイムで更新してもらう必要があります。AWS AppSync を使用してサブスクライバーにこれらの変更を通知する方法を教えてください。
簡単な説明
ローカルリゾルバーを使用すると、データソースを呼び出すことなく、外部データベースの変更をリアルタイムでサブスクライバーに通知できます。例えば、ローカルリゾルバーは、航空会社のアプリなど、情報を定期的に更新するアプリに役立ちます。
解決策セクションの手順を実行して、GraphQL API の例を作成します。GraphQL API は、データが Amazon DynamoDB テーブルデータソースに書き込まれると、サブスクライバーをリアルタイムで更新します。
解決策
ウィザードを使用して GraphQL API を作成する
AWS AppSync ガイド付きスキーマウィザードを使用して、新しい GraphQL API を作成します。詳細については、「Designing a GraphQL API」(GraphQL API の設計) を参照してください。
1.AWS AppSync コンソールを開きます。
2.[API の作成] を選択します。
3.[はじめに] ページの [API をカスタマイズするか Amazon DynamoDB からインポート] で、[ウィザードで作成] を選択し、[開始] を選択します。
4.[モデルの作成] ページで以下の手順を実行します。
[モデルに名前を付ける] に、モデルの名前を入力します。この例では、Book が名前です。
[モデルフィールドの設定] で、アプリのデータ型を定義します。この設定例では、デフォルトのフィールド名 (id と title) とタイプをそのまま使用します。
(オプション) [モデルテーブルの設定 (オプション)] を展開してインデックスを追加します。
[作成] を選択します。
5.[リソースの作成] ページで、API の名前を入力します。次に、[作成] を選択します。AWS AppSync は API を作成し、API の [クエリ] ページを開きます。
テストサブスクリプションを作成する
1.AWS AppSync コンソールを開きます。
2.API の [クエリ] ページに移動し、複製されたブラウザタブまたはウィンドウを開きます。
3.複製されたブラウザタブまたはウィンドウで、クエリエディタの内容を消去し、次のクエリを入力します。
subscription onCreateBook { onCreateBook { id title } }
上記のクエリは CreateBook ミューテーションへのサブスクリプションを作成します。
4.再生ボタン ([クエリを実行]) を選択します。複製されたブラウザタブまたはウィンドウは CreateBook ミューテーションにサブスクライブされます。
5.元のブラウザタブまたはウィンドウで、再生ボタン ([クエリを実行]) を選択し、次に **CreateBook ** を選択してミューテーションを実行します。結果は、元のブラウザタブと複製された (サブスクリプション) ブラウザタブまたはウィンドウの両方に表示されます。
6.サブスクリプションが表示されたら、複製されたブラウザタブまたはウィンドウを閉じます。
None タイプのデータソースの作成
None データソースタイプは、リクエストマッピングテンプレートをレスポンスマッピングテンプレートに直接渡します。
1.元のブラウザタブまたはウィンドウで、AWS AppSync コンソールを開きます。
2.左側のナビゲーションペインで、[データソース] を選択します。
3.[データソースを作成] を選択します。
4.[新しいデータソース] ページの [新しいデータソースを作成] で、次の手順を実行します。
[データソース名] に、名前を入力します。例えば、real_time_data などです。
[データソースタイプ] で [None] を選択します。
5.[作成] を選択します。
詳細については、「Attaching a data source」(データソースのアタッチ) を参照してください。
スキーマにミューテーションを追加する
2 つ目のミューテーションを作成して、管理者が使用できるようにするか、スキーマの更新時に起動できるようにします。
データベースの更新を None タイプのデータソースに渡すミューテーションを使用してスキーマを更新します。
1.AWS AppSync コンソールを開きます。
2.左側のナビゲーションペインで、[スキーマ] を選択します。
3.スキーマエディタの [タイプ Mutation {] に次のコマンドを追加して、外部更新用の新しいミューテーションタイプを作成します。
createBookExt(input: CreateBookInput!): Book
4.スキーマエディタの [タイプ Subscription {] で、次の行を探します。
onCreateBook(id: ID, title: String): Book @aws_subscribe(mutations: ["createBook"])
5.ミューテーションのリストに "createBookExt" を追加します。
onCreateBook(id: ID, title: String): Book @aws_subscribe(mutations: ["createBook", "createBookExt"])
6.[スキーマを保存] を選択します。
詳細については、「Designing your schema」(スキーマの設計) を参照してください。
ミューテーションにリゾルバーをアタッチする
1.AWS AppSync コンソールを開きます。
2.API の [スキーマ] ページの [リゾルバー] で、[ミューテーション] までスクロールします。または、[タイプをフィルタリング] に [ミューテーション] と入力します。
3.[createBookExt(...): Book] の横にある [リゾルバー] で、[アタッチ] を選択します。
4.[新しいリゾルバーを作成] ページの [データソース名] で、作成した None タイプのデータソースの名前を選択します。例えば、real_time_data などです。
5.[リクエストマッピングテンプレートの設定] で、リクエスト関数を探します。
export function request(ctx) { return {}; }
6.ctx.args を返すように関数を変更します。
export function request(ctx) { return ctx.args; }
7.[作成] を選択します。
詳細については、「Configuring resolvers (VTL)」(リゾルバー の設定 (VTL)) を参照してください。
新しいテストサブスクリプションを作成する
1.AWS AppSync コンソールを開きます。
2.左側のナビゲーションペインで [クエリ] を選択します。
3.API の [クエリ] ページで、複製されたブラウザタブまたはウィンドウを開きます。
4.複製されたブラウザタブまたはウィンドウで、クエリエディタの内容を消去し、次のクエリを入力します。
subscription onCreateBook { onCreateBook { id title } }
5.再生ボタン ([クエリを実行]) を選択します。複製されたブラウザタブまたはウィンドウが、createBook と createBookExt の両方のミューテーションにサブスクライブされるようになりました。
新しいテストミューテーションを作成する
1.元のブラウザタブまたはウィンドウの API の [クエリ] ページで、クエリエディタの内容を消去します。次に、次のクエリを入力します。
mutation createBook($createbookinput: CreateBookInput!) { createBook(input: $createbookinput) { id title } }
エディタの下部にある [クエリ変数] セクションで、内容を消去して次のクエリを入力します。
{ "createbookinput": { "title": "My New Book" } }
上記のクエリは、createBook ミューテーションを含む新しいブックを作成します。
2.再生ボタン ([クエリを実行]) を選択します。
3.複製された (サブスクリプション) ブラウザタブまたはウィンドウでは、サブスクライバが更新をリアルタイムで受信することに注意してください。
(オプション) ユースケース例を参照する
クライアントアプリを構築してこれらの概念を適用する際、料金とフライト時間を提供する航空会社アプリを作成する次の例を使用できます。
次のステップは、DynamoDB テーブルでフライトの詳細が変更されたときにサブスクライブしているクライアントに通知する方法を示しています。
1.DynamoDB ストリームをトリガーとして使用する AWS Lambda 関数を作成します。DynamoDB テーブルが更新されると、Lambda 関数が呼び出されます。詳細については、「Amazon DynamoDB で AWS Lambda を使用する」を参照してください。
2.Lambda 関数コードに、適切な更新をフィルタリングし、AWS AppSync へのミューテーション呼び出しを実行するロジックを含めます。これにより、AWS AppSync はサブスクリプションを通じてサブスクライバーに通知します。詳細については、「Tutorial: AWS Lambda resolvers」(チュートリアル: AWS Lambda リゾルバー) を参照してください。
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 (VTL) (リゾルバーチュートリアル (VTL))
Run queries and mutations (クエリとミューテーションを実行する)
Resolver mapping template reference (VTL) (リゾルバーマッピングテンプレートリファレンス (VTL))
- 言語
- 日本語
