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件のコメントがあります。