亚马逊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。
准备工作:
- 按需要配置钉钉或者企业微信用于接收消息
a. 配置钉钉
Ⅰ. 参考钉钉官方网站文档来配置:自定义机器人接入。
Ⅱ. 在“Security Settings”选项下勾选“Custom Keywords”,输入“aws”。
Ⅲ. 获取机器人的Webhook地址并记录下来。后面的步骤会用到。
b. 配置企业微信
Ⅰ. 打开企业微信登陆网站
https://work.weixin.qq.com/wework_admin/loginpage_wx。如果之前没有注册过企业,点击“企业注册”来注册企业。
Ⅱ. 登陆企业微信后,点击“我的企业”->“企业信息”,记录下“企业ID”的值。后面的步骤会用到。
Ⅲ. 点击“应用管理”->“应用”->“创建应用”。
Ⅳ. 上传应用logo,填入“应用名称”信息,选择合适的可见范围,例如根节点。之后点击“创建应用”按钮。
Ⅴ. 创建成功后,点击“Secret”右边的“查看”链接。记录下“AgentId”和“Secret”的值。后面的步骤会用到。
主账号资源部署:
- 按需要配置发往钉钉或者企业微信的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的名字。后面部署过程中会用到。
- 配置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。
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”按钮。
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文件的内容如下:
本例中监听的事件为该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 表示感谢!