在 WebSocket API Gateway 中设置 API 集成请求 - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 WebSocket API Gateway 中设置 API 集成请求

设置集成请求涉及以下内容:

  • 选择要集成到后端的路由键。

  • 指定要调用的后端端点。 WebSocket API 支持以下集成类型:

    • AWS_PROXY

    • AWS

    • HTTP_PROXY

    • HTTP

    • MOCK

    有关集成类型的更多信息,请参阅 API Gateway V2 REST API IntegrationType中的。

  • 通过指定一个或多个请求模板,配置如何根据需要将路径请求数据转换为集成请求数据。

使用 WebSocket API Gateway 控制台设置 API 集成请求

使用 WebSocket API Gateway 控制台向 API 中的路由添加集成请求
  1. 登录到 API Gateway 控制台,选择 API,然后选择路由

  2. Routes (路由) 中,选择所需路由。

  3. 选择集成请求选项卡,然后在集成请求设置部分中,选择编辑

  4. 对于集成类型,选择下列选项之一:

    • 只有当您的 API 将与您已在该账户或其他账户中创建的 Amazon Lambda 函数集成时,才选择 Lambda 函数。

      要在中创建新的 Lambda 函数 Amazon Lambda、在 Lambda 函数上设置资源权限或执行任何其他 Lambda 服务操作,请改为选择服务。Amazon

    • 如果您的 API 将与现有 HTTP 终端节点集成,请选择 HTTP。有关更多信息,请参阅 在 API Gateway 中设置 HTTP 集成

    • 如果要直接从 API Gateway 生成 API 响应,而无需集成后端,请选择模拟。有关更多信息,请参阅在 API Gateway 中设置模拟集成

    • 如果您的 API 将与Amazon 服务集成,请选择 Amazon 服务。

    • 如果您的 API 将使用 VpcLink 作为私有集成端点,请选择 VPC 链接。有关更多信息,请参阅 设置 API Gateway 私有集成

  5. 如果您选择 Lambda 函数,请执行以下操作:

    1. 对于使用 Lambda 代理集成,如果您打算使用 Lambda 代理集成跨账户 Lambda 代理集成,请选中此复选框。

    2. 对于 Lambda 函数,请通过以下方式之一指定函数:

      • 如果您的 Lambda 函数在同一账户中,请输入函数名称,然后从下拉列表中选择函数。

        注意

        函数名称可以包含(可选)其别名或版本规范,如在 HelloWorldHelloWorld:1HelloWorld:alpha 中。

      • 如果该函数位于不同账户,请输入该函数的 ARN。

    3. 要使用默认超时值 29 秒,请保持默认超时处于开启状态。要设置自定义超时,请选择默认超时,然后输入一个介于 5029000 毫秒之间的超时值。

  6. 如果您选择了 HTTP,请遵循使用 API Gateway 控制台设置 API 集成请求的步骤 4 中的说明。

  7. 如果您选择了 Mock (模拟),请继续执行 Request Templates (请求模板) 步骤。

  8. 如果您选择了 Amazon 服务,请遵循使用 API Gateway 控制台设置 API 集成请求的步骤 6 中的说明操作。

  9. 如果您选择了 VPC 链接,请执行以下操作:

    1. 对于 VPC 代理集成,如果要将请求通过代理连接到 VPCLink 的端点,请选中该复选框。

    2. 对于 HTTP method (HTTP 方法),选择与 HTTP 后端中的方法最匹配的 HTTP 方法类型。

    3. VPC 链接下拉列表中,选择一个 VPC 链接。您可以选择 [Use Stage Variables] 并在列表下方的文本框中输入 ${stageVariables.vpcLinkId}

      您可以在将 API 部署到阶段之后定义 vpcLinkId 阶段变量,并将其值设置为 VpcLink 的 ID。

    4. 对于 Endpoint URL (终端节点 URL),请输入您希望此集成使用的 HTTP 后端的 URL。

    5. 要使用默认超时值 29 秒,请保持默认超时处于开启状态。要设置自定义超时,请选择默认超时,然后输入一个介于 5029000 毫秒之间的超时值。

  10. 选择 ‬保存更改

  11. 请求模板下方,执行以下操作:

    1. 要输入模板选择表达式,请在请求模板下选择编辑

    2. 输入模板选择表达式。使用 API Gateway 在消息负载中查找的表达式。如果找到,则对其进行评估,结果是模板键值,用于选择要应用于消息负载中的数据的数据映射模板。您将在下一步中创建数据映射模板。选择编辑以保存所做更改。

    3. 选择创建模板以创建数据映射模板。对于模板密钥,输入一个模板密钥值,用于选择要应用于消息负载中的数据的数据映射模板。然后,输入映射模板。选择创建模板

      有关模板选择表达式的信息,请参阅模板选择表达式

使用设置集成请求 Amazon CLI

你可以使用 WebSocket API 中的路由设置集成请求, Amazon CLI 如以下示例所示,该示例创建了一个模拟集成:

  1. 使用以下内容创建名为 integration-params.json 的文件:

    {"PassthroughBehavior": "WHEN_NO_MATCH", "TimeoutInMillis": 29000, "ConnectionType": "INTERNET", "RequestTemplates": {"application/json": "{\"statusCode\":200}"}, "IntegrationType": "MOCK"}
  2. 运行 create-integration 命令,如以下示例所示:

    aws apigatewayv2 --region us-east-1 create-integration --api-id aabbccddee --cli-input-json file://integration-params.json

以下是此示例的示例输出:

{ "PassthroughBehavior": "WHEN_NO_MATCH", "TimeoutInMillis": 29000, "ConnectionType": "INTERNET", "IntegrationResponseSelectionExpression": "${response.statuscode}", "RequestTemplates": { "application/json": "{\"statusCode\":200}" }, "IntegrationId": "0abcdef", "IntegrationType": "MOCK" }

或者,您可以使用如下例所示为代理集成设置集成请求: Amazon CLI

  1. 在 Lambda 控制台中创建 Lambda 函数,并为其提供基本的 Lambda 执行角色。

  2. 执行 create-integration 命令,如以下示例所示:

    aws apigatewayv2 create-integration --api-id aabbccddee --integration-type AWS_PROXY --integration-method POST --integration-uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:simpleproxy-echo-e2e/invocations

以下是此示例的示例输出:

{ "PassthroughBehavior": "WHEN_NO_MATCH", "IntegrationMethod": "POST", "TimeoutInMillis": 29000, "ConnectionType": "INTERNET", "IntegrationUri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:simpleproxy-echo-e2e/invocations", "IntegrationId": "abcdefg", "IntegrationType": "AWS_PROXY" }

用于 API 代理集成的 Lambda 函数的输入格式 WebSocket

使用 Lambda 代理集成,API Gateway 可以将整个客户端请求映射到后端 Lambda 函数的输入 event 参数:以下示例显示了 API Gateway 发送到 Lambda 代理集成的$connect路径中的输入事件和 API Gateway 发送的$disconnect路由中的输入事件的结构。

Input from the $connect route
{ headers: { Host: 'abcd123.execute-api.us-east-1.amazonaws.com', 'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits', 'Sec-WebSocket-Key': '...', 'Sec-WebSocket-Version': '13', 'X-Amzn-Trace-Id': '...', 'X-Forwarded-For': '192.0.2.1', 'X-Forwarded-Port': '443', 'X-Forwarded-Proto': 'https' }, multiValueHeaders: { Host: [ 'abcd123.execute-api.us-east-1.amazonaws.com' ], 'Sec-WebSocket-Extensions': [ 'permessage-deflate; client_max_window_bits' ], 'Sec-WebSocket-Key': [ '...' ], 'Sec-WebSocket-Version': [ '13' ], 'X-Amzn-Trace-Id': [ '...' ], 'X-Forwarded-For': [ '192.0.2.1' ], 'X-Forwarded-Port': [ '443' ], 'X-Forwarded-Proto': [ 'https' ] }, requestContext: { routeKey: '$connect', eventType: 'CONNECT', extendedRequestId: 'ABCD1234=', requestTime: '09/Feb/2024:18:11:43 +0000', messageDirection: 'IN', stage: 'prod', connectedAt: 1707502303419, requestTimeEpoch: 1707502303420, identity: { sourceIp: '192.0.2.1' }, requestId: 'ABCD1234=', domainName: 'abcd1234.execute-api.us-east-1.amazonaws.com', connectionId: 'AAAA1234=', apiId: 'abcd1234' }, isBase64Encoded: false }
Input from the $disconnect route
{ headers: { Host: 'abcd1234.execute-api.us-east-1.amazonaws.com', 'x-api-key': '', 'X-Forwarded-For': '', 'x-restapi': '' }, multiValueHeaders: { Host: [ 'abcd1234.execute-api.us-east-1.amazonaws.com' ], 'x-api-key': [ '' ], 'X-Forwarded-For': [ '' ], 'x-restapi': [ '' ] }, requestContext: { routeKey: '$disconnect', disconnectStatusCode: 1005, eventType: 'DISCONNECT', extendedRequestId: 'ABCD1234=', requestTime: '09/Feb/2024:18:23:28 +0000', messageDirection: 'IN', disconnectReason: 'Client-side close frame status not set', stage: 'prod', connectedAt: 1707503007396, requestTimeEpoch: 1707503008941, identity: { sourceIp: '192.0.2.1' }, requestId: 'ABCD1234=', domainName: 'abcd1234.execute-api.us-east-1.amazonaws.com', connectionId: 'AAAA1234=', apiId: 'abcd1234' }, isBase64Encoded: false }