本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon Gate API way 中使用自定义域名实现基于路径的版本控制 API
由 Corey Schnedl (AWS)、Anbazhagan Ponnuswamy ()、Marcelo Barbosa ()、Gaurav Samudra (AWS)、Mario Lopez Martinez (AWS) 和 Abhilash Vinod () 创作 AWS AWS AWS
摘要
此模式演示了如何使用自定义域的API映射功能为 Amazon Gateway 实施基于路径的API版本控制解决方案。API
Amazon API Gateway 是一项完全托管的服务,您可以使用它来创建、发布、维护、监控和保护APIs任何规模。通过使用该服务的自定义域名功能,您可以创建更简单、更直观的自定义域名URLs,以便提供给API用户。您可以使用API映射将API阶段连接到自定义域名。创建域名并配置DNS记录后,您可以使用API映射APIs通过自定义域名向您的发送流量。
公开发行后,消费者API就会使用它。API随着公众的发展,其服务合同也在不断演变,以反映新的特性和功能。但是,更改或移除现有功能是不明智的。任何重大更改都可能影响消费者的应用程序并在运行时中断它们。 API版本控制对于避免破坏向后兼容性和破坏合约非常重要。
你需要一个明确的API版本控制策略来帮助消费者采用它们。使用基于路径APIs的版本控制URLs是最直接和最常用的方法。在这种类型的版本控制中,版本被明确定义为的一部分。API URIs以下示例URLs显示消费者如何使用URI为其请求指定API版本:
https://api.example.com/api/v1/orders
https://api.example.com/api/v2/orders
https://api.example.com/api/vX/orders
此模式使用为您构建、部署和测试基于路径的可扩展版本控制解决方案的示例实现。 AWS Cloud Development Kit (AWS CDK) API AWS CDK 是一个开源软件开发框架,用于使用熟悉的编程语言对云应用程序资源进行建模和配置。
先决条件和限制
先决条件
限制
私有域名不支持自定义域名APIs。
自定义域名在所有域名中必须是 AWS 区域 唯一的 AWS 账户。
要配置多个级别的API映射,必须使用区域自定义域名并使用 TLS 1.2 安全策略。
在API映射中,自定义域名和映射的域名APIs必须相同 AWS 账户。
API映射必须仅包含字母、数字和以下字符:
$-_.+!*'()/
API映射中路径的最大长度为 300 个字符。
每个域名可以有 200 个具有多个级别的API映射。
您只能使用 TLS 1.2安全策略映射HTTPAPIs到区域自定义域名。
您不能映射 WebSocket APIs到与HTTPAPI或相同的自定义域名RESTAPI。
有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅按地区划分的AWS 服务
。有关特定终端节点,请参阅服务终端节点和配额,然后选择服务的链接。
产品版本
此示例实现在 2.149.0 TypeScript 版本AWS CDK 中使用。
架构
下图显示了架构工作流程。
该图阐释了以下内容:
API用户使用自定义域名向 Amazon API Gateway 发送请求。
APIGateway 根据请求中指示的路径,动态地将用户的请求路由到 API Gateway URL 的相应实例和阶段。下表显示了一个示例,说明如何针对不同的 API Gat URL eway 实例将不同的路径路由到特定阶段。
API
舞台
路径
默认端点
C alculationAPIv 1
api
apiv1
已启用
C alculationAPIv 2
api
apiv2
已启用
C alculationAPIv X
api
apiVX
已启用
目标 API Gateway 实例处理请求并将结果返回给用户。
自动化和扩缩
我们建议您为每个版本使用单独的 AWS CloudFormation 堆栈。API通过这种方法,您可以在自定义域API映射功能APIs可以路由到的后端之间实现完全隔离。这种方法的一个优点是,API可以独立部署或删除你的不同版本,而不会带来修改其他版本的风险API。这种方法通过隔离 CloudFormation 堆栈来提高弹性。此外,它还为您提供了不同的后端选项 AWS Lambda,API例如、 AWS Fargate、HTTP端点和操作。 AWS 服务
您可以将 Git 分支策略(例如 Gitflow)与隔离 CloudFormation 堆栈结合使用,来管理部署到不同版本的源代码。API通过使用此选项,您可以维护不同的版本,API而无需为新版本复制源代码。使用 Gitflow,您可以在执行发布时为 git 存储库中的提交添加标签。因此,您可以获得与特定版本相关的源代码的完整快照。由于需要执行更新,您可以查看特定版本中的代码,进行更新,然后将更新的源代码部署到与相应主版本一致的 CloudFormation 堆栈中。这种方法降低了破坏另一个API版本的风险,因为的每个版本都有独立的API源代码并部署到不同的 CloudFormation 堆栈中。
工具
AWS 服务
Amazon API Gateway 可帮助您以任何规模创建、发布RESTHTTP、维护、监控和 WebSocket APIs保护。
AWS Certificate Manager (ACM) 帮助您创建、存储和续订用于保护您的 AWS 网站和应用程序的公共和私有SSL/TLSX.509 证书和密钥。
AWS Cloud Development Kit (AWS CDK)是一个开源软件开发框架,用于在代码中定义您的云基础架构并通过它进行配置 AWS CloudFormation。此模式的示例实现使用 AWS CDK in TypeScript。在 in AWS CDK 中 TypeScript 使用熟悉的工具,包括 Microsoft TypeScript 编译器 (
tsc
)、Node.js和节点包管理器 ( npm
)。如果你愿意,你可以使用 Yarn,尽管此模式中的示例使用 npm
了。构成AWS 构造库的模块通过npm
存储库 npmjs.org 分发。 AWS CloudFormation帮助您设置 AWS 资源,快速一致地配置资源,并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。
AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。
Amazon Route 53 是一项高度可用且可扩展的DNS网络服务。
AWS WAF是一种 Web 应用程序防火墙,可帮助您监控HTTPS请求HTTP并将其转发到受保护的 Web 应用程序资源。
其他工具
代码存储库
此模式的代码可在 GitHub path-based-versioning-with-api-
最佳实践
使用强大的持续集成和持续交付 (CI/CD) 管道,自动测试和部署使用构建的 CloudFormation 堆栈。 AWS CDK有关此建议的更多信息,请参阅 Well-Architect AWS ed 指南 DevOps 。
AWS WAF 是一款托管防火墙,可轻松与 Amazon API Gateway 等服务集成。尽管 AWS WAF 这不是此版本控制模式起作用的必要组件,但我们建议将其作为安全最佳实践包含在 API Gatew AWS WAF ay 中。
鼓励API消费者定期升级到您的最新版本,API以便API可以高效地弃用和删除您的旧版本。
在生产环境中使用此方法之前,请为您实施防火墙和授权策略API。
使用最低权限访问模式实现对 AWS 资源管理的访问权限。 AWS 账户
要对使用构建的应用程序强制执行最佳实践和安全建议 AWS CDK,我们建议您使用 cdk-na g 实用程序。
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
克隆存储库。 | 要克隆示例应用程序存储库,请运行以下命令:
| 应用程序开发人员 |
导航到克隆的存储库。 | 要导航到克隆的存储库文件夹位置,请运行以下命令:
| 应用程序开发人员 |
安装所需的依赖项。 | 要安装所需的依赖项,请运行以下命令:
| 应用程序开发人员 |
任务 | 描述 | 所需技能 |
---|---|---|
启动路由堆栈的部署。 | 要启动 CloudFormation 路由堆栈的部署
注意在成功执行以下域DNS验证任务之前,堆栈部署不会成功。 | 应用程序开发人员 |
任务 | 描述 | 所需技能 |
---|---|---|
验证您的域名的所有权。 | 在您证明关联域的所有权之前,证书将一直处于 “待验证” 状态。 要证明所有权,请将CNAME记录添加到与该域关联的托管区域。有关更多信息,请参阅 AWS Certificate Manager 文档中的DNS验证。 添加适当的记录可以使 | 应用程序开发者、AWS系统管理员、网络管理员 |
创建别名记录以指向您的 API Gateway 自定义域。 | 成功颁发并验证证书后,创建一条指向您的 Amazon API Gateway 自定义域的DNS记录URL。 自定义域名URL由配置自定义域名时唯一生成,并指定为 CloudFormation 输出参数。以下是该记录的示例: 路由策略:简单路由 记录名称: 别名:是 记录类型:指向 AWS 资源的类型为 “A” 的DNS记录 值: TTL(秒):300 | 应用程序开发者、AWS系统管理员、网络管理员 |
任务 | 描述 | 所需技能 |
---|---|---|
部署 | 要部署
以下CDK代码添加了API映射:
| 应用程序开发人员 |
部署 | 要部署
| 应用程序开发人员 |
调用API. | 要使用 Bruno 调用API和测试API端点,请参阅其他信息中的说明。 | 应用程序开发人员 |
任务 | 描述 | 所需技能 |
---|---|---|
清理资源。 | 要销毁与此示例应用程序关联的资源,请使用以下命令:
注意请务必清理为域所有权验证过程手动添加的所有 Route 53 DNS 记录。 | 应用程序开发人员 |
故障排除
事务 | 解决方案 |
---|---|
部署超 | 确保按照之前的任务中所述添加了正确的DNS验证CNAME记录。添加验证记录后,您的新证书可能会在 30 分钟内继续显示待DNS验证状态。有关更多信息,请参阅 AWS Certificate Manager 文档中的DNS验证。 |
相关资源
使用 Amazon 实现基于标头的 API Gateway 版本控制 CloudFront
— 这篇 AWS Compute 博客文章提供了一种基于标题的版本控制策略,作为该模式中概述的基于路径的版本控制策略的替代方案。 AWS CDK 研讨会
— 此入门研讨会重点介绍如何使用构建和部署应用程序 AWS Cloud Development Kit (AWS CDK)。 AWS 本研讨会支持 Go、Python 和 TypeScript。
其他信息
和 Bruno API 一起测试你的
我们建议您使用开源API测试工具 Bruno
要调用和测试您的API,请使用以下步骤:
要查看示例API调用屏幕截图以及 V1 和 V2 验证的比较,请参阅在此模式的代码存储库API中的README.md
文件中测试您的示例。