了解如何使 Amazon RDS 实例停止的时长超过 7 天?
上次更新时间:2021 年 10 月 18 日
我想使 Amazon Relational Database Service (Amazon RDS) 的停止时长超过 7 天。
简短描述
您可以在几分钟内轻松开启和停止 Amazon RDS 实例。对于不需要始终运行的数据库,此功能支持节省成本。您最多可以停止数据库实例 7 天。如果您在 7 天后没有手动启动数据库实例,则实例将自动启动。这样,实例就不会落后于硬件、底层操作系统或数据库引擎版本所需的维护更新。
要在不错过所需的维护更新的情况下停止 RDS 实例超过 7 天,请执行以下操作:
- 设置 AWS Identity Access Management (IAM) 权限以允许 AWS Lambda 执行以下操作:启动实例。停止该实例。检索有关实例的信息。
- 为要自动启动和停止的 RDS 实例添加标签。
- 创建一个 Lambda 函数来启动数据库实例。
- 创建一个 Lambda 函数来停止数据库实例。
- 创建计划以执行以下操作:在每周维护时段开始时启动数据库实例。在维护时段结束时停止数据库实例。
解决方法
配置 IAM 权限
创建 IAM 策略以允许 Lambda 启动和停止实例并检索有关实例的信息。
1. 打开 IAM 控制台。
2. 在导航窗格中,选择策略。
3. 选择创建策略。
4. 选择 JSON 选项卡。
5. 复制以下策略并将策略粘贴到 JSON 选项卡下,以授予所需的 IAM 权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"rds:StartDBCluster",
"rds:StopDBCluster",
"rds:ListTagsForResource",
"rds:DescribeDBInstances",
"rds:StopDBInstance",
"rds:DescribeDBClusters",
"rds:StartDBInstance"
],
"Resource": "*"
}
]
}
6. 选择下一步:标签。
7. (可选)要添加标签,请选择添加标签,然后为密钥和值-可选字段输入相应的值。
8. 选择下一步:检查。
9. 在审查策略页面上,为名称输入策略的名称。查看摘要部分以查看您的策略授予的权限。
10. 选择创建策略。
有关更多信息,请参阅 JSON 选项卡上的创建策略。
创建 IAM 角色,然后附上所需的策略
- 打开 IAM 控制台。
- 在导航窗格中,选择角色。
- 选择创建角色。
- 对于选择受信任实体的类型,请选择 AWS 服务。
- 在或者选择一项服务以查看其使用案例下,选择 Lambda。
- 选择下一步:权限。
- 对于 Filter-policies,输入在上一节中创建的策略的名称。当您创建的策略出现时,选择该策略。对于 Filter-policies,请输入 AWSLambdaBasicExecutionRole。当您创建的托管式策略 AWSLambdaBasicExecutionRole 角色出现时,请选择该策略。
- 选择下一步:标签。
- (可选)要添加标签,请为密钥和 值(可选)输入相应的值。
- 选择下一步:检查。
- 在创建角色页面上,对于角色名称,输入要创建的角色的名称。
- 选择创建角色。
有关更多信息,请参阅为 AWS 服务(控制台)创建角色。
为数据库实例添加标签
- 打开 Amazon RDS 控制台。
- 在导航窗格中,选择数据库。
- 选择要自动启动和停止的数据库实例。
- 在详细信息部分中,向下滚动到标签部分。
- 在标签选项卡下,选择添加。对于标签密钥,输入 autostart。对于值,输入 yes。选择添加以保存您的更改。
- 再次选择添加。对于标签密钥,输入 autostop。对于值,输入 yes。选择添加以保存您的更改。
有关更多信息,请参阅添加、列出和移除标签。
创建 Lambda 函数以启动已贴标签的数据库实例
1. 打开 Lambda 控制台。
2. 在导航窗格中,选择函数。
3. 选择创建函数。
4. 选择 Author from scratch(从头开始创建)。
5. 对于 Function name,请输入函数的名称。
6. 对于运行时,选择 Python 3.7。
7. 对于架构,保留原定设置选项 x86_64。
7. 展开 Change default execution role(更改默认的执行角色)。
8. 对于“执行角色”,选择使用现有角色。
9. 在“现有角色”中,选择您之前创建的 IAM 角色。
10. 选择创建函数。
11. 选择代码选项卡。
12. 在代码源编辑器中,删除示例代码并粘贴以下内容:
import boto3
rds = boto3.client('rds')
def lambda_handler(event, context):
#Start DB Instances
dbs = rds.describe_db_instances()
for db in dbs['DBInstances']:
#Check if DB instance stopped. Start it if eligible.
if (db['DBInstanceStatus'] == 'stopped'):
doNotStart=1
try:
GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
for tags in GetTags:
#if tag "autostart=yes" is set for instance, start it
if(tags['Key'] == 'autostart' and tags['Value'] == 'yes'):
result = rds.start_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
print ("Starting instance: {0}.".format(db['DBInstanceIdentifier']))
if(doNotStart == 1):
doNotStart=1
except Exception as e:
print ("Cannot start instance {0}.".format(db['DBInstanceIdentifier']))
print(e)
if __name__ == "__main__":
lambda_handler(None, None)
13. 选择文件,选择保存,然后选择部署。
15. 选择配置选项卡,选择常规配置,然后选择编辑。
16. 在超时下,执行以下操作:对于最小值,选择 0。对于 sec,选择 10。17. 选择保存。
创建一个 Lambda 函数来停止贴标签的数据库实例
要创建 Lambda 函数来停止已标记的数据库实例,请按照上一节中的说明创建 Lambda 函数启动带标签的数据库实例,并进行以下更改:
在代码源编辑器中,删除示例代码并粘贴以下内容:
import boto3
rds = boto3.client('rds')
def lambda_handler(event, context):
#Stop DB instances
dbs = rds.describe_db_instances()
for db in dbs['DBInstances']:
#Check if DB instance is not already stopped
if (db['DBInstanceStatus'] == 'available'):
DoNotStop=1
try:
GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList']
for tags in GetTags:
#if tag "autostop=yes" is set for instance, stop it
if(tags['Key'] == 'autostop' and tags['Value'] == 'yes'):
result = rds.stop_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier'])
print ("Stopping instance: {0}.".format(db['DBInstanceIdentifier']))
if(DoNotStop == 1):
DoNotStop=1
except Exception as e:
print ("Cannot stop instance {0}.".format(db['DBInstanceIdentifier']))
print(e)
if __name__ == "__main__":
lambda_handler(None, None)
执行函数测试
假设已贴标签的数据库实例处于已停止状态。要执行函数测试,请执行以下操作:
- 打开 Lambda 函数 列表。
- 选择您创建的用于启动数据库实例的函数。
- 选择操作,然后选择测试。
- 在测试选项卡下的名称中,输入事件的名称。
- 选择保存更改,然后选择测试。
创建时间表
假设已贴标签的数据库实例的每周维护时段为星期日 22:00-22:30。您可以通过为以下内容创建两个规则来设置计划:
- 在维护时段开始前 30 分钟自动启动数据库实例
- 在维护时段结束 30 分钟后自动停止数据库实例
要创建规则以在维护时段前 30 分钟自动启动数据库实例,请执行以下操作:
- 打开 Lambda 函数 列表。
- 选择您创建的用于启动数据库实例的函数。
- 在函数概览下,选择添加触发器。
- 选择 EventBridge (CloudWatch Events),然后选择新建规则。
- 对于规则名称,输入要创建的网关名称。
- 对于计划表达式,为自动计划添加一个 cron 表达式(例如:cron(30 21 ? * SUN *))。
- 选择添加。
使用相同的说明创建另一个规则,以便在维护窗口结束 30 分钟后自动停止数据库实例。确保相应地更改自动计划的规则名称和 cron 表达式(例如:cron(00 23 ? * SUN *))。