亚马逊AWS官方博客

无服务部署邮件自动通知数据库补丁事件

前言

Amazon Aurora 和 Amazon DocumentDB 是一种可扩展、高度持久和完全托管的云原生关系数据库和文档数据库,用于操作任务关键型工作负载, 可以简化在云中设置、管理运营和扩展数据库的过程。

Amazon Aurora 和 Amazon DocumentDB 会定期对资源执行维护。维护最常涉及对数据库集群的基础硬件、基础操作系统(OS)或数据库引擎版本的更新, 及时应用数据库补丁,对基础操作系统(OS)或数据库引擎版本做相应的更新,是非常必要的,可以持续增强数据库和操作系统功能和安全性,来更好地增强和防护您的云上数据库 Amazon Aurora 和 Amazon DocumentDB。

Amazon Aurora 和 Amazon DocumentDB 会在一些维护项目上,要求您的数据库集群做必需的操作系统或数据库修补。仅对与安全性和实例可靠性相关的修补程序,会自动安排必需的修补。这种修补很少发生(通常几个月一次),并且几乎不会需要过长的维护时段,同时结合 Aurora 零停机时间修补特性(zero-downtime patching),可以进一步缩短 Aurora 数据库停机修补时间。

鉴于亚马逊云科技用户需要及时了解 Amazon Aurora 和 Amazon DocumentDB 数据库即将发生的必需修补的数据库补丁事件,方便快速反应和充分准备。基于以上需求,本博文中将使用无服务部署架构:Amazon Lambda 与 EventBridge 进行集成,并利用 SNS 直接以邮件的形式自动发送 Amazon Aurora 和 Amazon DocumentDB 必需修补的数据库补丁通知。以下所有操作均可以在亚马逊云科技所有区域上(包括中国区域)进行部署。

1. 无服务部署架构

2. 创建 Lambda 所需 IAM Policy

Policy name: query-pending-maintenance

Policy 定义 Json:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "sns:Publish",
                "ec2:DescribeRegions",
                "rds:DescribeDBInstances",
                "rds:DescribePendingMaintenanceActions",
                "rds:DescribeDBClusters"
            ],
            "Resource": "*"
        }
    ]
}

3. 创建 Lambda 所需 IAM 角色

Role Name: lambda-query-maintenance

Policy: query-pending-maintenance

4. 配置 SNS 服务

4.1 Create sns topic

docdb-patch-notification

4.2 Create topic subscription


4.3 在订阅的邮箱收到邮件,点确认来订阅此 topic

5. 创建 Lambda 查询数据库补丁

Lambda Configuration:

Lambda name: query_docdb_maintenance

Lambda role: lambda-query-maintenance

Lambda Timeout: 7 分钟 (注意要修改缺省的 timeout 3 秒改成 7 分钟)

Lambda Runtime: Python 3.7

6. Lambda 代码

import boto3
import json
description_list=['Bug Fixes']
action_list=['db-upgrade']
notification = "This is notification for Aurora and DocumentDB patch \n"
def query_docdb():
    global notification
    EC2 = boto3.client('ec2')
    regions = EC2.describe_regions()
   
    for REGION in regions['Regions']:
        docDB = boto3.client('docdb',REGION['RegionName'])
        pma = docDB.describe_pending_maintenance_actions()
        if len(pma['PendingMaintenanceActions']) > 0:
            num = len(pma['PendingMaintenanceActions'])
            for inst in pma['PendingMaintenanceActions']:
                mw_description=inst['PendingMaintenanceActionDetails'][0]['Description']
                mw_action=inst['PendingMaintenanceActionDetails'][0]['Action']
                if mw_description not in description_list and mw_action not in action_list:
                    num = num - 1
                    continue
                temp_string = "**********************************************" +  "\n"
                notification += temp_string
                temp_string = "Region: " + REGION['RegionName'] +  " has Aurora or docDB cluster needed to be upgrade.\n"
                notification += temp_string
                temp_string = "Mw_description: " + mw_description +  "\n"
                notification += temp_string
                temp_string = "Mw_action: " + mw_action +  "\n"
                notification += temp_string
                temp_string = "The Resource has pending maintenance action: " + inst['ResourceIdentifier'] + "\n"
                notification += temp_string
                cls_identifier=inst['ResourceIdentifier'].split(':')[-1]
                try:
                    cls = docDB.describe_db_clusters(DBClusterIdentifier=cls_identifier)
                except Exception as e:
                        temp_string = "Failed to get cluster information! This is instance level notification" + "\n" 
                        notification += temp_string
                        temp_string = "**********************************************" +  "\n"
                        notification += temp_string
                        continue
                dbclus=cls['DBClusters']
                mw = dbclus[0]['PreferredMaintenanceWindow']
                temp_string = "The Cluster maintenance window UTC time: " + mw + "\n"
                notification += temp_string
            temp_string = "Region: " + REGION['RegionName'] + " has total " + str(num) + " resource found.\n"   
            notification += temp_string
            temp_string = "**********************************************" +  "\n"
            notification += temp_string
        else:
            temp_string = "Region: " + REGION['RegionName'] + " No Cluster found.\n"
            notification += temp_string
def lambda_handler(event, context):
    global notification
    sns_client = boto3.client('sns')
    query_docdb()
    print (notification)
    sns_response = sns_client.publish (
        TargetArn = "arn:aws:sns:us-east-1:0281****5784:docdb-patch-notification",
        Subject = "DocumentDB Patch Notification",
        Message = json.dumps({'default': notification}),
        MessageStructure = 'json'
     )

1. 请替换上面代码中:TargetArn = “arn:aws:sns:us-east-1:02818****:docdb-patch-notification”Account id 为您的 Account id。

2. 如果下载 Python Code 出现格式变动, 请从 github 上下载:
git clone https://github.com/bingbingliu18/documentdb-auto-notification

下载路径:deploy/lambda.py

3. 此示例代码基于维护描述为“Bug Fixes”和维护动作为“db-upgrade“进行过滤,如果您想过滤更多的维护事件,请扩展 Lambda 代码中的列表 description_list 和 action_list。如何获取更多维护事件的描述和动作信息,请通过执行以下 aws cli 示例:

aws rds describe-pending-maintenance-actions --region us-east-1

7. 创建 Event Bridge Schedule

7.1 Create event rule

Rule_name: docdb-patch-notification_rule

Rule type: schedule

7.2 Create event schedule

Schedule_name: docdb-patch-notification-schedule

每天调用一次:

Schedule Targe:选择创建的 Lambda function(invoke)

创建成功:

创建成功就会执行第一次调用,然后每隔一天执行一次。

8. 获取的 Email 示例

总结

在本博文中,我们演示了如何使用无服务部署架构的 Amazon Lambda 与 EventBridge 进行集成,并利用 SNS 直接以邮件的形式自动发送 Amazon Aurora 和 Amazon DocumentDB 必需修补的数据库补丁通知。使您及时洞悉即将发生的数据库补丁事件,快速响应和从容应对。及时应用数据库补丁,对基础操作系统(OS)或数据库引擎版本做相应的更新,是非常必要的,能够增强和防护您的云上云原生数据库 Amazon Aurora 和 Amazon DocumentDB。

本篇作者

刘冰冰

AWS 数据库解决方案架构师,负责基于 AWS 的数据库解决方案的咨询与架构设计,同时致力于大数据方面的研究和推广。在加入 AWS 之前曾在 Oracle 工作多年,在数据库云规划、设计运维调优、DR 解决方案、大数据和数仓以及企业应用等方面有丰富的经验。

李迎峰

AWS 解决方案架构师。负责基于 AWS 云计算解决方案架构的咨询和设计,同时致力于 AWS 云服务在国内半导体行业的应用和推广。在加入 AWS 前,拥有超过 18 年的 IT 项目经验,曾就职于 Oracle,主要服务于大中型企事业单位客户。