AWS
APIGateway

Amazon API GatewayのWebsocketを試す

はじめに

2018/12/19にAPI gatewayがwebsocketに対応したのでためしみてみます。

https://aws.amazon.com/jp/blogs/news/announcing-websocket-apis-in-amazon-api-gateway/

以下のサンプルになります。
https://github.com/aws-samples/simple-websockets-chat-app

作成する構成

image.png

クライアントからWebsocketで接続に行くと、onConnect関数が実行され、コネクションIDがDynamoDBに登録されます。
メッセージを添えてsendMessageアクションを実行すると、sendMessage関数がDynamoDBに保存されたコネクションIDに対して、メッセージを送信する。

手順

赤枠の構成をCloudFormationで作成

SAMで作成したcFnテンプレートがS3のバケットを準備しておきます。
git cloneしてSAM/cFn実行します。

git clone https://github.com/aws-samples/simple-websockets-chat-app.git
cd simple-websockets-chat-app
sam package --template-file template.yaml --output-template-file output.yaml --s3-bucket <S3バケット>
aws cloudformation deploy --template-file output.yaml --capabilities CAPABILITY_IAM --stack-name websocket-test

青枠のAPI Gatewayの構築

Create APIをクリックする。
image.png

WebSocketを選択する。
API Name: WebSocketと入力する。
Route Selection Expression:$request.body.action
Create APIをクリックする。
image.png

sendmessageルートを作成する。sendmessageと入力に右横のチェックマークをクリックする。
image.png

connectルートにonConnect関数を登録する。
Integration Requestをクリック。

image.png

Lambda FunctionにStack名-OnConnect-Functionxxxxを指定します。
image.png

上記を、disconnect/sendmessage/default分繰り返します。
defaultは、選択式がAPIルート内の他のrouteKeyに一致しない値を生成する場合に使用されます。今回は特にエラーハンドリング用の関数がないので、仮にonConnectを指定します。
何かしら紐づけておかないとAPIをデプロイするときにエラーになります。
image.png

APIをデプロイする。
image.png

APIデプロイ完了。
image.png

確認

NPMをインストールしてwscatをインストールする。

npm install -g wscat

メッセージ送信用と受信用のターミナルを開いてWebsocketで接続する

wscat -c wss://<API ID>.execute-api.<Region>.amazonaws.com/dev
connected (press CTRL+C to quit)
> 
> 

以下のJSONを入力する

{"action":"sendmessage", "data":"hello world"}

受信用のターミナルでメッセージが表示されることを確認する。

connected (press CTRL+C to quit)
< hello world
> 

お約束

投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。