1. 程式人生 > >如何把建立ECS(CreateInstance)作為觸發器來觸發函式計算

如何把建立ECS(CreateInstance)作為觸發器來觸發函式計算

問題描述

函式計算雖然不支援直接整合到ECS的管控事件上,但是函式計算本身是支援日誌服務作為觸發器的。即可以配置日誌服務中logstore裡的增強日誌作為觸發器來觸發函式計算服務中的函式,同時可以傳遞project 和 logstore的name以及beginCursor/endCursor 等相關日誌資訊作為event到函式計算服務,供其做二次處理和加工。

這樣相當於提供了一個思路,即我們可以把建立ECS或者其他相關的操作想辦法作為日誌投遞到日誌服務中,這樣就可以觸發相關的函式計算服務了。

那麼這種方法是什麼呢?一種可行的方式是操作審計服務。操作審計可以記錄所有API級別的使用者記錄,當然也包括CreateInstance這類操作。

所以整個流程就變成了:
開通操作審計服務->配置操作審計跟蹤,將event投遞到日誌服務中->配置日誌服務作為函式計算觸發器並傳遞日誌->觸發函式

舉個栗子

開通操作審計服務後,建立一個日誌跟蹤

然後建立一個例項,可以看到操作審計記錄了這個行為

同時日誌服務裡也找到了這個行為記錄

接下來我們可以配置一個函式計算服務,具體的過程可以參考文中最後的文件,這裡強調下配置觸發器的配置,這裡要注意的是圖中有關logstore的配置,上面的是觸發日誌的logstore,下面的是寫日誌的lostore,不能搞混。

然後複製進去一段程式碼,這段程式碼的核心是拿到觸發event的具體日誌資訊,然後寫到函式計算本地的日誌庫裡。

# -*- coding: utf-8 -*-
import logging
import json
from aliyun.log import LogClient
from time import time
def logClient(endpoint, creds):
  logger = logging.getLogger()
  logger.info('creds info')
  logger.info(creds.access_key_id)
  logger.info(creds.access_key_secret)
  logger.info(creds.security_token)
  accessKeyId = 'XXX'
  accessKey = 'XXX'
  client = LogClient(endpoint, accessKeyId, accessKey)
  return client
def handler(event, context):
  logger = logging.getLogger()
  logger.info('start deal SLS data')
  logger.info(event.decode().encode())
  info_arr = json.loads(event.decode())
  fetchdata(info_arr['source'],context)
  return 'hello world'
def fetchdata(event,context):
  logger = logging.getLogger()
  endpoint = event['endpoint']
  creds = context.credentials
  client = logClient(endpoint, creds)
  if client == None :
      logger.info("client creat failed")
      return False
  project = event['projectName']
  logstore = event['logstoreName']
  start_cursor = event['beginCursor']
  end_cursor = event['endCursor']
  loggroup_count = 10
  shard_id = event['shardId']
  while True:
      res = client.pull_logs(project, logstore, shard_id, start_cursor, loggroup_count, end_cursor)
      res.log_print()
      next_cursor = res.get_next_cursor()
      if next_cursor == start_cursor :
          break
      start_cursor = next_cursor
    #log_data =  res.get_loggroup_json_list()
  return True

以上配置完成後,一個控制檯建立ECS(當然也包括其他可以被審計的行為)的行為就可以用來觸發函式計算的函數了。

結果

我們把剛才建立的例項再釋放掉,看到操作審計的日誌

然後我們在函式計算的日誌庫裡也看到了對應的日誌,這個日誌是剛才操作審計記錄的日誌傳遞給函式計算並記錄的。在真正的應用場景下,客戶可以拿到這個日誌中的相關資訊做更多操作。

更多sample可以參考:
https://github.com/aliyun/aliyun-log-fc-functions

總結

  1. 產品側無法直接支援的功能,可以看下是否有workaround
  2. 很多阿里雲產品之間的整合,都可以看下是否可以通過日誌服務來做。

參考資料

作者:拱卒

原文連結

本文為雲棲社群原創內容,未經允許不得轉