WebSocketのサーバーを自前で用意すると、スケールするのが手間だったり、コストが大きくなったりするので、API GatewayでWebSocketを繋げて、バックエンドは既存アプリ等のAPIで処理できないか試してみました。
先に結論。コネクションID(connectionId。接続毎に発行され、サーバーからの通知に使う)が統合タイプHTTPだと取れないので、LambdaからAPI呼び出すしかなさそう。
画面からは設定できませんが、awsコマンドでリクエストパラメータを追加できます。
$defaultの統合レスポンスを設定すればレスポンスを返せるので、これは使えるかもしれない。($connect/$disconnectは設定しても返らない)
API Gatewayの設定
https://ap-northeast-1.console.aws.amazon.com/apigateway/main/apis?region=ap-northeast-1
APIタイプを選択 WebSocket API [構築]
Step1. APIの詳細を指定する API名: websocket-test <- 解りやすい名前を設定 ルート選択式: request.body.action [次へ]
Step2. ルートを追加 [$connectルートを追加] [$disconnectルートを追加] [$defaultルートを追加] [次へ]
Step3. 統合をアタッチする 統合タイプ: HTTP メソッド: POST URLエンドポイント: http://140.227.125.203/ws/test.php <- 今回はテストなので同じURLにしました ×3回繰り返す [次へ]
Step4. ステージを追加 ステージ名: production <- デフォルトのまま。URLに入るので変更したい場合は変える [次へ]
Step5. 確認して作成 [作成してデプロイ]
作成完了
ダッシュボードに移動して、WebSocket URLをコピペ(以降のリクエストで使う)
wscatで接続してみる
wscatをインストール(Macの場合)
$ npm install -g wscat $ wscat -V > 5.1.0
コピペしたURLに接続
% wscat -c wss://etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com/production/ error: Unexpected server response: 404 > %
HTTPリクエスト先がない(404を返している)ので接続できない。
HTTPリクエスト先を作成
URLエンドポイントで指定したリクエストを受けられるようにします。
ヘッダとbodyを見たいので、ログに出力するようにプログラムを書きます。
対象サーバーで
$ mkdir /usr/share/nginx/html/ws $ cd /usr/share/nginx/html/ws $ vi test.php
<?php error_log(print_r($_SERVER, true)); error_log(print_r(file_get_contents('php://input'), true)); echo "OK"; ?>
wscatで接続してみる
% wscat -c wss://etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com/production/ Connected (press CTRL+C to quit) > hello > %
対象サーバーで
# cat /var/log/php-fpm/www-error.log [27-Feb-2022 11:51:01 Asia/Tokyo] Array ( [USER] => nginx [HOME] => /home/nginx [HTTP_CONNECTION] => Keep-Alive [HTTP_HOST] => 140.227.125.203 [HTTP_CONTENT_LENGTH] => 0 [HTTP_X_AMZN_APIGATEWAY_API_ID] => etg4aa87d6 [HTTP_USER_AGENT] => AmazonAPIGateway_etg4aa87d6 [HTTP_X_FORWARDED_PROTO] => https [HTTP_X_FORWARDED_PORT] => 443 [HTTP_X_FORWARDED_FOR] => 193.119.157.143 [HTTP_X_AMZN_TRACE_ID] => Root=1-621ae715-25f1811c457e355064546bc4 [HTTP_SEC_WEBSOCKET_VERSION] => 13 [HTTP_SEC_WEBSOCKET_KEY] => wSi7mFy2FlRzUozU9clxXw== [HTTP_SEC_WEBSOCKET_EXTENSIONS] => permessage-deflate; client_max_window_bits [PATH_TRANSLATED] => /usr/share/nginx/html [PATH_INFO] => [SCRIPT_FILENAME] => /usr/share/nginx/html/ws/test.php [REDIRECT_STATUS] => 200 [SERVER_NAME] => _ [SERVER_PORT] => 80 [SERVER_ADDR] => 140.227.125.203 [REMOTE_PORT] => 24358 [REMOTE_ADDR] => xx.xx.xx.xx [SERVER_SOFTWARE] => nginx/1.16.1 [GATEWAY_INTERFACE] => CGI/1.1 [REQUEST_SCHEME] => http [SERVER_PROTOCOL] => HTTP/1.1 [DOCUMENT_ROOT] => /usr/share/nginx/html [DOCUMENT_URI] => /ws/test.php [REQUEST_URI] => /ws/test.php [SCRIPT_NAME] => /ws/test.php [CONTENT_LENGTH] => 0 [CONTENT_TYPE] => [REQUEST_METHOD] => POST [QUERY_STRING] => [FCGI_ROLE] => RESPONDER [PHP_SELF] => /ws/test.php [REQUEST_TIME_FLOAT] => 1645930261.2585 [REQUEST_TIME] => 1645930261 ) [27-Feb-2022 11:51:01 Asia/Tokyo]
$connectのログ。コネクションID(connectionId)がない。端末を特定できない。
HTTP_X_AMZN_TRACE_IDは、ELBのtrace_id。
それっぽいのはHTTP_SEC_WEBSOCKET_KEYだけど、コネクションIDではない。以降で確認します。
[27-Feb-2022 11:51:18 Asia/Tokyo] Array ( [USER] => nginx [HOME] => /home/nginx [HTTP_CONNECTION] => Keep-Alive [HTTP_HOST] => 140.227.125.203 [HTTP_CONTENT_TYPE] => application/json; charset=UTF-8 [HTTP_CONTENT_LENGTH] => 5 [HTTP_X_AMZN_APIGATEWAY_API_ID] => etg4aa87d6 [HTTP_USER_AGENT] => AmazonAPIGateway_etg4aa87d6 [PATH_TRANSLATED] => /usr/share/nginx/html [PATH_INFO] => [SCRIPT_FILENAME] => /usr/share/nginx/html/ws/test.php [REDIRECT_STATUS] => 200 [SERVER_NAME] => _ [SERVER_PORT] => 80 [SERVER_ADDR] => 140.227.125.203 [REMOTE_PORT] => 19408 [REMOTE_ADDR] => xx.xx.xx.xx [SERVER_SOFTWARE] => nginx/1.16.1 [GATEWAY_INTERFACE] => CGI/1.1 [REQUEST_SCHEME] => http [SERVER_PROTOCOL] => HTTP/1.1 [DOCUMENT_ROOT] => /usr/share/nginx/html [DOCUMENT_URI] => /ws/test.php [REQUEST_URI] => /ws/test.php [SCRIPT_NAME] => /ws/test.php [CONTENT_LENGTH] => 5 [CONTENT_TYPE] => application/json; charset=UTF-8 [REQUEST_METHOD] => POST [QUERY_STRING] => [FCGI_ROLE] => RESPONDER [PHP_SELF] => /ws/test.php [REQUEST_TIME_FLOAT] => 1645930278.2838 [REQUEST_TIME] => 1645930278 ) [27-Feb-2022 11:51:18 Asia/Tokyo] hello
$defaultのログ。入力した[hello]はbodyに入ってくる。
$connectと紐付けられそうなものはない。
[27-Feb-2022 11:51:21 Asia/Tokyo] Array ( [USER] => nginx [HOME] => /home/nginx [HTTP_CONNECTION] => Keep-Alive [HTTP_HOST] => 140.227.125.203 [HTTP_CONTENT_LENGTH] => 0 [HTTP_X_AMZN_APIGATEWAY_API_ID] => etg4aa87d6 [HTTP_USER_AGENT] => AmazonAPIGateway_etg4aa87d6 [HTTP_X_RESTAPI] => [HTTP_X_FORWARDED_FOR] => [HTTP_X_API_KEY] => [PATH_TRANSLATED] => /usr/share/nginx/html [PATH_INFO] => [SCRIPT_FILENAME] => /usr/share/nginx/html/ws/test.php [REDIRECT_STATUS] => 200 [SERVER_NAME] => _ [SERVER_PORT] => 80 [SERVER_ADDR] => 140.227.125.203 [REMOTE_PORT] => 2486 [REMOTE_ADDR] => xx.xx.xx.xx [SERVER_SOFTWARE] => nginx/1.16.1 [GATEWAY_INTERFACE] => CGI/1.1 [REQUEST_SCHEME] => http [SERVER_PROTOCOL] => HTTP/1.1 [DOCUMENT_ROOT] => /usr/share/nginx/html [DOCUMENT_URI] => /ws/test.php [REQUEST_URI] => /ws/test.php [SCRIPT_NAME] => /ws/test.php [CONTENT_LENGTH] => 0 [CONTENT_TYPE] => [REQUEST_METHOD] => POST [QUERY_STRING] => [FCGI_ROLE] => RESPONDER [PHP_SELF] => /ws/test.php [REQUEST_TIME_FLOAT] => 1645930281.4446 [REQUEST_TIME] => 1645930281 ) [27-Feb-2022 11:51:21 Asia/Tokyo]
$disconnectのログ。同様に$connectと紐付けられそうなものはない。
同じだと、ルート($connect/$disconnect/$default)の特定も明確にできないので、パスを変えるか、メソッド(GET/DELETE/POST)を変えた方が良さそう。
イベントが多い場合、カスタムルートで分けても良いけど、リクエストのJSONでの分岐で複雑にならないなら$default使った方がシンプルになりそう。
統合レスポンスを試す
コネクションID確認する前に、レスポンスをユーザーに返せるか試します。
$connect/$disconnect/$default ※各ルートでそれぞれ追加 [統合レスポンスの追加]
APIのデプロイ デプロイされるステージ: production [デプロイ]
wscatで接続してみる
% wscat -c wss://etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com/production/ Connected (press CTRL+C to quit) > hello < OK > %
サーバーで返しているOKが返りますが1つだけ。
$defaultのみ返却され、$connect/$disconnectは返らないようです。
コネクションIDを確認してみる
LambdaでコネクションID(connectionId)が取れるか確認してみます。
Lambda関数を作成
https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/create/function
関数の作成 関数名: websocket-test <- 解りやすい名前を設定 ランタイム: Node.js 14.x <- Nodeにしてみました。LambdaのシャアはPyhonとNodeが多いみたいね。 [関数の作成]
exports.handler = async (event) => { + console.dir(event); // TODO implement const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
API Gatewayに設定
$connect/$disconnect/$default ※各ルートでそれぞれ追加 [統合リクエスト]
$connect/$disconnect/$default ※各ルートでそれぞれ追加 統合タイプ: Lambda関数 Lambda関数: websocket-test <- 上記で作成した関数名 [保存]
APIのデプロイ デプロイされるステージ: production [デプロイ]
wscatで接続してみる
% wscat -c wss://etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com/production/ Connected (press CTRL+C to quit) > hello < "Hello from Lambda!" > %
2022-02-27T14:41:43.732+09:00 START RequestId: eb4d6ec0-8d2c-4cdb-b415-5933038bd355 Version: $LATEST 2022-02-27T14:41:43.774+09:00 { 2022-02-27T14:41:43.774+09:00 headers: { 2022-02-27T14:41:43.774+09:00 Host: 'etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com', 2022-02-27T14:41:43.774+09:00 'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits', 2022-02-27T14:41:43.774+09:00 'Sec-WebSocket-Key': 'jOvMJuQ4OqpY48kDm88lmQ==', 2022-02-27T14:41:43.774+09:00 'Sec-WebSocket-Version': '13', 2022-02-27T14:41:43.774+09:00 'X-Amzn-Trace-Id': 'Root=1-621b0f17-540b1dea3e33ae8441da78d8', 2022-02-27T14:41:43.774+09:00 'X-Forwarded-For': 'xx.xx.xx.xx', 2022-02-27T14:41:43.774+09:00 'X-Forwarded-Port': '443', 2022-02-27T14:41:43.774+09:00 'X-Forwarded-Proto': 'https' 2022-02-27T14:41:43.774+09:00 }, 2022-02-27T14:41:43.774+09:00 multiValueHeaders: { 2022-02-27T14:41:43.774+09:00 Host: [ 'etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com' ], 2022-02-27T14:41:43.774+09:00 'Sec-WebSocket-Extensions': [ 'permessage-deflate; client_max_window_bits' ], 2022-02-27T14:41:43.774+09:00 'Sec-WebSocket-Key': [ 'jOvMJuQ4OqpY48kDm88lmQ==' ], 2022-02-27T14:41:43.774+09:00 'Sec-WebSocket-Version': [ '13' ], 2022-02-27T14:41:43.774+09:00 'X-Amzn-Trace-Id': [ 'Root=1-621b0f17-540b1dea3e33ae8441da78d8' ], 2022-02-27T14:41:43.774+09:00 'X-Forwarded-For': [ 'xx.xx.xx.xx' ], 2022-02-27T14:41:43.774+09:00 'X-Forwarded-Port': [ '443' ], 2022-02-27T14:41:43.774+09:00 'X-Forwarded-Proto': [ 'https' ] 2022-02-27T14:41:43.774+09:00 }, 2022-02-27T14:41:43.774+09:00 requestContext: { 2022-02-27T14:41:43.774+09:00 routeKey: '$connect', 2022-02-27T14:41:43.774+09:00 eventType: 'CONNECT', 2022-02-27T14:41:43.774+09:00 extendedRequestId: 'OL9LsHyitjMFowQ=', 2022-02-27T14:41:43.774+09:00 requestTime: '27/Feb/2022:05:41:43 +0000', 2022-02-27T14:41:43.774+09:00 messageDirection: 'IN', 2022-02-27T14:41:43.774+09:00 stage: 'production', 2022-02-27T14:41:43.774+09:00 connectedAt: 1645940503445, 2022-02-27T14:41:43.774+09:00 requestTimeEpoch: 1645940503446, 2022-02-27T14:41:43.774+09:00 identity: { sourceIp: 'xx.xx.xx.xx' }, 2022-02-27T14:41:43.774+09:00 requestId: 'OL9LsHyitjMFowQ=', 2022-02-27T14:41:43.774+09:00 domainName: 'etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com', 2022-02-27T14:41:43.774+09:00 connectionId: 'OL9Lsfq6NjMCJKg=', 2022-02-27T14:41:43.774+09:00 apiId: 'etg4aa87d6' 2022-02-27T14:41:43.774+09:00 }, 2022-02-27T14:41:43.774+09:00 isBase64Encoded: false 2022-02-27T14:41:43.774+09:00 } 2022-02-27T14:41:43.795+09:00 END RequestId: eb4d6ec0-8d2c-4cdb-b415-5933038bd355 2022-02-27T14:41:43.795+09:00 REPORT RequestId: eb4d6ec0-8d2c-4cdb-b415-5933038bd355 Duration: 62.01 ms Billed Duration: 63 ms Memory Size: 128 MB Max Memory Used: 56 MB Init Duration: 164.45 ms
$connectのログ。headers.Sec-WebSocket-Key(HTTP_SEC_WEBSOCKET_KEY)とrequestContext.connectionIdは違う値。
2022-02-27T14:41:48.041+09:00 START RequestId: 5cc28f9a-137a-47b0-97b8-690cc28e3ae7 Version: $LATEST 2022-02-27T14:41:48.046+09:00 { 2022-02-27T14:41:48.046+09:00 requestContext: { 2022-02-27T14:41:48.046+09:00 routeKey: '$default', 2022-02-27T14:41:48.046+09:00 messageId: 'OL9MafsBNjMCJKg=', 2022-02-27T14:41:48.046+09:00 eventType: 'MESSAGE', 2022-02-27T14:41:48.046+09:00 extendedRequestId: 'OL9MaFKINjMFhSw=', 2022-02-27T14:41:48.046+09:00 requestTime: '27/Feb/2022:05:41:48 +0000', 2022-02-27T14:41:48.046+09:00 messageDirection: 'IN', 2022-02-27T14:41:48.046+09:00 stage: 'production', 2022-02-27T14:41:48.046+09:00 connectedAt: 1645940503445, 2022-02-27T14:41:48.046+09:00 requestTimeEpoch: 1645940508025, 2022-02-27T14:41:48.046+09:00 identity: { sourceIp: 'xx.xx.xx.xx' }, 2022-02-27T14:41:48.046+09:00 requestId: 'OL9MaFKINjMFhSw=', 2022-02-27T14:41:48.046+09:00 domainName: 'etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com', 2022-02-27T14:41:48.046+09:00 connectionId: 'OL9Lsfq6NjMCJKg=', 2022-02-27T14:41:48.046+09:00 apiId: 'etg4aa87d6' 2022-02-27T14:41:48.046+09:00 }, 2022-02-27T14:41:48.046+09:00 body: 'hello', 2022-02-27T14:41:48.046+09:00 isBase64Encoded: false 2022-02-27T14:41:48.046+09:00 } 2022-02-27T14:41:48.047+09:00 END RequestId: 5cc28f9a-137a-47b0-97b8-690cc28e3ae7 2022-02-27T14:41:48.047+09:00 REPORT RequestId: 5cc28f9a-137a-47b0-97b8-690cc28e3ae7 Duration: 1.48 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 56 MB
$defaultのログ。requestContext.connectionIdは$connectと同じ値なので、どの接続が送ったか判断できる。
2022-02-27T14:41:50.868+09:00 START RequestId: bfe8b8f4-76da-4825-9c44-b25566ab67d7 Version: $LATEST 2022-02-27T14:41:50.872+09:00 { 2022-02-27T14:41:50.872+09:00 headers: { 2022-02-27T14:41:50.872+09:00 Host: 'etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com', 2022-02-27T14:41:50.872+09:00 'x-api-key': '', 2022-02-27T14:41:50.872+09:00 'X-Forwarded-For': '', 2022-02-27T14:41:50.872+09:00 'x-restapi': '' 2022-02-27T14:41:50.872+09:00 }, 2022-02-27T14:41:50.872+09:00 multiValueHeaders: { 2022-02-27T14:41:50.872+09:00 Host: [ 'etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com' ], 2022-02-27T14:41:50.872+09:00 'x-api-key': [ '' ], 2022-02-27T14:41:50.872+09:00 'X-Forwarded-For': [ '' ], 2022-02-27T14:41:50.872+09:00 'x-restapi': [ '' ] 2022-02-27T14:41:50.872+09:00 }, 2022-02-27T14:41:50.872+09:00 requestContext: { 2022-02-27T14:41:50.872+09:00 routeKey: '$disconnect', 2022-02-27T14:41:50.872+09:00 disconnectStatusCode: 1005, 2022-02-27T14:41:50.872+09:00 eventType: 'DISCONNECT', 2022-02-27T14:41:50.872+09:00 extendedRequestId: 'OL9M2HdINjMFsng=', 2022-02-27T14:41:50.872+09:00 requestTime: '27/Feb/2022:05:41:50 +0000', 2022-02-27T14:41:50.872+09:00 messageDirection: 'IN', 2022-02-27T14:41:50.872+09:00 disconnectReason: 'Client-side close frame status not set', 2022-02-27T14:41:50.872+09:00 stage: 'production', 2022-02-27T14:41:50.872+09:00 connectedAt: 1645940503445, 2022-02-27T14:41:50.872+09:00 requestTimeEpoch: 1645940510848, 2022-02-27T14:41:50.872+09:00 identity: { sourceIp: 'xx.xx.xx.xx' }, 2022-02-27T14:41:50.872+09:00 requestId: 'OL9M2HdINjMFsng=', 2022-02-27T14:41:50.872+09:00 domainName: 'etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com', 2022-02-27T14:41:50.872+09:00 connectionId: 'OL9Lsfq6NjMCJKg=', 2022-02-27T14:41:50.872+09:00 apiId: 'etg4aa87d6' 2022-02-27T14:41:50.872+09:00 }, 2022-02-27T14:41:50.872+09:00 isBase64Encoded: false 2022-02-27T14:41:50.872+09:00 } 2022-02-27T14:41:50.873+09:00 END RequestId: bfe8b8f4-76da-4825-9c44-b25566ab67d7 2022-02-27T14:41:50.873+09:00 REPORT RequestId: bfe8b8f4-76da-4825-9c44-b25566ab67d7 Duration: 1.47 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 56 MB
$disconnectのログ。requestContext.connectionIdは$connectと同じ値。
requestContext.routeKeyに$connect/$disconnect/$defaultと入っているので、Lambdaは1つでもルートを区別できる。
結論
コネクションID(connectionId。接続毎に発行され、サーバーからの通知に使う)が統合タイプHTTPだと取れないので、LambdaからAPI呼び出すしかなさそう。
→ 画面からは設定できませんが、awsコマンドでリクエストパラメータを追加できます。
$defaultの統合レスポンスを設定すればレスポンスを返せるので、これは使えるかもしれない。($connect/$disconnectは設定しても返らない)
追記:awsコマンドでリクエストパラメータを追加
こちらを参考に設定しましたが、integration-idがどれか解らずハマりましたが、get-integrationsで取得できました。
管理画面のURLの最後の部分(下記だとh1w9rxd)かと思いましたが違いました。
> https://ap-northeast-1.console.aws.amazon.com/apigateway/home?region=ap-northeast-1#/apis/etg4aa87d6/routes/h1w9rxd
WebSocket API のデータマッピングの設定 - Amazon API Gateway
awsコマンドのインストールや設定は割愛します。
integration-id取得
※api-idはAPI一覧のID(WebSocket URLのサブドメインで使用しているのと同じ値)
% aws apigatewayv2 get-integrations --api-id etg4aa87d6 { "Items": [ { "ConnectionType": "INTERNET", "IntegrationId": "jebaa5t", "IntegrationMethod": "DELETE", "IntegrationType": "HTTP_PROXY", "IntegrationUri": "http://140.227.125.203/ws/test.php", "PassthroughBehavior": "WHEN_NO_MATCH", "PayloadFormatVersion": "1.0", "TimeoutInMillis": 29000 }, { "ConnectionType": "INTERNET", "IntegrationId": "jythj8g", "IntegrationMethod": "POST", "IntegrationType": "HTTP_PROXY", "IntegrationUri": "http://140.227.125.203/ws/test.php", "PassthroughBehavior": "WHEN_NO_MATCH", "PayloadFormatVersion": "1.0", "TimeoutInMillis": 29000 }, { "ConnectionType": "INTERNET", "IntegrationId": "t3j407f", "IntegrationMethod": "GET", "IntegrationType": "HTTP_PROXY", "IntegrationUri": "http://140.227.125.203/ws/test.php", "PassthroughBehavior": "WHEN_NO_MATCH", "PayloadFormatVersion": "1.0", "TimeoutInMillis": 29000 } ] }
どれが$connect/$disconnect/$defaultか設定の違いからしか解りませんね。
上記のIntegrationIdすべてにリクエストパラメータを追加
% aws apigatewayv2 update-integration --api-id etg4aa87d6 \ --integration-id jebaa5t \ --request-parameters 'integration.request.header.connectionId'='context.connectionId' { "ConnectionType": "INTERNET", "IntegrationId": "jebaa5t", "IntegrationMethod": "DELETE", "IntegrationType": "HTTP_PROXY", "IntegrationUri": "http://140.227.125.203/ws/test.php", "PassthroughBehavior": "WHEN_NO_MATCH", "PayloadFormatVersion": "1.0", "RequestParameters": { "integration.request.header.connectionId": "context.connectionId" }, "TimeoutInMillis": 29000 } % aws apigatewayv2 update-integration --api-id etg4aa87d6 \ --integration-id jythj8g \ --request-parameters 'integration.request.header.connectionId'='context.connectionId' { "ConnectionType": "INTERNET", "IntegrationId": "jythj8g", "IntegrationMethod": "POST", "IntegrationType": "HTTP_PROXY", "IntegrationUri": "http://140.227.125.203/ws/test.php", "PassthroughBehavior": "WHEN_NO_MATCH", "PayloadFormatVersion": "1.0", "RequestParameters": { "integration.request.header.connectionId": "context.connectionId" }, "TimeoutInMillis": 29000 } % aws apigatewayv2 update-integration --api-id etg4aa87d6 \ --integration-id t3j407f \ --request-parameters 'integration.request.header.connectionId'='context.connectionId' { "ConnectionType": "INTERNET", "IntegrationId": "t3j407f", "IntegrationMethod": "GET", "IntegrationType": "HTTP_PROXY", "IntegrationUri": "http://140.227.125.203/ws/test.php", "PassthroughBehavior": "WHEN_NO_MATCH", "PayloadFormatVersion": "1.0", "RequestParameters": { "integration.request.header.connectionId": "context.connectionId" }, "TimeoutInMillis": 29000 }
awsコマンドでデプロイ
update-integrationしただけでは反映されないので、画面でAPIデプロイを押すか、awsコマンドでデプロイ+ステージする必要があります。
折角なので、awsコマンドでやってみました。
こちらに記載されている手順のままでOK
API ゲートウェイでの WebSocket API のデプロイ - Amazon API Gateway
% aws apigatewayv2 create-deployment --api-id etg4aa87d6 { "AutoDeployed": false, "CreatedDate": "2022-03-09T01:53:28+00:00", "DeploymentId": "6cykfp", "DeploymentStatus": "DEPLOYED" } % aws apigatewayv2 update-stage --api-id etg4aa87d6 --deployment-id 6cykfp --stage-name production { "CreatedDate": "2022-02-28T01:48:37+00:00", "DefaultRouteSettings": { "DataTraceEnabled": false, "DetailedMetricsEnabled": false, "LoggingLevel": "OFF" }, "DeploymentId": "6cykfp", "LastUpdatedDate": "2022-03-09T01:57:16+00:00", "RouteSettings": {}, "StageName": "production", "StageVariables": {}, "Tags": {} }
wscatで接続してみる
% wscat -c wss://etg4aa87d6.execute-api.ap-northeast-1.amazonaws.com/production/ Connected (press CTRL+C to quit) > hello < OK > %
対象サーバーで
# cat /var/log/php-fpm/www-error.log <省略> [HTTP_CONNECTIONID] => OsaTQcplNjMCKZg=
上記が3つ(接続、送信、切断)追加されました。OKですね。
“API Gateway(WebSocket API)の統合タイプHTTPを試す” に対して1件のコメントがあります。