函數計算
阿裡雲
是一個事件驅動的全托管計算服務。通過函數計算,您無需管理伺服器等基礎設施,隻需編寫代碼并上傳。函數計算會為您準備好計算資源,以彈性、可靠的方式運作您的代碼,并提供日志查詢,性能監控,報警等功能。借助于函數計算,您可以快速建構任何類型的應用和服務,無需管理和運維。更棒的是,您隻需要為代碼實際運作消耗的資源付費,而代碼未運作則不産生費用。
雲監控
為雲上使用者提供開箱即用的企業級開放型一站式監控解決方案。涵蓋IT設施基礎監控,外網網絡品質撥測監控,基于事件、自定義名額、日志的業務監控。為您全方位提供更高效、更全面、更省錢的監控服務。
雲監控提供了豐富事件,并且事件還在不斷豐富中(
雲産品系統事件監控), 豐富的事件觸發自定義處理的函數,可以實作更加完美的的自動化運維。
專題傳送門 => 函數計算進行自動化運維專題
示例場景
在本文中,重點關注函數計算對ecs的重新開機事件處理,因為這些ecs重新開機事件是目前使用者需要很高優先級使用者優先級去響應的;假設之前一台ecs 發生因系統錯誤而重新開機,使用者可能會緊急起來做一些驗證或者建立快照的處理, 在本示例中,我們對一台因為系統錯誤執行個體重新開機或者因執行個體錯誤而重新開機的機器進行自動化處理,比如成功重新開機後建立快照處理。
ecs 系統事件
操作步驟
- 建立函數(函數代碼在文末),函數建立可參考 函數計算helloworld
注:記得給函數的service的role設定操作ecs的權限
- 登入 雲監控控制台 , 建立報警規則, 監控的事件為ecs 因執行個體錯誤或西戎錯誤重新開機開始和結束
函數計算自動化運維實戰3 -- 事件觸發自動建立快照函數計算雲監控示例場景操作步驟
- mock調試
函數計算自動化運維實戰3 -- 事件觸發自動建立快照函數計算雲監控示例場景操作步驟
-
模拟真實的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.credentials
sts_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 clt
clt = 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 things
if 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_detail
except Exception as e:
LOGGER.error(e)
“ 阿裡巴巴雲原生微信公衆号(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術公衆号。”