利用無伺服器架構中提供的定時觸發能力,在運維監控場景有很多種用處,例如定時備份、定時撥測、定時統計等。在網際網路業務監控運維的場景下,我們通常可以利用定時撥測,檢測系統或服務的健康狀态,并在系統異常的情況下及時發出告警,避免造成業務中斷。
接下來,我們就利用無伺服器雲
代碼準備
測試腳本比較簡單,通過單檔案就可以完成。我們可以通過将如下代碼儲存為 index.py 檔案,或者直接将代碼複制後粘貼到編輯視窗的方式完成函數建立。
# -*- coding: utf8 -*-
import json
import logging
import requests
from email.mime.text import MIMEText
from email.header import Header
import smtplib
import os
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
#logger.addHandler(logging.StreamHandler())
test_url_list = [
"http://www.baidu.com",
"http://www.qq.com",
"http://cloud.tencent.com",
"http://unkownurl.com"
]
email_server_config = {
"server":"smtp.qq.com",
"port":465,
"user":"[email protected]",
"pwd":os.getenv("EMAIL_PWD"),
"fromAddr":"[email protected]"
}
email_notify_list = [
"[email protected]"
]
def send_mail(toAddrList,subject,content):
logger.info("send mail")
try:
receivers = toAddrList
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header("自動撥測", 'utf-8')
message['To'] = Header("異常通知接收", 'utf-8')
message['Subject'] = Header(subject, 'utf-8')
smtpObj = smtplib.SMTP_SSL(email_server_config["server"], email_server_config["port"])
#smtpObj = smtplib.SMTP(email_server_config["server"], email_server_config["port"])
smtpObj.login(email_server_config["user"],email_server_config["pwd"])
smtpObj.sendmail(email_server_config["fromAddr"], receivers, message.as_string())
logger.info("send success")
except Exception as e:
logger.warn(str(e))
logger.warn(type(e))
logger.warn("Error: send fail")
def test_url(url_list):
errorinfo = []
for url in url_list:
resp = None
try:
resp = requests.get(url,timeout=3)
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError, requests.exceptions.ConnectTimeout) as e:
logger.warn("request exceptions:"+str(e))
errorinfo.append("Access "+ url + " timeout")
else:
if resp.status_code >= 400:
logger.warn("response status code fail:"+str(resp.status_code))
errorinfo.append("Access "+ url + " fail, status code:" + str(resp.status_code))
if len(errorinfo) != 0:
send_mail(email_notify_list,"撥測異常通知","\r\n".join(errorinfo))
def main_handler(event, context):
test_url(test_url_list)
if __name__ == '__main__':
main_handler("", "")
在這段代碼裡,我們需要撥測的位址放置在 test_url_list 清單中,并在撥測時,通過 GET 方法發起調用。在發起調用後,無論是 URL 通路逾時,還是傳回的 HTTP 狀态碼錯誤,均會記錄 URL 撥測結果,并通過 Email 發送出來。而 Email 的發送配置,我們存儲在 email_server_config 中,并且從環境變量中擷取 Email server 的登入密碼,避免在代碼中暴露密碼的洩露風險。同時,通知郵件的接收者,通過 email_notify_list 這個清單儲存,向這個清單中添加更多的郵件位址,可以確定更多相關人員在撥測到異常時,接收到告警郵件。
同時,這段代碼中的郵件伺服器使用的是 QQ 郵箱。QQ 郵箱的 SMTP 郵件發送服務,可以在郵箱的設定-賬号中開啟,并且在開啟 SMTP 服務後,可以通過申請授權碼,作為郵箱的登入賬号使用。
雲函數配置
接下來,我們通過建立函數,配置觸發,讓撥測可以正常的運作起來。
建立及配置函數
首先我們來建立和配置函數。建立前,我們可以先選擇合适的地域來部署函數,甚至可以選擇為多地域同時部署,檢驗多地發起撥測時的聯通性。選擇好地域後,我們建立函數,輸入函數名,選擇運作環境為 Python 2。同時,函數的運作逾時也需要一定程度的放大,例如設定為 60s,避免因為撥測時 URL 通路逾時導緻的函數運作逾時,無法正常發出郵件。同時在建立函數時,我們也需要配置好函數的環境變量,設定 EMAIL_PWD 環境變量名,并填寫通過郵箱配置獲得的登入授權碼,或登入密碼。
在函數代碼界面,可以通過把本地已經存儲的 index.py 檔案夾打包成 zip 包,然後上傳的方式送出代碼,也可以通過直接在代碼編輯視窗粘貼如上代碼的方式,完成代碼送出和儲存。
在配置觸發器時,我們可以先跳過這個步驟,完成函數運作測試後再配置定時觸發器啟動函數。
測試及啟動函數
完成函數建立後,我們可以通過 "測試" 案例觸發函數,檢視運作情況。撥測函數未處理函數入參,是以任何測試入參,或者無入參都可以觸發函數。通過測試時的輸出日志,我們可以檢視撥測結果,郵件發送情況。
通過日志确認函數運作正确後,我們就可以根據需求配置上觸發器,開始函數的定時撥測運作。最簡單的可以通過選擇每 5 分鐘運作一次來進行撥測,如果有特殊的定時運作需求,也可以通過自行填寫 cron 格式來選擇合适的運作觸發時間或周期。
總結
通過本節内容,我們實作了一個簡單的 URL 撥測及郵件告警的定時運作腳本。本節内容的實作方式很簡單,例如撥測的 URL 、郵件告警發送方,都是直接儲存在代碼中;URL 僅能通過 GET 方法進行撥測;僅支援通過 Email 發送告警等。此内容更多的是為大家提供使用 Serverless 架構或者使用雲函數的一種思路,基于此思路,我們可以進行更多的擴充,例如增加非 HTTP 的撥測、增加短信告警能力、增加外部配置能力等。基于此思路,歡迎大家繼續擴充并分享在運維過程中使用雲函數的經驗。
注明:本文來自投稿,不代表伺服器文檔網立場,如若轉載,請注明出處:https://www.fwqwd.com/12868.html