cmscore服务地址_cms core服务器
阿里云ECS在已有的系統事件的基礎上,通過云監控新發布了狀態變化類事件和搶占型實例的中斷通知事件。每當ECS實例的狀態發生變化的時候,都會觸發一條ECS實例狀態變化事件。這種變化包括您在控制臺/OpenAPI/SDK操作導致的變化,也包括彈性伸縮或欠費等原因而自動觸發的變化,還包括因為系統異常而觸發的變化。
云監控以前發布的系統事件,主要針對告警后人工介入的場景,而這次新發布的事件屬于正常類的信息通知,適合自動化的審計運維等場景。為了自動化處理ECS狀態變化事件,云監控提供了兩種主要途徑:一種是通過函數計算,另一種是通過MNS消息隊列。本文將為您介紹利用MNS消息隊列自動化處理ECS事件的三種最佳實踐。 自動化處理ECS狀態變化事件的準備工作
創建消息隊列
登錄MNS控制臺。
在隊列列表頁面,選擇地域,單擊右上角的創建隊列,進入新建隊列頁面。
輸入隊列的名稱(例如“ecs-cms-event”)等信息,單擊確認即可完成創建消息隊列。
創建事件報警規則
登錄云監控控制臺。
單擊左側導航欄中的事件監控,進入事件查詢頁面
單擊報警規則頁簽,然后單擊右上角的創建事件報警,彈出創建/修改事件報警對話框。
在基本信息區域,填寫報警規則名稱,例如如“ecs-test-rule”。
設置事件報警規則:選擇事件類型為系統事件。
產品類型、事件等級、事件名稱:產品類型選擇云服務器ECS,事件類型選擇StatusNotification,其余按照實際情況填寫。
資源范圍:選擇全部資源時,任何資源發生相關事件,都會按照配置發送通知;選擇應用分組時,只有指定分組內的資源發生相關事件時,才會發送通知。
在報警方式中,選擇消息隊列,然后選擇地域和隊列(例如ecs-cms-event)。
完成以上設置后,單擊確定按鈕即可完成創建事件報警規則。
安裝Python依賴
本文所有的代碼均使用Python 3.6測試通過,您也可以使用Java等其他編程語言。
請使用Pypi安裝以下Python依賴:
aliyun-python-sdk-core-v3>=2.12.1
aliyun-python-sdk-ecs>=4.16.0
aliyun-mns>=1.1.5
自動化處理ECS狀態變化事件的實施步驟
云監控會把云服務器ECS所有的狀態變化事件都投遞到MNS里面,接下來我們需要通過編寫代碼從MNS獲取消息并進行消息處理。 實踐一:對所有ECS的創建和釋放事件進行記錄
目前ECS控制臺無法查詢已經釋放的實例。如果您有查詢需求,可以通過ECS狀態變化事件把所有ECS的生命周期記錄在自己的數據庫或者日志里。每當創建ECS時,會首先發送一個Pending事件,每當釋放ECS時,會最后發送一個Deleted事件。我們需要對這兩種事件進行記錄。
編輯一個Conf文件。需包含mns的endpoint(可以登錄MNS的控制臺,在隊列列表頁,單擊獲取Endpoint得到)、阿里云的access key和secrect、region id(例如cn-beijing)以及mns queue的名字。
class Conf:
endpoint = 'http://.mns..aliyuncs.com/'
access_key = ''
access_key_secret = ''
region_id = 'cn-beijing'
queue_name = 'test'
vsever_group_id = ''
使用MNS的SDK編寫一個MNS Client用來獲取MNS消息。
# -*- coding: utf-8 -*-
import json
from mns.mns_exception import MNSExceptionBase
import logging
from mns.account import Account
from . import Conf
class MNSClient(object):
def __init__(self):
self.account = Account(Conf.endpoint, Conf.access_key, Conf.access_key_secret)
self.queue_name = Conf.queue_name
self.listeners = dict()
def regist_listener(self, listener, eventname='Instance:StateChange'):
if eventname in self.listeners.keys():
self.listeners.get(eventname).append(listener)
else:
self.listeners[eventname] = [listener]
def run(self):
queue = self.account.get_queue(self.queue_name)
while True:
try:
message = queue.receive_message(wait_seconds=5)
event = json.loads(message.message_body)
if event['name'] in self.listeners:
for listener in self.listeners.get(event['name']):
listener.process(event)
queue.delete_message(receipt_handle=message.receipt_handle)
except MNSExceptionBase as e:
if e.type == 'QueueNotExist':
logging.error('Queue %s not exist, please create queue before receive message.', self.queue_name)
else:
logging.error('No Message, continue waiting')
class BasicListener(object):
def process(self, event):
pass
上述代碼只是對MNS消息進行拉取,調用Listener消費消息之后刪除消息,后面的實踐也會用到。
注冊一個Listener進消費指定事件。這個簡單的Listener判斷收到Pending和Deleted事件時,打印一行日志。
# -*- coding: utf-8 -*-
import logging
from .mns_client import BasicListener
class ListenerLog(BasicListener):
def process(self, event):
state = event['content']['state']
resource_id = event['content']['resourceId']
if state == 'Panding':
logging.info(f'The instance {resource_id} state is {state}')
elif state == 'Deleted':
logging.info(f'The instance {resource_id} state is {state}')
Main函數可以這么寫:
mns_client = MNSClient()
mns_client.regist_listener(ListenerLog())
mns_client.run()
實際生產環境下,可能需要把事件存儲在數據庫里,或者利用SLS日志服務,方便后期的搜索和審計。
實踐二:ECS的關機自動重啟
在某些場景下,ECS會非預期的關機,您可能需要自動重啟已經關機的ECS。
為了實現這一目的,我們復用實踐一里面的MNS Client,添加一個新的Listener。當收到Stopped事件的時候,對該ECS執行一個Start命令。
-- coding: utf-8 --
import logging from aliyunsdkecs.request.v20140526 import StartInstanceRequest from aliyunsdkcore.client import AcsClient from .mns_client import BasicListener from .config import Conf
class ECSClient(object): def init(self, acs_client): self.client = acs_client
# 啟動ECS實例
def start_instance(self, instance_id):
logging.info(f'Start instance {instance_id} ...')
request = StartInstanceRequest.StartInstanceRequest()
request.set_accept_format('json')
request.set_InstanceId(instance_id)
self.client.do_action_with_exception(request)
class ListenerStart(BasicListener): def init(self): acs_client = AcsClient(Conf.access_key, Conf.access_key_secret, Conf.region_id) self.ecs_client = ECSClient(acs_client)
def process(self, event):
detail = event['content']
instance_id = detail['resourceId']
if detail['state'] == 'Stopped':
self.ecs_client.start_instance(instance_id)
在實際生產環境下,執行完Start命令后,可能還需要繼續接收后續的Starting/Running/Stopped等事件,再配合計時器和計數器,進行Start成功或失敗之后的處理。 實踐三:搶占型實例釋放前,自動從SLB移除
搶占型實例在釋放之前五分鐘左右,會發出釋放告警事件,您可以利用這短暫的時間運行一些業務不中斷的邏輯。例如,主動從SLB的后端服務器中去掉這臺即將被釋放的搶占型實例,而不是被動等待實例釋放后SLB的自動處理。
我們還是復用實踐一的MNS Client,添加一個新的Listener,當收到搶占型實例的釋放告警時,調用SLB的SDK。
-- coding: utf-8 --
from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest from .mns_client import BasicListener from .config import Conf
class SLBClient(object): def init(self): self.client = AcsClient(Conf.access_key, Conf.access_key_secret, Conf.region_id) self.request = CommonRequest() self.request.set_method('POST') self.request.set_accept_format('json') self.request.set_version('2014-05-15') self.request.set_domain('slb.aliyuncs.com') self.request.add_query_param('RegionId', Conf.region_id)
def remove_vserver_group_backend_servers(self, vserver_group_id, instance_id):
self.request.set_action_name('RemoveVServerGroupBackendServers')
self.request.add_query_param('VServerGroupId', vserver_group_id)
self.request.add_query_param('BackendServers',
"[{'ServerId':'" + instance_id + "','Port':'80','Weight':'100'}]")
response = self.client.do_action_with_exception(self.request)
return str(response, encoding='utf-8')
class ListenerSLB(BasicListener): def init(self, vsever_group_id): self.slb_caller = SLBClient() self.vsever_group_id = Conf.vsever_group_id
def process(self, event):
detail = event['content']
instance_id = detail['instanceId']
if detail['action'] == 'delete':
self.slb_caller.remove_vserver_group_backend_servers(self.vsever_group_id, instance_id)
總結
以上是生活随笔為你收集整理的cmscore服务地址_cms core服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二级分类_免费获取2021年二级造价工程
- 下一篇: tebluea 仪表板如何联动_报告厅音