天天看點

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

前言

配置審計(Config)

将您分散在各地域的資源整合為全局資源清單,可便捷地搜尋全局資源,并通過規則對資源配置進行評估,過濾出不符合業務要求的資源變配操作。

本文為您介紹如何通過

的自定義規則和

日志服務(SLS)

報警配合,對指定的

負載均衡(SLB)

變配進行報警,幫助企業快速感覺變配内容并及時做出相應對策。

背景

雲上賬号主要有阿裡雲主賬号、RAM子賬号、RAM角色,阿裡雲主賬号對所有資源都有完整的控制能力,一些被賦予進階權限的RAM子賬号、RAM角色等也同樣可以控制資源。如何在變更操作之前阻斷該行為,是服務控制政策(SCP)的範疇(該服務限制隻能是企業認證賬戶,并且開通了

資源目錄(Resource Directory)

才可實施),本文暫不讨論。如何在變配後快速感覺到變化也非常重要。公司A的運維同學向我們提了一個問題:公司的核心業務部署在阿裡雲上,采用的架構是彈性計算ECS+

+關系型資料庫RDS,每天都擔心核心服務異常變配導緻業務中斷,希望變配後及時收到消息通知,想問問有沒有什麼方案。

我們為他們推薦了

結合

的報警。那這個産品組合是如何實作以上目标的呢?

流程圖

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

整個方案的流程圖如上所示。員工A修改了企業某核心業務

的配置。資源變配資料會被

感覺并存儲,同時會觸發監聽該類資源變動的規則進行評估。規則引擎接收的入參包含了資源變動的

Diff

資料,如果該規則為自定義規則,規則引擎會執行配置好的

函數計算(FC)

的函數。函數過濾出目标資源的變更,并将變更資料寫入

中。日志服務通過配置告警政策,觸發告警并通知管理者。

另外兩條實線表示管理者可以前往

檢視資源時間線以及通過

檢視資源具體的配置變更資訊。

建立一個日志庫(logstore)

建立日志庫(logstore),用于存儲目标資源的變配資料,同時我們可以基于這個日志庫(logstore)配置告警政策;具體如何建立日志項目(project)及日志庫(logstore),這裡我就不再贅述,您可參考

日志服務的文檔

進行操作。

本案例對應的日志項目為:

aliyun-fc-cn-hangzhou-26064c43-65dc-5734-8175-3c0fdfc784df

 ,日志庫為:

specific-config-alert

 。

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

的自定義規則是基于

實作的。函數所屬的地域是不受限制的。本案例選擇地域為華東1(杭州)。

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

我是基于

alimebot-nodejs

模闆建立的函數。

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

我們在

ConfigService

這個服務下面建立一個名為

specific-config-change-alert

的函數。

函數的内部的業務邏輯,我們進行如下設計:

  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)規則

進入配置審計控制台->規則->建立規則->建立自定義規則,自定義規則是将規則評估的邏輯交給

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

設定基本屬性

我們選擇前面建立的函數,并配置規則名稱,觸發機制選擇“配置變更”,表示我們希望在有新的配置發生變化時,就執行該自定義規則規則。

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

設定評估資源範圍

資源類型選擇SLB負載均衡,表示我們隻希望對類型為SLB負載均衡的配置變更才觸發函數執行。

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

參數設定

在前面進行函數設計時,我們增加了一個選項,允許使用者在配置自定義規則時,希望對某一個資源進行報警需求的支援。

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

由于在期望值那一欄,我沒有輸入任何值,則表示當資源類型為負載均衡(SLB)的所有資源發生變更時,都将觸發函數執行;您也可以輸入期望值,期望值位目标資源的 arn。

配置日志服務報警

進入之前建立的

的日志項目(logstore),設定一個查詢條件

SELECT COUNT(1) AS C

,查詢後,點選另存為告警,則開始進行日志服務告警配置。

以下為我設定的告警配置:每隔5分鐘,查詢最近5分鐘的日志資料,如果查詢的結果

>0

, 則觸發短信告警。

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

驗證效果

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

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

報警通知直接通過短信通知到了我的手機上。

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

總結

對資源變配觸發自定義規則可以實作很多的客戶場景, 如自定義合規校驗邏輯(

參考文檔

)、自動化執行、甚至自動修複等。

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

如果您有其他更好的思路和想法,或者有其他關于産品的問題,歡迎加入我們的産品交流群:34461021。

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

繼續閱讀