亚马逊AWS官方博客

集中整合EventBridge事件通知发送到钉钉和企业微信

背景介绍:

我们在使用AWS时偶尔会在管理员邮箱中收到AWS发的通知邮件,比如关于EC2维护信息,这些邮件很容易淹没在收件箱中,没有得到及时处理。另外对于重要的应用我们可能会在CloudWatch设置一些指标告警并进行邮件通知。如果这些都可以发到微信或钉钉等即时通信软件,就比邮件通知好多了,毕竟很多人都习惯在微信等即时通信软件上查看消息。为此,我们提供了AWS告警通知发送到企业微信和钉钉的解决方案。

但如果您管理着多个AWS账号,而这些账号可能又属于多个不同的AWS Organization,那您需要在每个账号里分别做配置;另外,日后新增账号时,也得配置一次。那这样看起来工作量也不小。

为此,我们在原有告警通知方案的基础上,增加了对AWS Organization和多子账号,以及新增子账号自动配置的支持,以便提高您的运维效率。

说明:此方案仅目前仅支持AWS Global Regions,在AWS 北京和宁夏区暂时不支持事件的跨区传输。

整体架构:

AWS服务介绍:

  • Event Bridge – 用于事件的监听及转发;
  • SNS – 用于服务间的解耦合;
  • Lambda – 发送事件到钉钉的的代码;
  • Secrets Manager – 用于存储钉钉账号信息;
  • CloudFormation – 用于部署所需资源;
  • IAM – 用于给予账号间发送事件信息的角色。

架构介绍:

  • 本架构支持在多个AWS Organization的部署,支持跨区域。
  • 发送消息到钉钉的代码只需要在任意一个账号中部署一次(此账号我们成为主账号),且全部采用无服务器架构,可以有效的节约企业成本。
  • 在主账号中创建专门的事件总线(Target Event Bus),该Event Bus配置规则发送事件到SNS;Lambda用于接收SNS的事件,从Secrets Manager获取钉钉的账号信息,调用钉钉的接口,发送信息。
  • 主账号的默认事件总线(Default Event Bus)配置规则,用于对事件进行筛选并发送事件到Target Event Bus。
  • Target Event Bus需要配置一个Resource Based Policy,通过Organization ID或者AWS Account ID对其他账号进行信任,严格控制安全。
  • 其他AWS Organization的账号通过Organization管理账号创建的StackSet来部署 IAM Rule 和规则。
  • 子账号使用规则筛选事件并把事件转发到主账号的Target Event Bus。

准备工作:

  1. 按需要配置钉钉或者企业微信用于接收消息

a. 配置钉钉

Ⅰ. 参考钉钉官方网站文档来配置:自定义机器人接入

Ⅱ. 在“Security Settings”选项下勾选“Custom Keywords”,输入“aws”。

Ⅲ. 获取机器人的Webhook地址并记录下来。后面的步骤会用到。

b. 配置企业微信

Ⅰ. 打开企业微信登陆网站

https://work.weixin.qq.com/wework_admin/loginpage_wx。如果之前没有注册过企业,点击“企业注册”来注册企业。

Ⅱ. 登陆企业微信后,点击“我的企业”->“企业信息”,记录下“企业ID”的值。后面的步骤会用到。

Ⅲ. 点击“应用管理”->“应用”->“创建应用”。

Ⅳ. 上传应用logo,填入“应用名称”信息,选择合适的可见范围,例如根节点。之后点击“创建应用”按钮。

Ⅴ. 创建成功后,点击“Secret”右边的“查看”链接。记录下“AgentId”和“Secret”的值。后面的步骤会用到。

主账号资源部署:

  1. 按需要配置发往钉钉或者企业微信的SNS Topic

a. 配置钉钉

  • 登陆AWS Console,选择Serverless Application Repository服务,点击“Available applications”->“Public applications”。在搜索框里输入“dingtalk”。勾选上“Show apps that create custom IAM roles or resource policies”。点击“DingTalk-Notifier”。

  • 在“Application settings”部分填入之前拿到的AWSNotifier的Secret,AgentID和企业ID的值。之后点击“Deploy”。

  • 点击“Deployments”,查看“Status”变为“Create complete”,等待部署完成。

  • 登陆AWS Console,选择Amazon EventBridge服务,点击“Rules”,“Event bus“选择“default”,删除以“serverlessrepo-DingTalk-No-EventRuleEC2StateChange-”和“serverlessrepo-DingTalk-Notifie-EventRuleEC2Health-”开头的两条Rule。

Ⅰ. 登陆AWS Console,选择Amazon SNS服务,点击“Topics”,记录下以“serverlessrepo-DingTalk-Notifier-DingTalkNotifierSNSTopic-”开头的Topic的名字。后面部署过程中会用到。

b. 配置企业微信

  • 登陆AWS Console,选择Serverless Application Repository服务,点击“Available applications”->“Public applications”。在搜索框里输入“wechat”。勾选上“Show apps that create custom IAM roles or resource policies”。点击“WeChat-Notifier”。

  • 在“Application settings”部分填入之前拿到的AWSNotifier的Secret,AgentID和企业ID的值。之后点击“Deploy”。

  • 点击“Deployments”,查看“Status”变为“Create complete”,等待部署完成。

  • 登陆AWS Console,选择Amazon EventBridge服务,点击“Rules”,“Event bus“选择“default”,删除以“serverlessrepo-WeChat-Noti-EventRuleEC2StateChange-”和“serverlessrepo-WeChat-Notifier-EventRuleEC2Health-”开头的两条Rule。

Ⅰ. 登陆AWS Console,选择Amazon SNS服务,点击“Topics”,记录下以“serverlessrepo-WeChat-Notifier-WeChatNotifierSNSTopic-”开头的Topic的名字。后面部署过程中会用到。

  1. 配置Amazon EventBridge用于接收所有账户发送出来的Event是,并且发给钉钉或者企业微信。

a. 登陆AWS Console,选择Amazon EventBridge服务,点击“Event buses”,点击“Create event bus”按钮。

b. “Name”填入“centralized-events”;“Resource-based policy”填入如下信息。其中

  • “<REGION_ID>”填入当前账户所在的region。
  • “<ACCOUNT_ID>”填入当前账户的account ID。
  • “<ORGANIZATION_ID>”填入event发送账户所在的Orgnization的OrgnizationID。
{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "allow_all_accounts_from_organization_to_put_events",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "events:PutEvents",
    "Resource": "arn:aws:events:<REGION_ID>:<ACCOUNT_ID>:event-bus/centralized-events",
    "Condition": {
      "StringEquals": {
        "aws:PrincipalOrgID": "<ORGANIZATION_ID>"
      }
    }
  }]
}

c. “登陆AWS Console,选择Amazon EventBridge服务,点击“Rules”,“Event bus“选择上一步创建的“centralized-events”。点击“Create rule”按钮。

d. “Name”填入“centralized-events”。“Define Pattern”选择“Event Pattern”。“Event matching pattern”选择“Custom Pattern”。“Event pattern”输入如下信息,然后点击“Save”按钮。

{
    "source": [
        {
            "prefix": ""
        }
    ]
}

e. “Select targets”选择“Target”为“SNS Topic”。“Topic”可以选择之前创建出来的DingTalk的或者WeChat的或者通过点击“Add target”按钮把他们两个都加上。

f. 之后点击“Create”按钮来创建Rule。

g. 创建成功后,查看Rule的详细信息,包括“Event pattern”和“Target(s)”。

子账号资源部署:

每个需要被整合事件的子账号都需要在EventBridge里面的Default Event Bus中部署规则和所需的IAM角色。在这里我们推荐使用Organization中的CloudFormation进行部署,这样做的好处:

  • 如果Organization中有多个账号需要部署,可以实现批量部署,不需要手动一个账号一个账号的安装;
  • 可以实现不同OU或者不同Region部署不同的规则;
  • 支持后续批量更新/撤销规则;
  • 对于Organization中的后续新增账号,也可以自动部署规则,无需人工干预。

具体操作如下:

1. 登陆Organization的管理账号(如果该Organization有Delegated CloudFormation Administrator,也可以登陆这个Administrator的账号)。

2. 打开CloudFormation页面,点击左侧的StackSets菜单。

3. 点击“Create StackSets”按钮。

4. 本例中可以选择“Service-managed permissions”,“Template is ready”,和“Upload a template file”。

5. 请在本地创建一个json文件,其中json文件的内容如下:

{
    "Resources": {
        "eventbridgerulecentralaccount": {
            "Type": "AWS::Events::Rule",
            "Properties": {
                "Description": "Routes centralized event bus",
                "EventBusName": "default",
                "State": "ENABLED",
                "EventPattern": {
                    "source":["aws.ec2"]
                },
                "Targets": [
                    {
                        "Arn": "<<Target Event Bus ARN>>",
                        "Id": "events-central-account",
                        "RoleArn": {
                            "Fn::GetAtt": [
                                "EventBridgeIAMrole",
                                "Arn"
                            ]
                        }
                    }
                ]
            }
        },
        "EventBridgeIAMrole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": {
                                    "Fn::Sub": "events.amazonaws.com"
                                }
                            },
                            "Action": "sts:AssumeRole"
                        }
                    ]
                },
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "PutEventsDestinationBus",
                        "PolicyDocument": {
                            "Version": "2012-10-17",
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "events:PutEvents"
                                    ],
                                    "Resource": [
                                        "<<Target Event Bus ARN>>"
                                    ]
                                }
                            ]
                        }
                    }
                ]
            }
        }
    }
}

本例中监听的事件为该Region下EC2的所有事件。请把<<Target Event Bus ARN>>替换为主账号中的目标Event Bus的ARN。

6. 点击页面中的“Choose file”,选择刚刚创建的json文件,然后点击“Next”。

7. 我们给StackSet起一个名字,还可以输入描述。点击“Next”继续。

8. 接下来我们可以添加一个Tag,并且默认“Inactive”选项不变,点击“Next”继续。

9. 接下来在Deployment targets的部分,可以选择给整个Organization部署,也可以选择只给某个OU部署(包含该OU下面嵌套的子OU下面的账号,最多可以一次部署多达9个OU)。本例中可以选择某个OU进行部署测试,需要填入该OU的ID。

10. 在Specify regions的部分,可以选择需要部署的区域,本例中选择US East,当然您也可以一键选择在所有区域部署。

11. 点击页面右下角的“Next”继续。

12. 在Review页面选中最下面的选择框并点击“Submit”按键提交。

13. 等待部署完毕。可以在StackSet的Operations页面看到部署状态,成功部署完成后会显示“SUCCEEDED”。如下图:

14. 接下来可以进入刚才选定OU中的一个账号,打开部署Region的EventBridge页面,查看是不是刚才的规则已经部署。

测试:

现在可以在部署了规则的账号中terminate一台EC2,这时候刚才的钉钉账号和微信账户中应该收到该事件的消息。

总结:

本文主要介绍了如何使用钉钉推送EventBridge的事件推送,并且使用CloudFormation轻松的在整个Organization中部署规则集中推送事件信息:

  • 整个架构采用无服务器架构,节约了成本;
  • 主账号中使用Resource Based Policy,子账号中使用IAM role保证了整个方案安全性;
  • 使用StackSets实现多账号多区域批量部署规则,大大提升了灵活性和后期的可维护性。

致谢

本项目基于 Niko Feng 企业微信对接项目 、Randy Lin SAR部署项目 和 Chris He DingTalk-Notifier 钉钉告警通知项目 的基础上完成。在此对 Niko、Randy、Chris 表示感谢!

本篇作者

毛培

AWS快速原型团队解决方案架构师。

何康明

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,致力于AWS云服务在国内和全球的应用和推广。在加入AWS之前,曾就职于IBM和VMware,对公有云、私有云架构设计和交付方面有着丰富的经验。

Fox Qin

AWS快速原型团队解决方案架构师,主要负责IoT和移动端方向的架构设计和原型开发,此外对AWS的无服务器架构,跨地区的多账号OrganizationCloudFormation,网络管理,解决方案工程化部署等方面也有深入的研究。

刘栋栋

道通科技开发运维工程师,七年IaaS、PaaS开发运维经验,专注于自动化运维。