使用自定义域名的AWS lambda websocket实现存在POST问题



我有一个AWS API网关websocket lambda实现。我已将自定义域连接到API网关。我可以很好地连接和断开连接。但当我尝试使用AWS发布消息时。ApiGatewayManagementApi自定义域名导致问题。

I使用parms构建端点,如下所示:

const apigwManagementApi = new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29',
endpoint: event.requestContext.domainName + '/' + event.requestContext.stage
});

然后如下调用:

await apigwManagementApi.postToConnection({ ConnectionId: connectionId, Data: postData }).promise();

这导致了如下错误:

2021-01-07T09:56:12.751Z    846f4674-0ed9-422b-8b35-64f0c43a10de    INFO    NotFoundException: No method found matching route test/@connections/YxcdBcOkrPECHwA= for http method POST.
at Object.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:52:27)
at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/rest_json.js:55:8)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:688:14)
at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:690:12) {
code: 'NotFoundException',
time: 2021-01-07T09:56:12.712Z,
requestId: '43b744b9-25ef-4a15-82ed-6ecb13062208',
statusCode: 404,
retryable: false,
retryDelay: 64.57971601177839
}

然后,我更改了代码,为AWS网关端点使用硬编码值,看起来像this(为了隐私,实际id ogjkythg67m已更改(:

const apigwManagementApi = new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29',
endpoint: "https://ogjkythg67m.execute-api.eu-west-2.amazonaws.com/test"
});

这时一切都开始运转了。

因此,在使用自定义域时,我似乎无法使用event.requestContext.domainName + '/' + event.requestContext.stagevars来构建我的端点。

我真的不想把端点硬编码到代码中。是否有任何方法可以配置我的AWS API网关或lambda定义,以利用自定义域名,或以其他方式规避问题?

谢谢。

我参加聚会肯定迟到了,今天我遇到了这种情况,我只是在AWS提供的样本基础上构建的。

在那里,他们还附加了类似于之上的代码的阶段

const apigwManagementApi = new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29',
endpoint: event.requestContext.domainName + '/' + event.requestContext.stage

});

要修复此问题,只需删除附加阶段的代码

+ '/' + event.requestContext.stage

然后它可以很好地与自定义域配合使用

错误消息显示

NotFoundException: No method found matching route test/@connections/YxcdBcOkrPECHwA= for http method POST.

因此CCD_ 2以某种方式被附加到端点。看起来websocket文档证实了这一点。

记录event.requestContext.stage以自己确认。文档似乎没有涵盖这一点,因此您必须通过记录event.requestContext来检查它,看看是否提供了另一个仅包含stage的字段,或者提供一些字符串操作来剥离该路径的其余部分。

最新更新