[アップデート] AWS AppSync Events がチャネル名前空間のデータソース統合をサポートするようになりました

[アップデート] AWS AppSync Events がチャネル名前空間のデータソース統合をサポートするようになりました

こんにちは。クラウド事業本部の枡川です。
AppSync Events がチャネル名前空間のデータソース統合に対応しました。

What's New

https://aws.amazon.com/about-aws/whats-new/2025/04/aws-appsync-events-data-source-integrations-channel-namespaces/

AWS ブログ

https://aws.amazon.com/jp/blogs/aws/enhance-real-time-applications-with-aws-appsync-events-data-source-integrations/

AppSync と言えば GraphQL のイメージが強いと思いますが、AppSync Event API は Websocket を利用した Pub/Sub をサーバーレスで実現するための機能です。

https://dev.classmethod.jp/articles/appsync-event-api/

元々イベントハンドラーという機能が存在し、イベント発行時に何らかの処理を行うことが可能でした。
この処理は AWS AppSync の JavaScript ランタイム上で実行される関数であり、ちょっとしたフィルタリングや変換を行うことが可能です。

チャネル名前空間にイベントハンドラーを定義できます。イベントハンドラーは AWS AppSync の JavaScript ランタイム上で実行される関数であり、カスタムビジネスロジックの実行を可能にします。イベントハンドラーを使用して、パブリッシュされたイベントを処理したり、サブスクライブリクエストを処理および承認したりできます。

import { util } from '@aws-appsync/utils'
export function onPublish(ctx) {
  return ctx.events.map(event => ({
    id: event.id,
    payload: {
      ...event.payload,
      message: event.payload.message.toUpperCase()
      timestamp: util.time.nowISO8601()
    }
  }))
}

チャネル名前空間ハンドラーとイベント処理

このイベントハンドラーにデータソースとして DynamoDB などを連携することで他サービスと連携した高度なイベント処理を行うことが可能になりました。
データソースとしては、下記から選択できます。

  • AWS Lambda
  • DynamoDB
  • Amazon RDS
  • Amazon EventBridge
  • Amazon OpenSearch Service
  • HTTP endpoints
  • Amazon Bedrock

https://docs.aws.amazon.com/appsync/latest/eventapi/supported-datasources.html

DynamoDB、RDS、OpenSearch などにイベント情報を保存したり、Lambda や EventBridge、外部 API にイベント情報を連携するのはイメージがつきやすいと思いますが、Bedrock は面白いですね。
イベント処理ワークフローに生成 AI の機能を簡単に組み込めると記載されています。

Amazon Bedrock enables AWS AppSync to integrate directly with foundation models for AI/ML capabilities. Through this data source, you can incorporate generative AI features into your event processing workflows without managing complex ML infrastructure. Amazon Bedrock provides access to various foundation models from leading AI companies, including Anthropic, AI21 Labs, Cohere, Meta, Stability AI, and Amazon.
https://docs.aws.amazon.com/ja_jp/appsync/latest/eventapi/supported-datasources.html

やってみる

チュートリアルが用意されていたので、やってみました。

https://docs.aws.amazon.com/appsync/latest/eventapi/dynamodb-table-integration-tutorial.html

このチュートリアルでは、GraphQL API と Event API を一つずつ構築し、Event API 側から登録したデータを GraphQL API から検索できるようにします。
構成としては下図のようになります。

appsync.png

検証の都合でパブリッシャーとサブスクライバーと GraphQL アクセスする人が全て同じなので少しごちゃついてますが...

GraphQL API の作成

まず GraphQL API を作成します。

appsync1.png

Design from scratch を選択して、合わせて DynamoDB も作成します。

appsync2.png

API 名を入力します。

appsync3.png

モデル名と各種フィールドを入力します。

appsync4.png

テーブル名と、Primary key、Sort Key、追加のインデックスを入力します。

appsync5.png

内容を確認して「API を作成」をクリックします。

appsync6.png

この段階で、AppSync の GraphQL API と合わせてバックエンド Dynamo DB が作成されています。

appsync7.png

Event API の作成

続いて、Event API を作成していきます。

appsync8.png

API 名を入力します。

appsync9.png

「データソースを作成」をクリックします。

appsync10.png

ここでは先程作成された DynamoDB を指定します。

appsync11.png

default の名前空間を選択して、イベントハンドラーの設定を行います。

appsync12.png

appsync13.png

「データソースを含むコード」を選択し、先程作成したデータソースを選択します。

appsync14.png

コードはチュートリアル記載のものをそのまま貼り付けます。

import { util } from "@aws-appsync/utils";
import * as ddb from "@aws-appsync/utils/dynamodb";

export const onPublish = {
  request(ctx) {
    const channel = ctx.info.channel.path;
    const createdAt = util.time.nowISO8601();
    return ddb.batchPut({
      tables: {
        "tutorial-events-messages": ctx.events.map(({ payload }) => {
          return { channel, id: util.autoKsuid(), createdAt, ...payload };
        }),
      },
    });
  },
  // simply forward the events for broadcast
  response: (ctx) => ctx.events,
};

発行されたイベントを DynamoDB に保存する処理となります。

動作確認

一通り作成できたので、動作確認に移ります。
Event API を選択して、「Pub/Sub エディタでのテスト」をクリックします。

appsync15.png

まず、「接続」をクリックします。

appsync16.png

その後、default チャンネルをサブスクライブします。

appsync17.png

JSON 形式でデータを記載して、HTTP でイベントを発行します。

appsync18.png

サブスクライバー側で、登録したデータが確認できました。

appsync19.png

チュートリアルに沿って、もう一度イベントを発行します。

appsync20.png

サブスクライバー側ではこんな感じで確認できます。

appsync21.png

イベントを処理する中で、データソース統合によって DynamoDB にデータが登録されているはずなので、そちらを確認していきます。
まず、GraphQL API のクエリエディタに移動します。

appsync22.png

チュートリアル 記載のクエリをコピペして実行します。

query byChannel {
  queryMessagesByChannelIdIndex(channel: "/default/channel", first: 10) {
    items {
      channel
      id
      user
      content
      createdAt
    }
  }
}

appsync23.png

無事、登録したデータを確認できました!

appsync24.png

もちろん DynamoDB のサービスページから確認してもデータを閲覧可能です。

appsync25.png

まとめ

AppSync Events のデータソース統合を試してみました。
実際にリアルタイムアプリケーションを作成する際を考えると、かなり扱いやすくなったように感じました。
しっかり作り込む場合は API Gateway など他の選択肢との使い分けに悩みそうですが、データを DynamoDB に書き込むくらいはやりたくなるケースも多いのでは無いでしょうか。
Websocket API を作成する際は是非 AppSync Events も検討してみて下さい!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.