函数计算自动化运维实战 3 -- 事件触发自动创建快照
函數計算
阿里云函數計算是一個事件驅動的全托管計算服務。通過函數計算,您無需管理服務器等基礎設施,只需編寫代碼并上傳。函數計算會為您準備好計算資源,以彈性、可靠的方式運行您的代碼,并提供日志查詢,性能監控,報警等功能。借助于函數計算,您可以快速構建任何類型的應用和服務,無需管理和運維。更棒的是,您只需要為代碼實際運行消耗的資源付費,而代碼未運行則不產生費用。
云監控
阿里云云監控為云上用戶提供開箱即用的企業級開放型一站式監控解決方案。涵蓋 IT 設施基礎監控,外網網絡質量撥測監控,基于事件、自定義指標、日志的業務監控。為您全方位提供更高效、更全面、更省錢的監控服務。
云監控提供了豐富事件,并且事件還在不斷豐富中(云產品系統事件監控), 豐富的事件觸發自定義處理的函數,可以實現更加完美的的自動化運維。
專題傳送門 => 函數計算進行自動化運維專題
示例場景
在本文中,重點關注函數計算對 ecs 的重啟事件處理,因為這些 ecs 重啟事件是目前用戶需要很高優先級用戶優先級去響應的;假設之前一臺 ecs 發生因系統錯誤而重啟,用戶可能會緊急起來做一些驗證或者創建快照的處理, 在本示例中,我們對一臺因為系統錯誤實例重啟或者因實例錯誤而重啟的機器進行自動化處理,比如成功重啟后創建快照處理。
ecs 系統事件
云產品系統事件監控
操作步驟
- 創建函數(函數代碼在文末),函數創建可參考函數計算helloworld
注:記得給函數的 service 的 role 設置操作 ecs 的權限
- 登錄云監控控制臺, 創建報警規則, 監控的事件為ecs 因實例錯誤或西戎錯誤重啟開始和結束
-
mock 調試
-
模擬真實的 ecs 事件
請參考演練系統事件處理程序? So Easy~
代碼
# -*- coding: utf-8 -*- import logging import json, random, string, time from aliyunsdkcore import client from aliyunsdkecs.request.v20140526.DeleteSnapshotRequest import DeleteSnapshotRequest from aliyunsdkecs.request.v20140526.CreateSnapshotRequest import CreateSnapshotRequest from aliyunsdkecs.request.v20140526.DescribeDisksRequest import DescribeDisksRequest from aliyunsdkcore.auth.credentials import StsTokenCredential LOGGER = logging.getLogger() clt = None def handler(event, context):creds = context.credentialssts_token_credential = StsTokenCredential(creds.access_key_id, creds.access_key_secret, creds.security_token)'''{"product": "ECS","content": {"executeFinishTime": "2018-06-08T01:25:37Z","executeStartTime": "2018-06-08T01:23:37Z","ecsInstanceName": "timewarp","eventId": "e-t4nhcpqcu8fqushpn3mm","eventType": "InstanceFailure.Reboot","ecsInstanceId": "i-bp18l0uopocfc98xxxx" },"resourceId": "acs:ecs:cn-hangzhou:123456789:instance/i-bp18l0uopocfc98xxxx","level": "CRITICAL","instanceName": "instanceName","status": "Executing","name": "Instance:SystemFailure.Reboot:Executing", "regionId": "cn-hangzhou"}'''evt = json.loads(event)content = evt.get("content");ecsInstanceId = content.get("ecsInstanceId");regionId = evt.get("regionId");global cltclt = client.AcsClient(region_id=regionId, credential=sts_token_credential)name = evt.get("name");name = name.lower()if name in ['Instance:SystemFailure.Reboot:Executing'.lower(), "Instance:InstanceFailure.Reboot:Executing".lower()]:pass# do other thingsif name in ['Instance:SystemFailure.Reboot:Executed'.lower(), "Instance:InstanceFailure.Reboot:Executed".lower()]:request = DescribeDisksRequest()request.add_query_param("RegionId", "cn-shenzhen")request.set_InstanceId(ecsInstanceId)response = _send_request(request)disks = response.get('Disks').get('Disk', [])for disk in disks:diskId = disk["DiskId"]SnapshotId = create_ecs_snap_by_id(diskId)LOGGER.info("Create ecs snap sucess, ecs id = %s , disk id = %s ", ecsInstanceId, diskId)def create_ecs_snap_by_id(disk_id):LOGGER.info("Create ecs snap, disk id is %s ", disk_id)request = CreateSnapshotRequest()request.set_DiskId(disk_id)request.set_SnapshotName("reboot_" ''.join(random.choice(string.ascii_lowercase) for _ in range(6)))response = _send_request(request)return response.get("SnapshotId") # send open api request def _send_request(request):request.set_accept_format('json')try:response_str = clt.do_action_with_exception(request)LOGGER.info(response_str)response_detail = json.loads(response_str)return response_detailexcept Exception as e:LOGGER.error(e)“阿里巴巴云原生微信公眾號(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦云原生流行技術趨勢、云原生大規模的落地實踐,做最懂云原生開發者的技術公眾號。”
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的函数计算自动化运维实战 3 -- 事件触发自动创建快照的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数计算自动化运维实战2 -- 事件触发
- 下一篇: 阿里云上万个 Kubernetes 集群