如何把建立ECS(CreateInstance)做爲觸發器來觸發函數計算

問題描述

函數計算雖然不支持直接集成到ECS的管控事件上,可是函數計算自己是支持日誌服務做爲觸發器的。便可以配置日誌服務中logstore裏的加強日誌做爲觸發器來觸發函數計算服務中的函數,同時能夠傳遞project 和 logstore的name以及beginCursor/endCursor 等相關日誌信息做爲event到函數計算服務,供其作二次處理和加工。json

這樣至關於提供了一個思路,即咱們能夠把建立ECS或者其餘相關的操做想辦法做爲日誌投遞到日誌服務中,這樣就能夠觸發相關的函數計算服務了。函數

那麼這種方法是什麼呢?一種可行的方式是操做審計服務。操做審計能夠記錄全部API級別的用戶記錄,固然也包括CreateInstance這類操做。fetch

因此整個流程就變成了:
開通操做審計服務->配置操做審計跟蹤,將event投遞到日誌服務中->配置日誌服務做爲函數計算觸發器並傳遞日誌->觸發函數阿里雲

舉個栗子

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

而後建立一個實例,能夠看到操做審計記錄了這個行爲日誌

同時日誌服務裏也找到了這個行爲記錄code

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

而後複製進去一段代碼,這段代碼的核心是拿到觸發event的具體日誌信息,而後寫到函數計算本地的日誌庫裏。token

# -*- 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(固然也包括其餘能夠被審計的行爲)的行爲就能夠用來觸發函數計算的函數了。事件

結果

咱們把剛纔建立的實例再釋放掉,看到操做審計的日誌

而後咱們在函數計算的日誌庫裏也看到了對應的日誌,這個日誌是剛纔操做審計記錄的日誌傳遞給函數計算並記錄的。在真正的應用場景下,客戶能夠拿到這個日誌中的相關信息作更多操做。

總結

  1. 產品側沒法直接支持的功能,能夠看下是否有workaround
  2. 不少阿里雲產品之間的集成,均可以看下是否能夠經過日誌服務來作。


原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索