本文介绍日志服务告警系统对接函数计算,实现告警自动化处理的实践方案。

背景信息

函数计算支持以事件驱动方式连接其他服务。当事件源触发事件时,函数计算会自动调用函数处理事件。日志服务告警支持对接函数计算,在某些场景中,发送告警通知到函数计算,可由函数计算完成自动化处理。告警
例如某企业在使用OSS时,要求所有Bucket的ACL都必须为私有。如果有员工在创建或修改OSS Bucket时,将ACL设置为公共读、公共读写,告警系统需快速发现并自动修复。针对该场景,只需通过日志服务告警系统与函数计算,即可快速实现。基本操作流程如下:
  1. 创建函数计算服务和函数。
  2. 采集OSS操作审计日志到日志服务。
  3. 基于OSS操作审计日志,创建告警。
  4. 函数计算接收告警通知后,调用函数,判断Bucket ACL权限是否为私有并修改。

操作权限说明

如果您使用的是阿里云RAM用户,该RAM用户需具备如下权限。具体操作,请参见为RAM用户授权
{
  "Statement": [{
    "Action": "ram:CreateServiceLinkedRole",
    "Resource": "*",
    "Effect": "Allow",
    "Condition": {
      "StringEquals": {
        "ram:ServiceName": "alert.log.aliyuncs.com"
      }
    }
  }],
  "Version": "1"
}

步骤一:创建服务和函数

  1. 登录函数计算控制台
  2. 创建服务。
    具体操作,请参见创建服务
  3. 创建函数。
    重要参数说明如下所示,其他参数保持默认配置。具体操作,请参见创建函数
    • 函数名必须以sls-ops-开头,例如sls-ops-test
    • 设置请求处理程序类型处理事件请求
    • 函数代码示例如下所示。其中,accessKeyIdaccessKeySecret为阿里云账号的访问密钥,请根据实际情况替换。获取步骤,请参见访问密钥
    创建函数后,无需执行测试操作。
    const OSS = require('ali-oss')
    
    const accessKeyId = 'LT****Dw'
    const accessKeySecret = 'lr****VM'
    
    async function checkBucketAcl(region, bucket) {
      const client = new OSS({
        region: `oss-${region}`,
        accessKeyId,
        accessKeySecret
      })
      const result = await client.getBucketACL(bucket)
    
      if (result.acl !== 'private') {
        await client.putBucketACL(bucket, 'private')
      }
    }
    
    exports.handler = async (event, context, callback) => {
      const alert = JSON.parse(event.toString())
      for (const result of alert.fire_results) {
        const { region, bucket } = result
        await checkBucketAcl(region, bucket)
      }
      callback(null, '')
    }

步骤二:采集OSS审计日志

ActionTrail操作日志包括OSS审计日志,因此您可以在日志审计服务中,开启ActionTrail操作日志的采集,从而采集OSS审计日志。

  1. 登录日志服务控制台
  2. 日志应用区域的审计与安全页签下,单击日志审计服务
  3. 在左侧导航栏中,选择云产品接入 > 全局配置
  4. 全局配置页面,单击修改
  5. 打开ActionTrail操作日志对应的采集开关。

    更多信息,请参见开启日志采集功能

    告警
  6. 单击确定

步骤三:创建告警

  1. 在左侧导航栏中,选择审计查询 > 中心化 > 操作审计
  2. 输入如下查询和分析语句,单击查询/分析
    修改Bucket的ACL权限或新建Bucket,都会生成一条PutBucket的审计日志。因此您可以使用如下查询和分析语句,获取PutBucket日志,并提取Bucket地域和名称。后续函数计算会基于该信息,判断并修改OSS Bucket的ACL。
    event.ServiceName: Oss
    AND event.eventName: PutBucket |
    SELECT
      "event.acsRegion" AS region,
      split("event.eventSource", '.') [1] AS bucket
  3. 单击另存为告警
  4. 告警监控规则面板中,完成如下配置。
    重要参数说明如下所示,其他参数说明,请参见创建日志告警监控规则
    • 设置触发条件有数据
    • 设置告警策略极简模式,然后在行动组中设置渠道函数计算(FC),并选择您所创建的服务和函数。
    • 根据上述函数代码的内容,此处您需在目标内容模板中,修改函数计算渠道的发送方式逐条发送
    告警
    创建告警后,修改Bucket的ACL权限或新建Bucket都会触发告警。您可以在告警概览页面的告警历史图表中,查看已触发的告警。告警

步骤四:查看函数计算处理结果

函数计算收到告警通知后,调用函数判断对应Bucket的ACL是否为私有并修改。即如果ACL为公共读或公共读写,函数计算将自动修改ACL为私有。

  1. 查看函数计算调用日志。
    1. 登录函数计算控制台
    2. 进入调用日志页面,查看调用日志。
      具体操作路径,请参见查看调用日志

      函数计算每收到一条告警通知会调用一次函数,并生成一条调用日志。

      告警
  2. 查看OSS Bucket的ACL。
    1. 登录OSS管理控制台
    2. 进入目标Bucket的读写权限页面,查看ACL。
      具体操作路径,请参见Bucket ACL

      函数计算已调用函数将该Bucket的ACL修改为私有。

      告警