通过在Amazon API Gateway中AWS CloudFormation模板以获得最简单的WebSocket版本。我们构建的内容由AWS Lambda函数支持,该函数直接响应发起请求的客户端。
我们在此过程中学到了很多东西,甚至最终在Stackery中使用了一个简单的解决方案来管理和部署这些简单的WebSockets之一。
AWS合作伙伴网络(APN)高级技术合作伙伴。其工具致力于简化无服务器应用程序开发。
在这篇文章中,我们使用Stackery Canvas,它允许开发人员可视地构建无服务器应用程序并自动生成CloudFormation模板。对于那些终端驱动的人来说,Stackery还提供了一个命令行界面(CLI)工具,用于部署和管理无服务器架构。
为了理解单向和双向WebSockets与Amazon API Gateway之间的区别,我们还将讨论替代方案 - 单向通信WebSocket以及通过@connections API发送给客户端的消息。
概观
我们在这篇文章中的目标是构建一个非常简单的无服务器WebSocket。由于这是一个无服务器应用程序,我们将使用Stackery可视化我们的无服务器架构并直接部署到AWS。
幸运的是,Stackery有这种WebSocket的内置资源,所以它就像将WebSocket拖放到Stackery Canvas上一样简单。要开始使用,请使用Stackery注册一个免费帐户。
我们正在构建的WebSocket类型需要启用双向通信以及路由和集成响应。这允许直接与客户端交互,而无需客户端连接ID和@connections API。
我们将在这篇文章中探讨这些配置设置,@ connectctions API等。如果您更愿意跳过详细信息并进行部署,请参阅下面的“使用Stackery进行部署”一节。
概念
在这篇文章中,我们将讨论以下概念:连接和断开连接,发送消息,路由消息,单向和双向通信,以及与Amazon API Gateway中的WebSockets一起使用的各种CloudFormation类型。
首先,正如所承诺的那样,有助于大致了解WebSockets如何与Amazon API Gateway配合使用。让我们从一般图表开始:
图1 - WebSockets如何使用Amazon API Gateway进行通信。
在我们讨论Amazon API Gateway中WebSockets的不同部分时,请参阅此图。
连接
客户端通过如下格式的Amazon API网关URI连接到WebSocket:wss:// .execute-api。.amazonaws.com / 。
一旦客户端连接到WebSocket,该连接将保持打开状态,直到客户端终止连接或直到您的后端关闭连接。当客户端通过此URI连接到WebSocket或从WebSocket断开连接时,事件数据将发送到特殊的$ connect和$ disconnect路由。
这些事件中的部分数据包括标识已连接客户端的唯一连接ID,并允许您通过@connections API直接向该客户端发送响应消息。
路由消息
客户端通过此连接发送消息与后端进行通信。在REST API中,您通常将后端中的特定操作映射到URI中的各个路径,并且客户端会将请求发送到每个URI。
要使用WebSockets实现此目的,客户端会发送格式为JSON对象的消息。JSON对象需要包含您选择用于路由的预定义密钥。让我们为这个JSON对象添加一个路由选择器:{“action”:“test”}。
您注册了一个类似“action”的JSON密钥,并且对通过WebSocket发送的每条消息的路由进行评估。使用路由密钥集,可以声明具有该路由密钥值的特定路由,例如“test”。
在CloudFormation模板中,AWS :: ApiGatewayV2 :: Api类型下的RouteSelectionExpression设置JSON路由密钥。AWS :: ApiGatewayV2 :: Route类型下的RouteKey设置路由。
在我们的示例中,我们将RouteSelectionExpression设置为“$ route.body.action”,它评估“action”键。我们在RouteKey下注册“test”,并将此路由的Target分配为AWS :: ApiGatewayV2 :: Integration。
AWS :: ApiGatewayV2 :: Integration声明后端的哪一部分将满足发送到此路由的客户端消息。稍后我们将更深入地讨论AWS :: ApiGatewayV2 :: Integration类型。
这是用于在Amazon API Gateway中创建WebSocket的片段:
这是一个用于在Amazon API Gateway中为WebSocket创建路由的片段:
通过单向或双向通信回应客户
现在我们知道如何将客户端请求发送到正确的位置,我们需要确保后端可以响应。我们的目标是直接响应发起请求的客户端,但这不是Amazon API Gateway中与WebSockets一起使用的唯一响应。
我们需要决定WebSocket的单向或双向通信。这些选项与您将响应发送回客户端的方式有关。
我们需要启用双向通信,因此我们可以直接响应客户端而无需使用@connections API。但首先,让我们评估单向通信的含义以及使用它的原因。
通过单向通信,您的后端不会直接响应客户端发送的消息。相反,当您的后端被客户端请求调用时,您的后端集成负责通过使用一个或多个客户端连接ID通过@connection API将消息发送回客户端。
图2 - WebSockets如何使用@connections API与客户端通信。
还记得那些特殊的$ connect和$ disconnect路由吗?除了通知客户端何时连接和断开与WebSocket的连接外,这些事件还允许您捕获为跟踪和与客户端交互而生成的连接ID。
要管理这些连接ID,请注册Lambda函数以处理$ connect和$ disconnect事件,并将这些连接ID存储在Amazon DynamoDB等数据库中。有关连接ID和@connections API的更多信息,请参阅文档。
这允许更复杂的通信,但增加了管理连接ID的开销。如果您只需要直接回复发送请求的同一客户端,该怎么办?这就是双向沟通的地方。
图3 - WebSockets如何直接与客户端通信。
双向通信配置允许Lambda直接响应通过WebSocket连接的客户端。我们通过提供AWS :: ApiGatewayV2 :: RouteResponse类型来启用双向通信。有关AWS :: ApiGatewayV2 :: RouteResponse类型的更多信息,请参阅文档。
这是用于在Amazon API Gateway中为WebSocket创建路由响应的片段:
后端集成
最后,我们需要一个AWS :: ApiGatewayV2 :: Integration来将所有内容绑定在一起。我们通过WebSocket连接获得客户端请求并进行路由,但我们还没有告诉路由机制将消息发送到何处。
通过集成,我们声明哪个后端部分满足路径。我们希望Lambda充当“测试”路线的后端,所以这里是CloudFormation:
图4 - 用于创建Lambda函数和Amazon API Gateway集成的代码段。
值得注意的是,选择IntegrationType为“AWS_PROXY”会使您的Lambda函数负责解析发送到WebSocket的JSON事件体,并且还必须在具有“body”键的JSON对象中格式化您的响应。
使用Stackery进行部署
编写CloudFormation不是我们的目标,但我们需要在创建此WebSocket的过程中了解很多CloudFormation类型,设置和值。
我们旅行中的这些弯路让我们看到了Stackery的座右铭:编写函数,而不是YAML。我们将使用Stackery Canvas直观地创建我们的架构,但您也可以使用Stackery CLI。
在执行任何其他操作之前,您需要创建一个Stackery帐户,将您的AWS账户链接到您的Stackery账户,并将版本控制系统链接到您的Stackery账户。本快速入门指南提供了有关如何设置的详细分步说明。
设置完成后,创建一个新堆栈:
图5 - 在您喜欢的Git提供程序中创建一个堆栈。
您可以创建新的仓库,或使用链接版本控制系统的现有仓库。我们用于函数的代码很简单:module.exports.handler = async (event) => {
console.log(JSON.stringify(event, 2));
let echo = '';
let connectionId = '';
try {
const message = JSON.parse(event.body);
console.log(message);
echo = message.echo || '';
connectionId = event.requestContext.connectionId;
console.log(connectionId);
} catch (e) {
console.log(e);
}
return {
body: "Echoing your message: " + echo };};
我们只是返回一条消息,其中包含客户端发送的JSON对象中“echo”键中的字符串。
然后,它就像拖放WebSocket一样简单。
图6 - 将WebSocket API拖放到堆栈中。
一旦WebSocket存在于Stackery Canvas上,双击即可打开配置。添加“测试”路线。
图7 - 向WebSocket API添加“测试”路由。
接下来,拖放AWS Lambda函数。通过单击“测试”路径上的手柄并拖动到功能上的手柄,将路径与功能连接起来。
最后,双击该函数以验证源路径字段是否与您正在使用的Github仓库中的代码位置匹配。
图8 - 创建并集成Lambda函数以处理“测试”路由消息。
现在,您已准备好部署。转到Stackery中的Deploy部分并准备新部署。为您打包代码后,单击“部署”,然后重定向到CloudFormation控制台。
您也可以使用Stackery CLI轻松地使用本地环境中的AWS凭据在一个步骤中进行部署。
单击“执行”并监视CloudFormation何时完成。
图9 - 将堆栈部署到您的AWS账户。
最后,在堆栈完成创建后,单击Stackery仪表板中的Viewback。
通过双击Stackery Canvas中的API网关资源来检索已部署的WebSocket的URI。
图10 - 查看新部署的WebSocket API的属性。
您可以使用wscat之类的工具通过此URI进行连接,并将消息发送到Lambda函数,该函数只是回显“echo”键中的值。
图11 - 向API的测试路由发送消息。
您可以选择将所有这些模板更改直接提交到链接的版本控制系统。
图12 - 在Git仓库中保存堆栈。
有了它,您就可以使用基本的WebSocket与客户进行交互。
摘要
通过本指南,我们在Amazon API Gateway中创建了最简单的无服务器WebSocket,可以直接与通过WebSocket发送消息的客户端进行通信。我们还探讨了如何通过@connections API管理客户端连接和向客户端发送消息。
通过使用Stackery,我们可以跳过编写自己的AWS CloudFormation模板。相反,我们直接转向部署我们的双向启用的WebSocket,我们可以专注于为后端Lambda函数编写代码。
有关Amazon API Gateway中WebSockets的更多信息,请参阅文档。请务必在Twitter上关注Stackery,以了解最新功能并收听他们的直播活动。