【问题标题】:AWS lambda websocket implementation using custom domain name has POST issues使用自定义域名的 AWS lambda websocket 实现存在 POST 问题
【发布时间】:2021-04-13 01:54:51
【问题描述】:

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

正在使用 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.stage 变量来构建我的端点。

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

谢谢。

【问题讨论】:

    标签: amazon-web-services websocket aws-lambda aws-api-gateway


    【解决方案1】:

    错误信息说

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

    所以/@connections/YxcdBcOkrPECHwA= 以某种方式被附加到端点。看起来websocket documenation 证实了这一点。

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

    【讨论】:

    • 谢谢亨利。这是意料之中的 - 它会在每个 POST 请求的末尾弹出 /@connections/{connectionId} 。该过程的那一部分很好 - 如果我为 {domainName}/{stage} 提供硬编码值,那么整个过程都可以正常工作,因此 /@connections... 的附加是必要的。如果我使用 event.requestContext.domainName 值(设置为我的自定义域名),它就不起作用。
    • 如果您登录event.requestContext.domainName,它是否打印出与您硬编码的域完全相同的内容?最好看到将值与硬编码等效项并排记录。
    • event.requestContext.domainName 值是自定义域名(例如 mydomain.com) - 这是具体问题。该值不起作用。可以从自定义域名和 AWS 默认域名访问 ws API。 AWS 名称有效,自定义名称无效。每个格式都是“正确的”,但是当我使用自定义格式时,AWS 无法应对。
    • 我认为custom domain documentation 暗示如果您没有 具有基本路径映射,则自定义域映射到API 的完整基本URL(包括阶段)。这意味着您将在使用自定义域时完全删除路径的阶段部分。您是否使用任何基本路径映射?
    • 谢谢亨利 - 我尝试了各种字符串组合来让自定义域正常工作。最后,我选择使用本地 AWS 端点 url,即使入站流量通过自定义域名路由到达,它也适用于出站流量。感谢您的帮助。
    【解决方案2】:

    我敢肯定,我参加聚会迟到了, 今天发生在我身上,我刚刚建立在 AWS 提供的示例之上。

    他们还像上面的代码一样附加舞台

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

    });

    要修复,您只需删除附加阶段的代码

     + '/' + event.requestContext.stage
    

    然后它可以与自定义域一起正常工作

    【讨论】:

      猜你喜欢
      • 2017-12-17
      • 2021-02-10
      • 2020-11-02
      • 2019-07-30
      • 2017-05-18
      • 2022-07-22
      • 2021-05-23
      • 2017-12-07
      • 2022-12-06
      相关资源
      最近更新 更多