亚马逊AWS官方博客

使用企业微信接收数据库事件通知

1、前言

Amazon Relational Database Service(Amazn RDS)是一个托管式服务的集合,可以简化在云中设置、运营和扩展数据库的过程。从以下七种热门引擎中选择 – 兼容 MySQL 的 Amazon Aurora、兼容 PostgreSQL 的 Amazon Aurora、MySQL、MariaDB、PostgreSQL、Oracle 以及 SQL Server。

监控是维护Amazon RDS和亚马逊云科技解决方案的可靠性、可用性和性能的重要组成部分。要调试多点故障,我们建议您从亚马逊云科技解决方案的所有部分收集监控数据,并尽可能地自动化监控任务。

RDS 事件表示 Amazon RDS 环境中的更改。例如,当数据库实例的状态从挂起变为正在运行时,Amazon RDS 将生成事件。Amazon RDS 将事件近乎实时地传输到 CloudWatch Events 和 EventBridge。同时,数据库的预期维护,特别是补丁更新等的事件也会通过RDS事件进行通知。因此,能够快速的获取到RDS事件对于随时监控数据库运行情况非常重要。

目前一些国内的亚马逊云科技用户,在使用企业微信作为内部工作沟通平台。他们希望将RDS事件发送到企业微信中,方便统一运维及快速反应。 在本文中,将使用RDS事件与EventBridge进行集成,并利用SNS直接以邮件的形式发送告警通知,并且与Amazon Lambda 结合,通过企业微信以即时聊天的形式发送事件通知。以下所有操作将在亚马逊云科技的宁夏区域(由西云数据运营)进行测试,但是可以在亚马逊云科技其他区域上进行部署。

2、方案架构

在本次的文章中,将会使用到如下的服务:

Amazon EventBridge:  EventBridge是一种无服务器事件总线,可使用从您的应用程序、集成式软件即服务 (SaaS) 应用程序和 服务生成的事件,更轻松地大规模构建事件驱动型应用程序。在RDS的页面也有RDS Event的订阅按钮,可以使用户订阅不同集群不同类型的event。EventBridge提供了更为灵活的订阅方式,EventBridge支持订阅所有RDS事件,并且支持同时配置Elasticache等,支持一处配置多个事件源。

Amazon SNS : SNS 是一项用于应用与应用之间 (A2A) 以及应用与人之间 (A2P) 通信的完全托管型消息收发服务。

Amazon Lambda : Lambda是一项无服务器事件驱动型计算服务,该服务使您可以运行几乎任何类型的应用程序或后端服务的代码,而无需预置或管理服务器。这里使用Lambda直接调用企业微信的群聊机器人的webhood地址进行消息的发送。

3、邮件测试

下面我们先将RDS event推送到邮件上用于查看RDS event的相关内容。

首先跳转到SNS页面并创建名为“test”的SNS主题。

对SNS主题创建邮件订阅。

创建EventBridge规则,首先跳转到EventBridge页面。

进行规则定义。

源选择所有rds的事件。这里可以根据需要进行配置,比如需要配置只接收特定数据库的事件通知。

目标选择刚刚创建的sns主题

重启测试数据库获取事件通知。此时可以在邮箱中接收到相关重启的事件通知。这里就完成了发送到邮箱的测试。

4、发送到企业微信

下面创建一个lambda的目标接收SNS的RDS事件通知。并且通过lambda将事件通知推送到企业微信群中到群聊机器人,实现实时推送。

首先按照如下步骤在企业微信群中创建一个企业微信群聊机器人,并获取到webhood的token。

创建群聊机器人。

获取webhood地址。

创建lambda函数,其中配置环境变量为mytoken,该值为上面获取到的机器人的webhook地址中的key的值。例如webhood地址为https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa,则mytoken的值设置为693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa

创建如下的lambda函数,python版本为3.8.

import json
import requests
import os

def lambda_handler(event, context):
    qywx_robot_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key="
    token = os.environ['mytoken']
    send_url = qywx_robot_url + token
    headers = {
        'Content-Type': 'application/json'
    }

    context = ""
    try:
    message = json.loads(event['Records'][0]['Sns']['Message'])
    # 时间
    time = message['time']
    detail = str(message['detail'])
    title = '<font color=\"info\">[Amazon Web Services health event]</font>'

    content = title + "\n> time: " + str(time) + "\n> detail: " + detail

    except Exception as e:
        print('cloudwath event 告警解析异常,请检查lambda代码')
        print(str(e))
        content = "cloudwath event 告警解析异常,请检查lambda代码" + str(e)

    msg = {
        "msgtype": 'markdown',
        "markdown": {'content': content}
    }

    response = requests.post(url=send_url, data=json.dumps(msg), headers=headers)
    print('已发送消息到企业微信')
    return response.text

配置sns,创建lambda的订阅并根据情况删除邮件的订阅。

在企业微信接收相关通知。

5、小结

在这篇文章中,我们演示了如何使用 EventBridge, SNS 和 Lambda 自定义 Amazon RDS 事件通知并发送到企业微信进行通知。 监控数据库对每个组织都至关重要; 借助此解决方案,我们可以使用 Amazon RDS 事件监控数据库,向运营团队发送通知, 这有助于您管理和监视所有 Amazon RDS 数据库环境。 您还可以根据您的要求添加和删除所需的 Amazon RDS 事件。同时本方案支持在EventBridge中支持的所有亚马逊云服务,包括ElastiCache,OpenSearch等,可以同时订阅并发送通知到企业微信。

参考连接:

1、企业微信:如何设置群机器人

https://open.work.weixin.qq.com/help2/pc/14931?person_id=1

2、企业微信:群机器人配置说明

https://developer.work.weixin.qq.com/document/path/91770

3、监控 Amazon RDS 事件

https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/working-with-events.html

本篇作者

肖福生

西云数据解决方案架构师,负责西云数据华南区域的云计算方案咨询和设计,同时致力于亚马逊云科技在国内的应用和推广。在加入西云数据之前,在云计算行业担任解决方案架构师,负责互联网行业的云计算方案咨询以及架构设计,在企业软件架构,数据库,中间件软件等方面有丰富的经验。