在AWS ApiGatewayV2 websocket连接上发出HTTP响应请求,或者删除它

问题描述 投票:4回答:1

UPDATE

此问题已部分解决,现在的问题在于验证ApiGateway请求。我不确定如何获取与请求一起发送的必要令牌以使其有效,因为这是一个[无服务器框架]服务,因此我无法使用AWS控制台将令牌粘贴到请求的json数据中。而且,我不知道他们必须要用什么json键。所以我猜这个问题的范围发生了很大变化。


我需要在Lambda中响应/删除通过AWS ApiGatewayV2建立的活动websocket连接。如何使用节点j发送ApiGateway可以理解的POST请求?

我在the websocket support announcement video上看到你可以发出一个HTTP POST请求来响应websocket,并且DELETE请求断开websocket。来自此处转录的视频的完整表格:

Connection URL
https://abcdef.execute-api.us-west-1.amazonaws.com/env/@connections/connectionId

Operation  Action
POST       Sends a message from the Server to connected WS Client
GET        Gets the latest connection status of the connected WS Client
DELETE     Disconnect the connected client from the WS connection

(其他地方没有记载,AFAIK)

由于AWS SDK没有在ApiGatewayManagementApi上提供deleteConnection方法,我需要能够直接向ApiGateway发出请求。

const connect = async (event, context) => {
  const connection_id = event.requestContext.connectionId;
  const host = event.requestContext.domainName;
  const path = '/' + event.requestContext.stage + '/@connections/';
  const json = JSON.stringify({data: "hello world!"});

  console.log("send to " + host + path + connection_id + ":\n" + json);

  await new Promise((resolve, reject) => {
    const options = {
      host: host,
      port: '443',
      path: path + connection_id,
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Content-Length': Buffer.byteLength(json)
      }
    };
    const req = https.request(
      options,
      (res) => {
        res.on('data', (data) => {
          console.error(data.toString());
        });
        res.on('end', () => {
          console.error("request finished");
          resolve();
        });
        res.on('error', (error) => {
          console.error(error, error.stack);
          reject();
        });
      }
    );
    req.write(json);
    req.end();
  });
  return success;
};

当我使用wscat测试它时,此代码会导致console.log显示在CloudWatch中:

send to ********.execute-api.us-east-2.amazonaws.com/dev/@connections/*************:
{
    "data": "hello world!"
}

...

{
    "message": "Missing Authentication Token"
}

...

request finished

wscat说:

connected (press CTRL+C to quit)
>

但不打印hello world!或类似。

编辑

我失踪了

res.on('data', (data) => {
  console.error(data.toString());
});

在响应处理程序中,这是破坏事情。但这仍然无效。

node.js amazon-web-services aws-lambda aws-api-gateway serverless-framework
1个回答
2
投票

你可能在这里错过了两件事。

  1. 您需要根据此处的文档向API网关发出IAM签名请求:Use @connections Commands in Your Backend Service
  2. 您需要根据以下文档提供此lambda权限来调用API网关:Use IAM Authorization

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.