前言
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。
本篇作者