使用 Amazon EventBridge Scheduler 和 AWS Lambda 对 Ama
使用 Amazon EventBridge Scheduler 和 AWS Lambda 调整 Amazon RDS 的计划
关键要点在这篇文章中,我们将介绍如何利用 Amazon EventBridge Scheduler 和 AWS Lambda,自动调度修改带有特定标签的 DB 实例。通过这种方式,您可以在预定义的时间段内自动调整 RDS 实例的规模,从而减少数据库管理员的手动干预,提高操作效率。
解决方案概述
Amazon RDS 提供了不同的实例类型,以满足不同的关系数据库使用场景。您可以通过 Amazon RDS 控制台 或使用 API 进行手动修改。当需要定期修改时,比如在预定时间内缩放实例,您可以使用 EventBridge Scheduler 和 Lambda 实现自动化。
Lambda 是一种计算服务,可以让您运行代码而无需管理服务器。您无需担心服务器的配置、操作系统的设置或应用程序的安装等。
EventBridge Scheduler 是一种无服务器调度程序,允许您从一个中央管理服务创建、运行和管理任务。通过 EventBridge Scheduler,您可以使用 cron 和速率表达式创建计划,以实现定期模式,或配置一次性调用。您可以设置灵活的时间窗口、定义重试限制并设置失败 API 调用的最大保留时间。
在本解决方案中,我们使用 Lambda 函数存储修改带有标签 Scaling 的 RDS 实例的代码,并使用 EventBridge Scheduler 来调用 Lambda 函数。
以下图示展示了解决方案架构。
要实施此解决方案,您需要完成以下高层步骤:
为您的 RDS DB 实例创建标签,用于识别需要修改的实例。创建一个 AWS 身份与访问管理 IAM策略和 Lambda 角色。创建一个 Lambda 函数,包含修改数据库的相关参数。创建一个计划,以便根据需要调用 Lambda 函数。前提条件
要遵循本文中的步骤,您需要以下内容:
一个具有对 Amazon RDS 的管理员访问权限和管理 IAM 策略、角色、Lambda 函数和 EventBridge 计划权限的 AWS 账户。一个您希望定期修改的 RDS 实例。为 RDS DB 实例创建标签
您可以在创建 DB 实例时或在实例创建后修改时分配标签。以下步骤将指导您如何为计划的停止和启动添加标签:
在 Amazon RDS 控制台上,选择一个要添加标签的 DB 实例。在 Tags 标签下,选择 Manage tags。选择 Add new tag。在 Tag key 中输入 Scaling。在 Value 中输入 updown。选择 Save changes。您现在可以看到在 Tags 标签下添加的标签。为 Lambda 创建 IAM 策略和角色
完成以下步骤以为 Lambda 创建 IAM 策略和角色,以便修改 DB 实例:
在 IAM 控制台中,选择 Policies 下的 Access management。选择 Create policy。在 JSON 标签中,输入以下策略代码: json { Version 20121017 Statement [ { Sid VisualEditor0 Effect Allow Action [ rdsDescribeDBClusterParameters rdsDescribeDBEngineVersions rdsDescribeGlobalClusters rdsDescribePendingMaintenanceActions rdsDescribeDBLogFiles rdsDescribeReservedDBInstancesOfferings rdsDescribeReservedDBInstances rdsListTagsForResource rdsDescribeValidDBInstanceModifications rdsDescribeDBInstances rdsDescribeSourceRegions rdsDescribeDBClusterEndpoints rdsDescribeDBClusters rdsDescribeDBClusterParameterGroups rdsDescribeOptionGroups rdsModifyDBInstance ] Resource } ] } 此策略允许修改任何 RDS 实例。您可能想根据 最小权限原则 限制其范围,通过在 Resource 中指定您的 RDS DB 实例的 ARN。
选择 Next。
在 Policy name 中输入 rdsmodifyinstance。选择 Create policy。接下来,您需要创建 IAM 角色。
在 IAM 控制台中,选择 Roles 下的 Access management。选择 Create role。在 Select trusted entity 中,选择 AWS service。在用例中选择 Lambda。选择 Next。搜索并选择您创建的策略rdsmodifyinstance。搜索并选择 AWSLambdaBasicExecutionRole 管理策略。选择 Next。在 Role name 中输入 rdslambda。审核附加的策略并选择 Create role。现在您可以在创建 Lambda 函数时附加此角色。
创建用于修改数据库的 Lambda 函数
本节中,我们将创建一个 Lambda 函数,用于修改 DB 实例类型。有关可修改设置的完整列表,请参考 API 文档。
在 Lambda 控制台,选择 Functions。选择 Create function。在 Function name 中输入 rdsmodify。在 Runtime 中选择 Python 312。展开 Change default execution role 部分并选择 Use an existing role。在 Existing role 中选择您创建的角色rdslambda。选择 Create function。在函数详情页面,导航到函数代码部分。删除示例代码并输入以下内容: python import boto3 import os from datetime import datetimedef modifyrds(instancename instancetype region) key = osenviron[KEY] value = osenviron[VALUE] inthegroup = False
client = boto3client(rds regionname=region) try response = clientdescribedbinstances(DBInstanceIdentifier=instancename) instance = response[DBInstances][0] arn = instance[DBInstanceArn] resp2 = clientlisttagsforresource(ResourceName=arn) for tag in resp2[TagList] if tag[Key] == key and tag[Value] == value inthegroup = True break if inthegroup if instance[DBInstanceStatus] == available if instance[DBInstanceClass] == instancetype print(DB instance is already running on the requested instance type {}format(instancetype)) else clientmodifydbinstance(DBInstanceIdentifier=instance[DBInstanceIdentifier] DBInstanceClass=instancetype ApplyImmediately=True) print(Scaling DB instance {} from {} to {}format(instance[DBInstanceIdentifier] instance[DBInstanceClass] instancetype)) # 省略其他状态检查 else print(DB instance {} is not part of scaling targetformat(instance[DBInstanceIdentifier])) except clientexceptionsDBInstanceNotFoundFault print(No such DB instance {} in the region {}format(instancename region))def lambdahandler(event context) modifyrds(event[instancetoupdate] event[newinstancetype] event[instanceregion]) 10 选择 Deploy。上述 Lambda 函数需要两个参数KEY和VALUE,作为环境变量传递。KEY和VALUE 是我们在之前步骤中附加到需要扩展的实例的标签。
在 Configuration 标签下,选择 General configuration 部分。选择 Edit 并将超时设置为 5 秒。在 Configuration 标签下,在 Environment variables 部分,选择 Edit 并添加环境变量,如以下截图所示。选择 Save。选择 Test 标签来测试该函数。在 Event JSON 中,您需要提供函数所需的三个输入参数及其值: json { instancetoupdate database1 newinstancetype dbm5xlarge instanceregion useast1 }选择 Test,以测试该函数。测试会运行 Lambda 函数,验证数据库是否存在且可以修改,然后适用更改如果适用。您可以在函数详情页查看函数的成功状态,但由于数据库已停止,所以未进行修改。完成函数创建和测试后,您可以创建一个调度任务以根据需要调用该函数。
使用 EventBridge Scheduler 创建计划
本节中,我们将配置一个调度程序,在指定时间调用该函数。
在 EventBridge 控制台中,在导航窗格下,选择 Scheduler,然后选择 Schedules。选择 Create schedule。在 Schedule name 中输入 rdsmodifyschedule。在 Occurrence 中选择所需的计划,对于本文,选择 Onetime schedule。在 Date and time 中输入今天的日期以及未来 10 分钟的时间。在 Flexible time window 中选择 Off。选择 Next。在 Target API 中选择 AWS Lambda。在 Lambda function 中选择之前创建的函数rdsmodify。在 Payload 中提供函数的输入参数,与测试事件相同。选择 Next。在 Action after schedule completion 中选择 NONE。在 Retry policy 中禁用 Retry。在 Execution role 中选择 Create new role for this schedule。选择 Next。审核计划并选择 Create schedule。该计划将在指定时间运行并调用函数以修改数据库。您可以在 Amazon RDS 控制台上验证新的实例类型,并使用 Amazon CloudWatch logs 检查函数状态。
清理
您现在可以删除创建的资源,除非您希望保留它们。通过删除不再使用的 AWS 资源,您可以避免不必要的费用。
要删除 EventBridge 规则和 Lambda 函数,请遵循 清理您的资源 的章节。要删除 DB 实例的标签,请遵循 在 Amazon RDS 中添加和删除标签 的章节。要删除 Lambda 和 IAM 策略的角色,请遵循 删除角色或实例配置文件 和 删除 IAM 策略 的章节。总结
在这篇文章中,我们展示了如何调度 Lambda 函数以在预定时间以编程方式修改 RDS DB 实例。自动化修改的好处使组织能够进一步减少人工干预和人力劳动,同时提高运营效率。这包括在高峰使用前自动扩展 DB 实例,以及在低使用时通过降低 DB 实例的规模实现成本节省。

我们鼓励您尝试这一解决方案,并利用使用 Lambda 和 Amazon RDS 所带来的所有好处。
请在评论区分享您的反馈和问题。
作者介绍
Slava Beylin 是 AWS 的高级技术账户经理,致力于帮助客户优化对 AWS 服务的使用。Slava 具有 20 年的经验,专注于关系数据库和企业应用的 DevOps。
加载评论
试用加速器
Stats Perform通过与AWS逆向合作进行创新 云企业战略博客
Stats Perform 利用 AWS 反向工作推动创新关键要点Stats Perform 与 AWS 合作,采用反向工作法开发新产品。新平台 PressBox 提升了用户工作流程和粉丝互动体验。关注客户需求是推动创新的关键。杰夫贝索斯曾说:“好的发明家和设计师深刻理解他们的客户,他们花费大量精力...