首页 > 解决方案 > 调用 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,然后

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 检索连接。但是客户端没有收到任何消息。

在本地运行项目并使用localhosturl 时,一切都按预期工作。我在这里做错了什么?

标签: node.jswebsocketaws-lambda

解决方案


首先,正确的域endpoint

const endpoint = `${domainName}/${"dev"}`;

其次,要查看 CloudWatch 中的错误,您await需要postToConnection承诺

第三,外部服务调用 WebSocket 服务中的 REST 端点。这意味着有 2 个条目添加到 API Gateway。REST API 需要以下WebSocket API权限:

Action:
    - "execute-api:Invoke"
    - "execute-api:ManageConnections"

推荐阅读