開発環境
- AWS API Gateway(WebSocket)
概要
AWSのAPI Gateway(webSocket)を実装していたとき、
$connectルート、$defaultルート、$disconnectルート、カスタムルートそれぞれにHTTPの自作APIを設定しました。
wscat -c wss://ws.sample.test
↑のコマンドで接続しようとすると
error: Unexpected server response: 400
$connectルートのときだけ400エラーが発生してしまいました。
公式を見てもなかなか解決方法が見つからずかなり苦戦したため、備忘録として残します。
結論
$connectのAPIのパラメータにSec-WebSocket-Version = 0
を設定する
"integration.request.header.Sec-WebSocket-Version": "'0'"
設定する方法
get-integrationsで$connectに設定されているIntegration IDを確認
aws apigatewayv2 get-integrations \
--api-id [API ID] \
Sec-WebSocket-Versionを設定
aws apigatewayv2 update-integration \
--integration-id [Integration ID] \ step1で取得した$connectのAPIのIntegration ID
--api-id [API ID] \
--request-parameters '{"integration.request.header.Sec-WebSocket-Version":"'"'0'"'"}'
パラメータに文字列を設定する方法はこちらを御覧ください。
Sec-WebSocket-Versionとは?
WebSock プロトコルのバージョン
現在はSec-WebSocket-Version = 13 が使われていることが多いようです
$connectにLambdaを設定したときはSec-WebSocket-Version = 13 だったのですが、
HTTPのAPIを設定するときはSec-WebSocket-Version = 0 にする必要があります
参考記事
API Gatewayについての記事
このサイトでは、AWSのAPI GatewayでwebsocketをPHPで実装した経験から、
躓くポイントやその対応方法を解説しています。
ぜひ参考にしてみてください!