在 AWS ApiGatewayV2 websocket 连接上发出 HTTPs 请求以响应或删除它
Posted
技术标签:
【中文标题】在 AWS ApiGatewayV2 websocket 连接上发出 HTTPs 请求以响应或删除它【英文标题】:Making an HTTPs request on AWS ApiGatewayV2 websocket connection to Respond, or Delete it 【发布时间】:2019-08-18 19:15:59 【问题描述】:更新
此问题已部分解决,现在问题在于验证 ApiGateway 请求。我不确定如何获取必要的令牌以随请求一起发送以使其有效,因为这是一项 [serverless-framework] 服务,因此我无法使用 AWS 控制台将令牌复制粘贴到请求的 json 数据中.此外,无论如何我都不知道他们必须使用什么 json 密钥。所以我猜这个问题的范围发生了很大变化。
我需要在 Lambda 中响应/删除通过 AWS ApiGatewayV2 建立的活动 websocket 连接。如何使用node js发送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 开发工具包没有在 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());
);
在响应处理程序中,这正在破坏事物。但是,这仍然不起作用。
【问题讨论】:
您的serverless.yml
是什么样的?您介意将其添加到您的问题中吗?
【参考方案1】:
您可能在这里遗漏了两件事。
-
您需要根据此处的文档向 API 网关发出 IAM 签名请求:Use @connections Commands in Your Backend Service
您需要根据此处的文档授予此 lambda 权限才能调用 API 网关:Use IAM Authorization
我希望这会有所帮助!
【讨论】:
感谢您的回答,我已经看过这个文档页面,但它忽略了评论中最关键的部分:// Do a SigV4 and then make the call
。也许我错过了一些明显的方法来做到这一点?关于 lambda 权限,我认为我已正确设置,因为我使用无服务器框架来执行此操作。 (我认为它是自动的?)
你可以使用像aws4这样的NPM包来生成sig4请求。
非常感谢,这正是我所需要的!以上是关于在 AWS ApiGatewayV2 websocket 连接上发出 HTTPs 请求以响应或删除它的主要内容,如果未能解决你的问题,请参考以下文章