亚马逊AWS官方博客
使用 AWS EventBridge+Lambda+Aurora 实现实例资源自动预留
对于电商行业客户来说,在每年双十一/黑五等大促活动前夕平台都需要进行大量的资源扩容以应对即将到来的业务高峰。以 EC2 实例资源为例,一般来说需要客户提前对容量进行规划并通过 AWS 相关流程来预留实例,从而确保该可用区内实例容量充足。由于整个流程需要数周甚至数月时间,因此该流程更适用于中长期规划的资源需求,而无法满足客户临时需求。针对此场景,可以考虑使用 EventBridge+Lambda+Aurora 的方式来自动化地对特定实例资源进行预留。
服务介绍
AWS Lambda
一项无服务器事件驱动型计算服务,该服务使您可以运行几乎任何类型的应用程序或后端服务的代码,而无需预置或管理服务器。Lambda 在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量调配和弹性伸缩和记录。您可以从 200 多个 AWS 服务和软件即服务 (SaaS) 应用程序中触发 Lambda,且只需按您的使用量付费。
https://aws.amazon.com/cn/lambda/
Amazon Aurora Serverless
Amazon Aurora 的一种按需自动扩展配置版本。Amazon Aurora Serverless 会根据应用程序的需求自动启动、关闭以及扩展或缩减容量。 您可以在 AWS 上运行数据库,而无需管理数据库容量。手动管理数据库容量需要占用宝贵的时间,也可能导致数据库资源的使用效率低下。 借助 Aurora Serverless,您可以创建数据库,指定所需的数据库容量范围,然后连接您的应用程序。您需要在数据库处于活动状态期间按照每秒使用的数据库容量进行付费,并且只需在 Amazon Relational Database Service(Amazon RDS)控制台中执行几个步骤即可在标准配置和无服务器配置之间进行迁移。
https://aws.amazon.com/cn/rds/aurora/serverless/?nc1=h_ls
AWS ODCR
On-Demand Capacity Reservations,通过使用按需容量预留,您可以在特定可用区中为 Amazon EC2 实例预留计算容量达任意持续时间。通过创建容量预留,可以确保您始终能够在需要时访问 EC2 容量。您随时可以创建容量预留,而无需作出一年或三年期限承诺。在您的账户中预置容量预留后,容量即可用且账单开始。当您不再需要它时,请取消容量预留以释放容量并停止产生费用。
https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html#EC2.Client.create_capacity_reservation
Amazon EventBridge
一种无服务器事件总线服务,让您可以轻松地将应用程序与来自各种源的数据相连接。 EventBridge 可以从应用程序、SaaS(Sa)应用程序和服务传输实时数据流,然后 AWS 将实时数据流传输到诸如 AWS Lambda 之类的目标、使用 API 目标的 HTTP 调用端点或其他 AWS 账户中的事件总线。
https://aws.amazon.com/cn/eventbridge/
https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html
AWS Secrets Manager
Secrets Manager 允许您将代码中的硬编码凭证(包括密码)替换为对 Secrets Manager 的 API 调用,以便以编程方式检索密钥。这有助于确保密钥不会被检查代码的人员泄露,因为密钥不再位于代码中。此外,您还可以配置 Secrets Manager 以根据指定的计划自动轮换密钥。这样,您就可以将长期密钥替换为短期密钥,从而显著降低泄露风险。
https://aws.amazon.com/cn/secrets-manager/
整体架构
架构说明
Aurora 数据库的表中存储了资源需求元数据信息,如:实例类型,可用区,总需求数量和当前已预留数量。EventBridge 定时触发 Lambda 来运行 Python 脚本,脚本先读取数据库中数据以判断哪些实例需要预留,随后调用 ODCR API 来预留实例,预留成功则更新数据库条目。为了提高安全性,数据库的登陆信息均存储在 Secrets Manager 中,Lambda 调用 Secrets Manager 来获取数据库登陆信息。
[注]:该方案并非是增加对应可用区中的资源数量,而是循环调用 ODCR API 来实现对实例的抢占。
网络配置
Aurora 和 Lambda 在同一个 VPC 的不同的 subnet 中,也可部署在多个 subnet 上以提高可用性。另外,Lambda 需要访问 Aurora,并能通过互联网访问 AWS 服务(也可通过 VPC Endpoint 实现内网访问 AWS 服务)。
1 | Subnet | Type | CIDR | Application |
2 | Public_Subnet | Public | 172.18.1.0/24 | NAT Gateway |
3 | Private_Subnet_DB_1 | Private | 172.18.2.0/24 | Aurora |
4 | Private_Subnet_DB_2 | Private | 172.18.3.0/24 | Aurora |
5 | Private_Subnet_Lambda_1 | Private | 172.18.4.0/24 | Lambda |
6 | Private_Subnet_Lambda_2 | Private | 172.18.5.0/24 | Lambda |
使用说明
数据库初始化
整体方案部署完毕后,第一步需要对数据库进行初始化操作:创建表,插入数据,更改数据等常规 CRUD 操作。可使用 Query Editor 登陆到数据库以执行 SQL 指令(Lambda 脚本中 Initial_db_sql()函数也可进行相关 SQL 操作)。
- 创建数据库
- 创建资源需求元数据表
- 插入数据
- 更新数据
- 查询所有数据
检查执行结果
可在 Lambda 控制台的 Monitor 中查看相关执行 log 并在 EC2 控制台查看预留的资源。
启动实例
代码示例中创建的为 open 模式的 ODCR,因此在启动实例时只需要确保在对应可用区启动对应实例类型的 EC2 即可,ODCR 会被自动应用。
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-reservations-using.html#capacity-reservations-launch
[注]:当使用 ODCR 实现了实例预留并且 EC2 实例成功启动后,即便实例终止也依然会对该 ODCR 收费,因此需要客户评估实例启动之后 ODCR 是否取消。
方案配置
该方案配置主要以 AWS CLI 方式来实现,要求 CLI 版本为 2.0 以上,CLI 中相关变量内容可在”<>”中自定义。
创建网络
- 检查 AWS CLI 版本
- 创建 VPC
- 创建公有子网
- 分配 EIP 并创建 NAT Gateway
- 创建 Internet GateWay 并附加到该 VPC
- 创建私有子网
- 配置主路由
- 配置私有路由
- 创建 Security Group
创建 Aurora
- 创建 Subnet Groups
- 创建 Aurora Serverless
创建 Secrets Manager
创建 Lambda
- 创建 IAM Policy
- 创建 IAM Role 并附加策略
- 创建 Lambda Function
相关源代码和依赖包已打包 odcr-deployment-package.zip,需下载到本地,链接可参考附件
- 添加触发器
结论
通过 EventBridge+Lambda+Aurora 可以实现自动化对 EC2 实例进行资源预留,从而满足客户短期内的资源需求。同时采用 Serverless 服务也可以最大程度上降低维护成本并实现成本节约。
附件
Source Code
https://github.com/percy-han/AWS-ODCR/blob/02c976a74ce0d68fce151356d2023dcc37cdfc51/odcr-lambda.py