背景
サクッと動作確認したい時にターミナルからできると便利。
AppSyncではコンソールからワンクリックでPub/subを行うWebSokect APIを作れる。
しかし簡単に作れると言っているこのチュートリアルでも、クライアント側はReactとAmplify JavaScriptである。もっと簡単に試したい。
サーバーレスを利用した汎用 Pub/Sub API の作成WebSockets
前提
- APIキー認証
- コンソールからワンクリックで作成した際のスキーマはこれ。publish(HTTPS)するとsubscribe(WSS)しているクライアントにその通知がいく。
type Channel {
name: String!
data: AWSJSON!
}
type Mutation {
publish(name: String!, data: AWSJSON!): Channel
}
type Query {
getChannel: Channel
}
type Subscription {
subscribe(name: String!): Channel
@aws_subscribe(mutations: ["publish"])
}
結果
Subscribe
一応細かい手順はこれを見ることになっている。WebSocketリアルタイムクライアントの構築
しかし実際のコマンドで試すならこちらのプライベートAPIについてのドキュメントがわかりやすかった(パブリックAPIでもコマンド自体は同じ)。
header=`echo '{"host":"<API_ID>.appsync-api.ap-northeast-1.amazonaws.com","x-api-key":"xxxxxxxxxxxxxxxxxxxxxxxxxx"}' | base64 | tr -d '\n'`
wscat -p 13 -s graphql-ws -c "wss://<API_ID>.appsync-realtime-api.ap-northeast-1.amazonaws.com/graphql?header=$header&payload=e30="
接続された後は順に以下を送信すればsubscribe完了
{"type": "connection_init"}
{"id":"tekitouid","payload":{"data":"{\"query\":\"subscription SubscribeToData ($name: String!) {subscribe (name:$name) {name data}}\",\"variables\":{\"name\":\"robots\"}}","extensions":{"authorization":{"host":"<API_ID>.appsync-api.ap-northeast-1.amazonaws.com","x-api-key":"xxxxxxxxxxxxxxxxxxxxxxxxxx"}}},"type":"start"}
これでチャンネルrobots
に送publishされたメッセージを受信する。
publish
こちらはcurl. 変数を伴うパラメータはいつもわからなくなるので。。エスケープとかクォート入れる箇所とか。
curl https://<API_ID>.appsync-api.ap-northeast-1.amazonaws.com/graphql \
-H "Content-Type:application/graphql" \
-H "x-api-key:xxxxxxxxxxxxxxxxxxxxxxxxxx" \
-d '{"query":"mutation Publish($data: AWSJSON!, $name: String!) {publish(data: $data, name: $name){data name}}","variables":{"name":"robots","data":"{\"robot\":\"r2d2\", \"planet\": \"tatooine\"}"}}'
variablesのdataは "data":{"robot":"r2d2"...}
とかでもダメで"data":"{\"robot\":\"r2d2\"...}"
というようにきっちりダブルクォートで囲んでエスケープしないとダメそうだった。