如何使用 Lambda 函数将 Amazon RDS 实例停止七天以上?

3 分钟阅读
0

我想使用 Amazon Lambda 将 Amazon Relational Database Service (Amazon RDS) 停止七天以上。

简短描述

默认情况下,您一次最多可以将 Amazon RDS 数据库实例停止七天时间。七天后,实例会重新启动,以免错过任何维护更新

要将您的实例停止七天以上,您可以使用 Step Functions 来自动执行工作流,而不会错过维护时段。

**注意:**有关替代解决方案,请参阅如何使用 Step Functions 将 Amazon RDS 实例停止七天以上?

解决方法

配置 IAM 权限

创建一个 Amazon Identity and Access Management (IAM) 策略,以允许 Lambda 启动和停止实例并检索实例信息。

1.    打开 IAM 控制台

2.    在导航窗格中,选择策略

3.    选择创建策略

4.    选择 JSON 选项卡。

5.    要授予所需的 IAM 权限,请在 JSON 选项卡下输入以下策略:

{
    "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.    对于选择受信实体的类型,选择亚马逊云科技服务

5.    在或者选择服务以查看其用例下,选择 Lambda

6.    选择下一步: 权限

7.    对于 Filter-policies,输入您在上一节中创建的策略的名称。在策略出现后将其选中。对于 Filter-policies,输入 AWSLambdaBasicExecutionRole。在 AWSLambdaBasicExecutionRole 托管策略出现后将其选中。

8.    选择下一步: 标签

9.     (可选)要添加标签,请在和**值(可选)**字段中输入相应的值。

10.    选择下一步: 审核

11.    在创建角色页面的角色名称中输入您正在创建的角色的名称。

12.    选择创建角色

有关更多信息,请参阅为亚马逊云科技服务创建角色(控制台)

为数据库实例添加标签

1.    打开 Amazon RDS 控制台

2.    在导航窗格中,选择数据库

3.    选择要自动启动和停止的数据库实例。

4.    在详细信息部分中,向下滚动到标签部分。

5.    在标签选项卡下,选择添加。对于标签键,输入 autostart。对于,输入 yes。选择添加以保存所做更改。

6.    再次选择添加。对于标签键,输入 autostop。对于,输入 yes。选择添加以保存所做更改。

有关更多信息,请参阅添加、列出和删除标签

创建 Lambda 函数以启动已标记的数据库实例

1.    打开 Lambda 控制台

2.    在导航窗格中,选择函数

3.    选择创建函数

4.    选择从头开始创作

5.    对于函数名称,输入您的函数名称。

6.    对于运行时,选择 Python 3.7

7.    对于架构,保留默认选择 x86_64

8.    展开更改默认执行角色

9.    对于执行角色,选择使用现有角色

10.    对于现有角色,选择您创建的 IAM 角色。

11.    选择创建函数

12.    选择代码选项卡。

13.    在代码源编辑器中,删除示例代码并输入以下代码:

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'):
            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']))
            except Exception as e:
                print ("Cannot start instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)


if __name__ == "__main__":
    lambda_handler(None, None)

14.    依次选择文件保存部署

15.    依次选择配置选项卡、常规配置编辑

16.    在超时下,填写以下字段:
对于分钟,选择 0
对于,选择 10

17.    选择保存

创建 Lambda 函数以停止标记的数据库实例

要创建 Lambda 函数来停止已标记的数据库实例,请参阅上一节创建 Lambda 函数以启动已标记的数据库实例。按照相同的步骤操作,但要在步骤 12 中使用不同的代码。

代码源编辑器中,删除示例代码并输入以下代码:

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'):
            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']))
            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 *))。

相关信息

在 Amazon RDS 中停止和启动数据库实例

使用 Amazon RDS 停止自动启动的数据库实例

如何将 Amazon Aurora 集群停止七天以上?

AWS 官方
AWS 官方已更新 1 年前