node.js - 调用 Lambda 以向连接的 websocket 发送消息
问题描述
是否可以使用可以从单独服务中的 lambdas 调用的 lambdas 设置独立的 WebSocket 服务?
我有一个现有的系统来做一些事情,然后尝试通过在 websocket 服务中调用 lambda 来向连接的客户端广播更新,如下所示:
const lambda = new Lambda({
region: 'us-east-1',
endpoint: 'https://lambda.us-east-1.amazonaws.com'
});
lambda.invoke({
FunctionName: `dev-functionName`,
Payload: JSON.stringify({payload, clientGroup}),
InvocationType: 'Event'
});
这会触发正确的 lambda,然后
- 从 Dynamo 表中获取连接 ID
- 设置
domainName
为{api-id}.execute-api.us-east-1.amazonaws.com
- 尝试像这样向他们发送消息连接:
const ws = create(`https://${domainName}/dev/@connections/${ConnectionId}`);
// Also tried
//const ws = create(`https://${domainName}/dev`);
//const ws = create(`${domainName}/dev`);
//const ws = create(`${domainName}`);
const params:any = {
Data: JSON.stringify(payload),
ConnectionId
};
try{
return ws.postToConnection(params).promise();
} catch (err) {
if(err.statusCode == 410){
await removeConn(ConnectionId); // Delete connection from Dynamo
} else {
throw err;
}
}
该create
函数只返回:
return new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29',
endpoint: domainName
});
CloudWatch 日志表明所有功能都在成功触发和完成,没有错误。它还显示正在从 Dynamo 检索连接。但是客户端没有收到任何消息。
在本地运行项目并使用localhost
url 时,一切都按预期工作。我在这里做错了什么?
解决方案
首先,正确的域endpoint
是
const endpoint = `${domainName}/${"dev"}`;
其次,要查看 CloudWatch 中的错误,您await
需要postToConnection
承诺
第三,外部服务调用 WebSocket 服务中的 REST 端点。这意味着有 2 个条目添加到 API Gateway。REST API 需要以下WebSocket API权限:
Action:
- "execute-api:Invoke"
- "execute-api:ManageConnections"
推荐阅读
- ruby-on-rails-5.2 - link_to 中的连字符类名中断了远程:true
- amazon-web-services - 我应该在 AWS 上使用哪个服务器来部署能够动态添加具有大量共享功能的新子域的动态网站?
- javascript - 使用 Vue.js 原型返回 undefined
- python - SVD:恢复的矩阵与原始矩阵不匹配
- machine-learning - 多边形顶点的 xy 坐标数据集,用于预测内部的 xy 目标
- ios - 在 PROJECTNAME_Tests 内循环;建筑可能会产生不可靠的结果
- mysql - 在大桌子上获取最新价格
- c++ - 如何将 scoped_allocator_adaptor 与自定义分配器(包装在一个类中)一起使用,以便可以为某些类型而不是 STL 容器解包?
- java - 尝试在 Spring Data JPA 中使用 createNativeQuery 从数据库中获取计数但获取 NULL
- java - 如何重复计时器