
簡介
【資料圖】
在使用亞馬遜云的過程中,各種服務的通知事件在日常運維里常常發揮著關鍵作用。但在實際使用過程中,這些通知常常因為各種原因被忽略而導致意外的損失。如:亞馬遜云的維護事件會發送通知郵件到賬號的注冊郵箱,但這些郵箱通常無人值守,使得在維護事件發生時,客戶會遭遇“意外”停機。另外,客戶部署的工作負載也有各種自定義的通知希望集成到一個統一的客戶端進行提醒;而現在各種流行的即時通信軟件都有移動客戶端,同時基本都支持webhook機制,外部通過API調用,即可傳入相應的信息;因此即時通信軟件是接收這些通知的理想終端。
但如果您管理著多個AWS賬號,而這些賬號可能又屬于多個不同的AWS Organization,那您需要在每個賬號里分別做配置;另外,日后新增賬號時,也得配置一次。那這樣看起來工作量也不小。
為此,我們在原有告警通知方案的基礎上,增加了對AWS Organization和多子賬號, 以便提高您的運維效率。
說明:此方案僅目前僅支持AWS Global Regions,在AWS 北京和寧夏區暫時不支持事件的跨區傳輸。
架構設計
架構圖
相關服務介紹
Event Bridge – 用于事件的監聽及轉發;SNS – 用于服務間的解耦合;Lambda – 發送事件到飛書的的代碼;IAM – 用于給予賬號發送事件信息的角色。架構介紹
本架構支持在多個AWS Organization的部署,支持跨區域。發送消息到飛書的代碼只需要在任意一個賬號中部署一次(此賬號我們成為主賬號),且全部采用無服務器架構,可以有效的節約企業成本。在主賬號中創建專門的事件總線(Target Event Bus),該Event Bus配置規則發送事件到SNS;Lambda用于接收SNS的事件,調用飛書的接口,發送信息。主賬號的默認事件總線(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。準備工作
創建飛書機器人并將webbook記錄一下
Organization Master 部署
IAM
創建執行lambda function需要的iam role
Lambda
創建 lambda function
創建 lambda layer
這里 Compatible architectures & runtimes 一定要和創建 function 的一致
暫時無法在飛書文檔外展示此內容
源碼可以從這里找到??https://github.com/Chris-wa-He/AWS-Lambda-notifier/tree/Feishu-notifier??
lambda function 添加 layer
更新 lambda function 代碼并部署
import osimport boto3from feishu import Feishufrom alarm import AlarmsecretURL = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxxxxxxxxxx"# Initial Feishu handlerfeishu = Feishu(secretURL)def lambda_handler(event, context): print(event) msg = msg_format(event) print(msg) fsAlarm = Alarm( description=msg, ) feishu.send_text_msg(fsAlarm) response = { "statusCode": 200, "body": "Message Sent." } return responsedef msg_format(event): try: # 消息來源是SNS,取 $.Records[0].Sns.Message,并對字符串進行一些處理,確保發送時可以正常顯示 msg = event["Records"][0]["Sns"]["Message"] # 進行字符串處理后返回,以確保IM客戶端正確顯示 msg = msg.replace("\\n", "\n") if msg[0] == "\"" and msg[-1] == "\"": msg = msg[1:-1] return msg except: # 消息來源不是SNS,直接返回 return event
SNS
創建 topic
創建 Subscriptions
EventBridge
Create event bus
Resource-base policy (PS: 可以在 Create event bus 時 Load template 加載默認模板 選擇其中的 allow_all_accounts_from_organization_to_put_events polic )
Create rules
{ "source": [{ "prefix": "" }] }
子賬號配置
每個需要被整合事件的子賬號都需要在EventBridge里面的Default Event Bus中部署規則和所需的IAM角色。
IAM
Permission
<
<
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "events:PutEvents" ], "Resource": [ "arn:aws:events:us-east-1:<>:event-bus/< >" ], "Effect": "Allow" } ] }
Trust relationships
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
EventBridge
敲黑板 這里一定要選擇 default event bus
創建 ec2 status rules
創建 ec2 scheduled change rules 同理
event pattern
{ "source": ["aws.health"], "detail-type": ["AWS Health Event"], "detail": { "service": ["EC2"], "eventTypeCategory": ["scheduledChange"] } }
測試
將 ec2 stop & start
卸載
將上述創建的資源逆向刪除即可
參考連接
??https://aws.amazon.com/premiumsupport/knowledge-center/eventbridge-notification-scheduled-events/??
??https://aws.amazon.com/cn/blogs/china/centralized-integration-of-eventbridge-event-notifications-sent-to-ding-talk-and-enterprise-wechat/??
??https://aws.amazon.com/cn/blogs/china/enable-wechat-dingtalk-alarm-notification-with-one-click-based-on-aws-serverless/??
??https://github.com/Chris-wa-He/AWS-Lambda-notifier/tree/Feishu-notifier??
License:??Attribution-NonCommercial-ShareAlike 4.0 International??
本文出自??Suzf Blog??。 如未注明,均為 SUZF.NET 原創。
轉載請注明:??https://suzf.net/post/1458??