[アップデート] AWS AppSync Events がチャネル名前空間のデータソース統合をサポートするようになりました
こんにちは。クラウド事業本部の枡川です。
AppSync Events がチャネル名前空間のデータソース統合に対応しました。
What's New
AWS ブログ
AppSync と言えば GraphQL のイメージが強いと思いますが、AppSync Event API は Websocket を利用した Pub/Sub をサーバーレスで実現するための機能です。
元々イベントハンドラーという機能が存在し、イベント発行時に何らかの処理を行うことが可能でした。
この処理は 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
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
やってみる
チュートリアルが用意されていたので、やってみました。
このチュートリアルでは、GraphQL API と Event API を一つずつ構築し、Event API 側から登録したデータを GraphQL API から検索できるようにします。
構成としては下図のようになります。
検証の都合でパブリッシャーとサブスクライバーと GraphQL アクセスする人が全て同じなので少しごちゃついてますが...
GraphQL API の作成
まず GraphQL API を作成します。
Design from scratch
を選択して、合わせて DynamoDB も作成します。
API 名を入力します。
モデル名と各種フィールドを入力します。
テーブル名と、Primary key、Sort Key、追加のインデックスを入力します。
内容を確認して「API を作成」をクリックします。
この段階で、AppSync の GraphQL API と合わせてバックエンド Dynamo DB が作成されています。
Event API の作成
続いて、Event API を作成していきます。
API 名を入力します。
「データソースを作成」をクリックします。
ここでは先程作成された DynamoDB を指定します。
default
の名前空間を選択して、イベントハンドラーの設定を行います。
「データソースを含むコード」を選択し、先程作成したデータソースを選択します。
コードはチュートリアル記載のものをそのまま貼り付けます。
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 エディタでのテスト」をクリックします。
まず、「接続」をクリックします。
その後、default チャンネルをサブスクライブします。
JSON 形式でデータを記載して、HTTP でイベントを発行します。
サブスクライバー側で、登録したデータが確認できました。
チュートリアルに沿って、もう一度イベントを発行します。
サブスクライバー側ではこんな感じで確認できます。
イベントを処理する中で、データソース統合によって DynamoDB にデータが登録されているはずなので、そちらを確認していきます。
まず、GraphQL API のクエリエディタに移動します。
チュートリアル 記載のクエリをコピペして実行します。
query byChannel {
queryMessagesByChannelIdIndex(channel: "/default/channel", first: 10) {
items {
channel
id
user
content
createdAt
}
}
}
無事、登録したデータを確認できました!
もちろん DynamoDB のサービスページから確認してもデータを閲覧可能です。
まとめ
AppSync Events のデータソース統合を試してみました。
実際にリアルタイムアプリケーションを作成する際を考えると、かなり扱いやすくなったように感じました。
しっかり作り込む場合は API Gateway など他の選択肢との使い分けに悩みそうですが、データを DynamoDB に書き込むくらいはやりたくなるケースも多いのでは無いでしょうか。
Websocket API を作成する際は是非 AppSync Events も検討してみて下さい!