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!"
> %

https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logsV2:log-groups

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です