配置審計(Config)變配報警設置

簡介:本文做者【紫極zj】,本篇將主要介紹經過配置審計的自定義規則等服務,對負載均衡進行預警行爲的相關介紹。node

前言

配置審計(Config)將您分散在各地域的資源整合爲全局資源列表,可便捷地搜索全局資源,並經過規則對資源配置進行評估,過濾出不符合業務要求的資源變配操做。
本文爲您介紹如何經過配置審計(Config)的自定義規則和日誌服務(SLS)報警配合,對指定的負載均衡(SLB)變配進行報警,幫助企業快速感知變配內容並及時作出相應對策。數據庫

背景

雲上帳號主要有阿里雲主帳號、RAM子帳號、RAM角色,阿里雲主帳號對全部資源都有完整的控制能力,一些被賦予高級權限的RAM子帳號、RAM角色等也一樣能夠控制資源。如何在變動操做以前阻斷該行爲,是服務控制策略(SCP)的範疇(該服務限制只能是企業認證帳戶,而且開通了資源目錄(Resource Directory)纔可實施),本文暫不討論。如何在變配後快速感知到變化也很是重要。公司A的運維同窗向咱們提了一個問題:公司的核心業務部署在阿里雲上,採用的架構是彈性計算ECS+負載均衡(SLB)+關係型數據庫RDS,天天都擔憂核心服務異常變配致使業務中斷,但願變配後及時收到消息通知,想問問有沒有什麼方案。
咱們爲他們推薦了配置審計(Config)結合日誌服務(SLS)的報警。那這個產品組合是如何實現以上目標的呢?api

流程圖

image.png

整個方案的流程圖如上所示。員工A修改了企業某核心業務負載均衡(SLB)的配置。資源變配數據會被配置審計(Config)感知並存儲,同時會觸發監聽該類資源變更的規則進行評估。規則引擎接收的入參包含了資源變更的 Diff 數據,若是該規則爲自定義規則,規則引擎會執行配置好的函數計算(FC)的函數。函數過濾出目標資源的變動,並將變動數據寫入日誌服務(SLS)中。日誌服務經過配置告警策略,觸發告警並通知管理員。
另外兩條實線表示管理員能夠前往配置審計(Config)查看資源時間線以及經過日誌服務(SLS)查看資源具體的配置變動信息。架構

新建一個日誌庫(logstore)負載均衡

新建日誌庫(logstore),用於存儲目標資源的變配數據,同時咱們能夠基於這個日誌庫(logstore)配置告警策略;具體如何建立日誌項目(project)及日誌庫(logstore),這裏我就再也不贅述,您可參考日誌服務的文檔進行操做。
本案例對應的日誌項目爲: aliyun-fc-cn-hangzhou-26064c43-65dc-5734-8175-3c0fdfc784df ,日誌庫爲: specific-config-alert 。運維

新建函數計算(FC)的函數函數

配置審計(Config)的自定義規則是基於函數計算(FC)實現的。函數所屬的地域是不受限制的。本案例選擇地域爲華東1(杭州)。
image.pngui

我是基於 alimebot-nodejs 模板建立的函數。
image.png阿里雲

咱們在 ConfigService 這個服務下面新建一個名爲 specific-config-change-alert 的函數。 spa

函數的內部的業務邏輯,咱們進行以下設計:

  1. 支持用戶額外指定一個參數 arn ,方便咱們對某一個特定的資源進行報警;若是不指定 arn,則表示對該類型的資源變動都進行告警;
  2. 調用日誌服務(SLS)的SDK,將日誌存入日誌庫(logstore);

代碼邏輯以下

const ALY = require('aliyun-sdk'); // 日誌服務Nodejs SDK
exports.handler = function (event, context, callback) {
    const sls = new ALY.SLS({
        "accessKeyId": context.credentials.accessKeyId,            //阿里雲訪問密鑰AccessKey ID。更多信息,請參見訪問密鑰。阿里雲主帳號AccessKey擁有全部API的訪問權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或平常運維。 
        "secretAccessKey": context.credentials.accessKeySecret,    //阿里雲訪問密鑰AccessKey Secret。 
        "securityToken": context.credentials.securityToken,        //RAM角色額外輸入的securityToken
        endpoint: 'http://cn-hangzhou.log.aliyuncs.com',           //日誌服務的域名。更多信息,請參見服務入口。此處以杭州爲例,其它地域請根據實際狀況填寫。
        apiVersion: '2015-06-01'                                   //SDK版本號,固定值。
    });
    // -------------------------------
    // put logs
    // -------------------------------
    const projectName = "aliyun-fc-cn-hangzhou-26064c43-65dc-5734-8175-3c0fdfc784df";       //剛剛建立的日誌項目
    const logStoreName = "specific-config-alert";                                           //剛剛建立的日誌庫
    const parsed = JSON.parse(event);                                                       //將入參轉化爲js對象      
    if (!parsed || !parsed.invokingEvent) {                                                 //配置審計調用時傳入的參包含: invokingEvent(變動數據), ruleParameters(函數規則額外傳入的用戶自定義參數), resultToken
        callback(null, event); 
        return;
    }
    const specificArn = parsed.ruleParameters && parsed.ruleParameters.arn;                 //函數規則容許用戶傳入的自定義的資源arn
    const transformData = Object.keys(parsed.invokingEvent).map(function(k) { return { key: k, value: JSON.stringify(parsed.invokingEvent[k])}});
    // 日誌服務須要的格式
    const logGroup = {
        logs : [{
            time:  Math.floor(new Date().getTime()/1000),
            contents: transformData
        }],
        topic: 'special-config-change'
    };
    const resourceArn = parsed.invokingEvent && parsed.invokingEvent.configurationItem && parsed.invokingEvent.configurationItem.arn;
    if (!specificArn || specificArn === resourceArn) {   // 若是規則中未指定具體資源arn,則默認全部過濾到的資源類型都寫到日誌服務(SLS)
        sls.putLogs({
            projectName: projectName,
            logStoreName: logStoreName,
            logGroup: logGroup
        }, function (err, data) {
            if (err) {
                callback(err);
                return;
            }
            callback(null, data);
        });
    } else {
        callback(null);
    }
}

函數是以指定的RAM角色來執行的,因此須要給指定的RAM角色進行受權,本案例須要給RAM角色受權可以寫指定日誌庫的權限。

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "log:PostLogStoreLogs",
                "log:PutLogs"
            ],
            "Resource": "acs:log:*:*:project/aliyun-fc-cn-hangzhou-26064c43-65dc-5734-8175-3c0fdfc784df/logstore/*", // 具體可根據本身函數的實際業務邏輯進行受權
            "Effect": "Allow"
        }
    ]
}

新建配置審計(Config)規則

進入配置審計控制檯->規則->新建規則->新建自定義規則,自定義規則是將規則評估的邏輯交給函數計算(FC)。
image.png

設置基本屬性

咱們選擇前面建立的函數,並配置規則名稱,觸發機制選擇「配置變動」,表示咱們但願在有新的配置發生變化時,就執行該自定義規則規則。
image.png

設置評估資源範圍

資源類型選擇SLB負載均衡,表示咱們只但願對類型爲SLB負載均衡的配置變動才觸發函數執行。
image.png

參數設置

在前面進行函數設計時,咱們增長了一個選項,容許用戶在配置自定義規則時,但願對某一個資源進行報警需求的支持。
image.png

因爲在指望值那一欄,我沒有輸入任何值,則表示當資源類型爲負載均衡(SLB)的全部資源發生變動時,都將觸發函數執行;您也能夠輸入指望值,指望值位目標資源的 arn。

配置日誌服務報警

進入以前新建的日誌服務(SLS)的日誌項目(logstore),設置一個查詢條件 SELECT COUNT(1) AS C ,查詢後,點擊另存爲告警,則開始進行日誌服務告警配置。

如下爲我設定的告警配置:每隔5分鐘,查詢最近5分鐘的日誌數據,若是查詢的結果 >0 , 則觸發短信告警。
image.png
image.png

驗證效果

咱們添加一個SLB負載均衡的監聽。稍等一會,咱們就會發現一條配置變動已經寫入到了 日誌庫(logstore)中。
image.png

報警通知直接經過短信通知到了個人手機上。
image.png

總結

配置審計(Config)對資源變配觸發自定義規則能夠實現不少的客戶場景, 如自定義合規校驗邏輯(參考文檔)、自動化執行、甚至自動修復等。

本文主要結合日誌服務(SLS)的告警幫助客戶快速感知資源變化並報警。

原文連接本文爲阿里雲原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索