[新機能] AppSync Event APIが発表されました!
大阪オフィスの小倉です。
AppSync Event APIという機能が発表されました。
紹介には、リアルタイムのWeb/Mobileアプリケーションを構築するため、とありますね。
以下のAWS Blogとドキュメント、マネジメントコンソールから試してみてどんな機能なのかわかったことをまとめていこうと思います。
AppSync Event APIとは?
ざっくり言うと、サーバレスなWebSocketAPIサービス、のようです。
これまではAppSync = GraphQLのマネージドサービス、という印象があったのですが、従来のGraphQLとは別タイプのAPIという分類です。
ですので、Event APIの話には、GraphQLは全く登場しません。
APIタイプ
- GraphQL(従来のAppSync GraphQL)
- イベント(今回発表)
作成したEvent API内のトピック(Event APIでは名前空間
とチャンネル
:後述)を通してイベントのPub/Subが可能です。
既存の機能だと、AWS IoTのTopicを使ったPub/Subに近い印象です。
Event APIではPublishにHTTPS、SubscribeにWSSを使います。
Event APIの構成要素
上位から、以下のような構成になっています
- APIタイプ(イベントAPI)
- 名前空間
- チャンネル
実際にコンソールから作成しながら見ていきます
1.APIタイプ
AppSyncコンソールから作成していきます。
作成時にタイプを選択可能となっていて、従来のものはGraphQL API
、今回発表されたものはEvent API
を選択します。
APIを作成すると、default
という名前空間と、GraphQL APIと同様2つのエンドポイント(HTTP、リアルタイム)が作成されます。
APIのレベルでは、従来のGraphQL APIと同様に、利用する認証方法を複数種類設定し、その中でデフォルトの認証方法を決定します。
利用できる認証方法も同じで、以下が選択できます
- API_KEY
- AWS_LAMBDA
- AWS_IAM
- OPENID_CONNECT
- AMAZON_COGNITO_USER_POOLS
2.名前空間
名前空間は、いわゆるトピックのプレフィックスです。コンソールからAPIを作成した際はdefault
名前空間が作られます。
名前空間は複数作成でき、名前空間毎に、認証方法の上書き設定と、イベントハンドラーを設定できます
イベントハンドラー
イベントハンドラーは、イベントの送受信に対して追加のビジネスロジックを適用するための機能です。
JavaScriptで記述し、APPSYNC_JS
ランタイムで動作するとの事でした。
onPublish
、onSubscribe
の二種類が存在します。
onPublishイベントハンドラー
onPublish
は、イベントの送信者向けの追加ロジックです。用途として、
- イベント送信前にイベントのフィルタリング
- イベント送信前にエラー判定し、イベント送信者にエラーを返す
が紹介されていました。
以下のコード例はAWS Blogに紹介されていたものを載せています
イベントのフィルタリング例
export function onPublish(ctx) {
return ctx.events.filter(event => event.payload.odds > 0.9)
}
送信者にエラーを返す例
export function onPublish(ctx) {
return ctx.events.map(event => {
if (!event.payload.message) {
return {
...event,
error: 'You should always included a greeting.'
}
}
return event
})
}
onSubscribeイベントハンドラー
onSubscribe
は、イベントの受信者向けの追加ロジックです。クライアントがSubscribeするタイミングで呼び出されます。
用途として、条件を満たさないSubscribeを拒否する例が挙げられています
Cognitoのユーザ名と名前が一致しない場合に拒否する
export function onSubscribe(ctx) {
if (ctx.info.channel.path !== `/messages/inbox/${ctx.identity.username}`) {
console.error(`user ${ctx.identity.username} tried connecting to wrong channel: ${ctx.info.channel.path}`)
util.unauthorized()
}
}
3.チャンネル
Publish/Subscribe先の、いわゆるトピック名の名前空間に続く部分です。
名前空間と組み合わせると、<名前空間>/<チャンネル>
の形式です。
チャンネルの部分は、<名前空間>/<チャンネル階層1>/<チャンネル階層2>
のように複数階層を作ることができます。
また、Subscribeする際は、ワイルドカード*
も利用できます。
ドキュメントによると、
チャンネルは一時的なものであり、クライアントがチャネルを公開またはサブスクライブする必要があるときにオンデマンドで作成されます。
(Google翻訳)とありました。
You can only publish and subscribe to channels that belong to a defined namespace. However, a channel is ephemeral and is created on-demand when a client needs to publish or subscribe to it.
このあたりは、事前にトピックを作成しておくAWS IoT やAmazon SNSと異なる部分になっていそうです。
Pub/Subしてみる
コンソール用意されているPub/Subエディタから動作を試すことができます。
上段がPublish、下段がSubscribeの枠ですね。
先にSubscribeしておきましょう。「接続」してから、default/channel
をSubscribeします。
Publishで送信する内容をセットしてPublishすると、Subscribeで受信される様子が確認できます。
その他できること
ドキュメントから、現時点で以下が可能なようです。詳細は追って確認していこうと思います。
- Amazon EventBridgeとの統合
- カスタムドメインの設定
- AWS WAFでの保護
- CloudWatchでのロギング、モニタリング
料金
料金ページによると以下の記載がありました。
- イベントAPI操作 100万回につき$1.00
- 100万接続/分につき $0.08
- データ転送量(EC2データ転送量で計算)
また、AWSアカウントサインアップ後の無料利用枠もあるようです。
- 250,000回のAPI操作
- 600,000接続/分
まとめ
イベント駆動を支えるサービスにAppSync Event APIという新たなサービスが加わりました!
冒頭に紹介したAWS Blogの中では、連携するサービスの追加など、今後の機能追加にも言及されていたので、期待したいですね!