本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将 Amazon API Gateway 与亚马逊 SQS 集成以处理异步 REST APIs
由纳塔利娅·科兰托尼奥·法韦罗(AWS)和古斯塔沃·马蒂姆(AWS)创作
摘要
部署 REST 时 APIs,有时需要公开客户端应用程序可以发布的消息队列。例如,您可能遇到第三方延迟 APIs 和响应延迟的问题,或者您可能希望避免数据库查询的响应时间,或者避免在存在大量并发请求时扩展服务器 APIs。在这些情况下,发布到队列的客户端应用程序只需要知道 API 已收到数据,而不是在收到数据后会发生什么。
此模式使用亚马逊 API Gateway 向亚马逊简单队列服务 (Amazon SQS) Simple Q ueue Service 发送消息来创建 REST API 终端节点。它在两个服务之间创建了 easy-to-implement集成,从而避免了直接访问 SQS 队列。
先决条件和限制
架构
该图说明了以下步骤:
使用 Postman、其他 API 或其他技术等工具请求 POST REST API 端点。
API Gateway 在队列中发布一条消息,该消息在请求正文中接收。
Amazon SQS 收到消息并向 API Gateway 发送答案,并附上成功或失败代码。
操作说明
Task | 描述 | 所需技能 |
---|
创建队列。 | 要创建接收来自 REST API 的消息的 SQS 队列,请执行以下操作: | 应用程序开发人员 |
Task | 描述 | 所需技能 |
---|
创建一个 IAM 角色。 | 此 IAM 角色授予 API Gateway 资源对亚马逊 SQS 的完全访问权限。 使用 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。 在导航窗格中,选择 Roles(角色)和 Create role(创建角色)。 对于 Trusted entity type(可信实体类型),选择 AWS 服务。 对于用例,从下拉列表中选择 API Gatew ay,然后选择下一步,下一步。 在角色名称中,输入 AWSGatewayRoleForSQS 和可选描述,然后选择创建角色。 在 “角色” 窗格中,搜索 S AWSGatewayRoleForQS,然后选中其复选框。 在权限策略部分中,选择添加权限、附加策略。 搜索 Amazon A SQSFull cces s 并将其选中。 选择添加权限。 在 AWSGatewayRoleForSQS 的 “摘要” 部分,复制亚马逊资源编号 (ARN)。您将在后面的步骤中使用此 ID。
| 应用程序开发者、AWS 管理员 |
Task | 描述 | 所需技能 |
---|
创建 REST API。 | 这是 HTTP 请求发送到的 REST API。 | 应用程序开发人员 |
将 API Gateway 连接到亚马逊 SQS。 | 此步骤允许消息从 HTTP 请求正文内部流向 Amazon SQS。 在 API Gateway 控制台上,选择您创建的 API。 在 “资源” 页面的 “方法” 部分,选择 “创建方法”。 对于方法类型,选择 POST。 对于集成类型,选择AWS 服务。 对于 AWS 区域,请选择您创建 SQS 队列的区域。 对于 AWS 服务,选择简单队列服务 (SQS) Simple Q ueue Service。 对于 HTTP 方法,请选择 P OST。 对于 “操作类型”,选择 “使用路径覆盖”。 对于 “路径覆盖”,输入/<AWS account ID><name of SQS queue>。 对于执行角色,请粘贴您之前创建的角色的 ARN。 选择创建方法。
| 应用程序开发人员 |
Task | 描述 | 所需技能 |
---|
测试 REST API。 | 运行测试以检查是否缺少配置: 在 API Gateway 控制台上,选择您创建的 REST API。 在资源窗格中,选择 POST 方法。 选择测试选项卡。(如果未显示选项卡,请使用向右箭头。) 在请求正文中,粘贴以下 JSON 代码: {
"message": "lorem ipsum"
}
选择测试。 您将收到类似于以下内容的错误: <UnknownOperationException/>
| 应用程序开发人员 |
更改 API 集成,将请求正确转发给 Amazon SQS。 | 完成配置以修复集成错误: 在 API Gateway 控制台上,选择您创建的 API,然后选择 POST。 方法执行部分显示了 API Gateway 和 Amazon SQS 之间的直观映射。在此部分中,选择集成请求,然后选择编辑。 展开 HTTP 标头部分,然后选择添加请求标头参数。 展开 “映射模板” 部分。 选择 Add mapping template (添加映射模板)。 对于内容类型,输入 application /j son。 对于模板正文,请粘贴以下代码: Action=SendMessage&MessageBody=$input.body
选择保存。
| 应用程序开发人员 |
在 Amazon SQS 中测试和验证消息。 | 运行测试以确认测试成功完成: 在 API Gateway 控制台上,选择您创建的 REST API。 在资源窗格中,选择 POST 方法。 选择测试选项卡。(如果未显示选项卡,请使用向右箭头。) 在请求正文中,粘贴以下 JSON 代码: {
"message": "lorem ipsum"
}
选择测试。 打开 Amazon SQS 控制台。 在导航窗格中,选择队列,然后选择您的队列。 选择发送和接收消息。 选择轮询消息。 选择消息。它应显示以下内容: Body { "message": "lorem ipsum" }
| 应用程序开发人员 |
使用特殊字符测试 API Gateway。 | 运行包含消息中不可接受的特殊字符(例如 &)的测试: 在 API Gateway 控制台上,选择你的 API。 使用以下 JSON 代码重复前面步骤中的测试: {
"message": "lorem ipsum &"
}
选择测试。 您将收到如下错误消息: {
"Error": {
"Code": "AccessDenied",
"Message": "Access to the resource https://sqs.us-east-2.amazonaws.com/976166761794/Apg2 is denied.",
"Type": "Sender"
},
"RequestId": "e83c9c67-bcf6-5e9a-91e9-c737094b17ab"
}
这是因为默认情况下,邮件正文中不支持特殊字符。在下一步中,您将配置 API Gateway 以支持特殊字符。有关内容类型转换的更多信息,请参阅 API Gateway 文档。 | 应用程序开发人员 |
更改 API 配置以支持特殊字符。 | 调整配置以接受消息中的特殊字符: 在 API Gateway 控制台上,选择您创建的 API,然后选择 POST。 选择集成请求,然后选择编辑。 将 “内容处理” 更改为 “转换为文本”。 在 “映射模板” 部分中: 选择测试选项卡。 在请求正文中,输入之前的 JSON 代码: {
" message": "lorem ipsum &" }
选择测试。 打开 Amazon SQS 控制台。 选择您的队列,然后依次选择 “发送和接收消息”、“轮询留言”、“像以前一样留言”。
新消息应包含特殊字符。 | 应用程序开发人员 |
Task | 描述 | 所需技能 |
---|
部署 API。 | 要部署 REST API,请执行以下操作 | 应用程序开发人员 |
使用外部工具进行测试。 | 使用外部工具运行测试以确认消息已成功接收: 打开诸如 Postman、Insomnia 或 curl 之类的工具。 运行你的 API。 打开 Amazon SQS 控制台。 选择您的队列。 加载消息以查看新消息。
| 应用程序开发人员 |
Task | 描述 | 所需技能 |
---|
删除 API。 | 在 API Gateway 控制台上,选择您创建的 API,然后选择删除。 | 应用程序开发人员 |
删除 IAM 角色。 | 在 IAM 控制台的角色窗格中,选择 AWSGatewayRoleForSQS,然后选择删除。 | 应用程序开发人员 |
删除 SQS 队列。 | 在 Amazon SQS 控制台的队列窗格中,选择您创建的 SQS 队列,然后选择删除。 | 应用程序开发人员 |
相关资源