如何把建立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. 不少阿里云产品之间的集成,均可以看下是否能够经过日志服务来作。


原文连接 本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索