クライアント側のミューテーションによって実行されない外部データベースの更新を AWS AppSync サブスクライバーに通知するにはどうすればよいですか?

所要時間3分
0

外部データベースの変更が行われ、かつ、それがクライアント側のミューテーションを通じて実行されたものではない場合、アプリケーションのクライアントはリアルタイムで更新する必要があります。AWS AppSync を使用してサブスクライバーにこれらの変更を通知するにはどうすればよいですか?

簡単な説明

ローカルリゾルバーを使用すると、データソースを呼び出すことなく、外部データベースの変更をリアルタイムでサブスクライバーに通知できます。例えば、ローカルリゾルバーは、航空会社のアプリなど、情報を定期的に更新するアプリに役立ちます。

解決策」セクションの手順を実行して、GraphQL API のサンプルを作成します。GraphQL API は、データが Amazon DynamoDB テーブルデータソースに書き込まれると、サブスクライバーをリアルタイムで更新します。

解決方法

ウィザードを使用して 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.    [モデルの作成] ページで:
[Name the model] で、モデルの名前を入力します。この例では、Book が名前です。
[Configure model fields] で、アプリのデータ型を定義します。このセットアップ例では、デフォルトのフィールド名 (id および title) とタイプは変更しません。
(オプション) [Configure model table (optional)] を展開してインデックスを追加します。
[Create] を選択します。

5.    [Create resources] ページで、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.    左ナビゲーションペインで、[Data Sources] を選択します。

3.    [Create Data Source] を選択します。

4.    [新しいデータソース] ページの [新しいデータソースの作成] で、次の手順を実行します。
[Data source name] に名前を入力します。たとえば、real_time_data です。
[Data source type] で、[None] を選択します。

5.    [Create] (作成) を選択します。

詳細については、Attaching a data source を参照してください。

スキーマにミューテーションを追加する

2 つ目のミューテーションを作成して、管理者が使用できるようにするか、スキーマの更新時に有効にします。

データベースの更新を None 型のデータソースに渡すミューテーションでスキーマを更新します。

1.    AWS AppSync コンソールを開きます。

2.    ナビゲーションペインで、[スキーマ] を選択します。

3.    スキーマエディタの [type Mutation {] で、次のコマンドを追加して、外部更新用の新しいミューテーションタイプを作成します。

createBookExt(input: CreateBookInput!): Book

4.    スキーマエディタの [type 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.    [Save Schema] (スキーマを保存) を選択します。

詳細については、「Designing your schema」 を参照してください。

ミューテーションにリゾルバーをアタッチします

1.    AWS AppSync コンソールを開きます。

2.    API の [Schema] ページの [Resolvers] で、[Mutation] までスクロールします。または、[Filter types] に [Mutation] と入力します。

3.    [createBookExt(...): Book] の横にある [リゾルバー] で [Attach] を選択します。

4.    [新しいリゾルバーの作成] ページの [データソース名] で、作成した None タイプのデータソースの名前を選択します。例えば、real_time_data です。

5.    [リクエストマッピングテンプレートの設定] で、リクエスト関数を探します。

export function request(ctx) {
    return {};
}

6.    ctx.args を返すように関数を変更してください。

export function request(ctx) {
    return ctx.args;
}

7.    [Create] (作成) を選択します。

詳細については、「リゾルバーの設定 (VTL)」を参照してください。

新しいテストサブスクリプションを作成する

1.    AWS AppSync コンソールを開きます。

2.    左のナビゲーションペインで、[Queries] をクリックします。

3.    API の [Queries] ページで、複製したブラウザタブまたはウィンドウを開きます。

4.    複製されたブラウザタブまたはウィンドウで、クエリエディタの内容を消去し、次のクエリを入力します。

subscription onCreateBook {
  onCreateBook {
    id
    title
  }
}

5.    [再生] ボタン ([クエリを実行]) を選択します。複製されたブラウザのタブまたはウィンドウが、createBookcreateBookExt の両方のミューテーションに登録されるようになりました。

新しいテストミューテーションを作成する

1.    元のブラウザタブまたはウィンドウの API の [ Queries] ページで、クエリエディタの内容を消去します。次に、次のクエリを入力します。

mutation createBook($createbookinput: CreateBookInput!) {
  createBook(input: $createbookinput) {
    id
    title
  }
}

エディタ下部の [クエリ変数] セクションで、内容をクリアして、次のクエリを入力します。

{
  "createbookinput": {
    "title": "My New Book"
  }
}

前述のクエリでは、createBook ミューテーションを含む新しい Book が作成されます。

2.    [再生] ボタン ([クエリを実行]) を選択します。

3.    複製 (サブスクリプション) ブラウザのタブまたはウィンドウで、サブスクライバーが更新をリアルタイムで受信することに注意してください。

(オプション) ユースケースの例を参照する

クライアントアプリを構築してこれらの概念を適用するときに、料金とフライト時間を提供する航空会社のアプリを構築する次の例を使用できます。

以下の手順は、DynamoDB テーブルでフライトの詳細が変更されたときに、登録しているクライアントに通知する方法を示しています。

1.    DynamoDB ストリームをトリガーとして使用する AWS Lambda 関数を作成します。DynamoDB テーブルが更新されると、Lambda 関数が呼び出されます。詳細については、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 を参照してください。


関連情報

リゾルバーチュートリアル (VTL)

クエリとミューテーションの実行

リゾルバーマッピングテンプレートリファレンス (VTL)

コメントはありません