AWS

【AWS】 API Gateway・WebSocketの$connectルート 400エラーの解決法

開発環境

  • 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 にする必要があります

参考記事

https://stackoverflow.com/questions/67640010/api-gateway-websocket-connect-gets-a-400-from-the-http-integration-point-but-it

API Gatewayについての記事

このサイトでは、AWSのAPI GatewayでwebsocketをPHPで実装した経験から、

躓くポイントやその対応方法を解説しています。

ぜひ参考にしてみてください!

-AWS