了解如何使 Amazon RDS 实例停止的时长超过 7 天?

上次更新时间:2021 年 10 月 18 日

我想使 Amazon Relational Database Service (Amazon RDS) 的停止时长超过 7 天。

简短描述

您可以在几分钟内轻松开启和停止 Amazon RDS 实例。对于不需要始终运行的数据库,此功能支持节省成本。您最多可以停止数据库实例 7 天。如果您在 7 天后没有手动启动数据库实例,则实例将自动启动。这样,实例就不会落后于硬件、底层操作系统或数据库引擎版本所需的维护更新。

要在不错过所需的维护更新的情况下停止 RDS 实例超过 7 天,请执行以下操作:

  1. 设置 AWS Identity Access Management (IAM) 权限以允许 AWS Lambda 执行以下操作:启动实例。停止该实例。检索有关实例的信息。
  2. 为要自动启动和停止的 RDS 实例添加标签。
  3. 创建一个 Lambda 函数来启动数据库实例。
  4. 创建一个 Lambda 函数来停止数据库实例。
  5. 创建计划以执行以下操作:在每周维护时段开始时启动数据库实例。在维护时段结束时停止数据库实例。

解决方法

配置 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 角色,然后附上所需的策略

  1. 打开 IAM 控制台
  2. 在导航窗格中,选择角色
  3. 选择创建角色
  4. 对于选择受信任实体的类型,请选择 AWS 服务
  5. 或者选择一项服务以查看其使用案例下,选择 Lambda
  6. 选择下一步:权限
  7. 对于 Filter-policies,输入在上一节中创建的策略的名称。当您创建的策略出现时,选择该策略。对于 Filter-policies,请输入 AWSLambdaBasicExecutionRole。当您创建的托管式策略 AWSLambdaBasicExecutionRole 角色出现时,请选择该策略。
  8. 选择下一步:标签
  9. (可选)要添加标签,请为密钥值(可选)输入相应的值。
  10. 选择下一步:检查
  11. 创建角色页面上,对于角色名称,输入要创建的角色的名称。
  12. 选择创建角色

有关更多信息,请参阅为 AWS 服务(控制台)创建角色

为数据库实例添加标签

  1. 打开 Amazon RDS 控制台
  2. 在导航窗格中,选择数据库
  3. 选择要自动启动和停止的数据库实例。
  4. 在详细信息部分中,向下滚动到标签部分。
  5. 标签选项卡下,选择添加。对于标签密钥,输入 autostart。对于,输入 yes。选择添加以保存您的更改。
  6. 再次选择添加。对于标签密钥,输入 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)

执行函数测试

假设已贴标签的数据库实例处于已停止状态。要执行函数测试,请执行以下操作:

  1. 打开 Lambda 函数 列表。
  2. 选择您创建的用于启动数据库实例的函数
  3. 选择操作,然后选择测试
  4. 测试选项卡下的名称中,输入事件的名称。
  5. 选择保存更改,然后选择测试

创建时间表

假设已贴标签的数据库实例的每周维护时段为星期日 22:00-22:30。您可以通过为以下内容创建两个规则来设置计划:

  • 在维护时段开始前 30 分钟自动启动数据库实例
  • 在维护时段结束 30 分钟后自动停止数据库实例

要创建规则以在维护时段前 30 分钟自动启动数据库实例,请执行以下操作:

  1. 打开 Lambda 函数 列表。
  2. 选择您创建的用于启动数据库实例的函数。
  3. 函数概览下,选择添加触发器
  4. 选择 EventBridge (CloudWatch Events),然后选择新建规则
  5. 对于规则名称,输入要创建的网关名称。
  6. 对于计划表达式,为自动计划添加一个 cron 表达式(例如:cron(30 21 ? * SUN *))。
  7. 选择添加

使用相同的说明创建另一个规则,以便在维护窗口结束 30 分钟后自动停止数据库实例。确保相应地更改自动计划的规则名称和 cron 表达式(例如:cron(00 23 ? * SUN *))。