如果备份失败,如何设置告警通知到 Slack?

解读

在国内企业的真实面试中,这道题考察的不仅是“能不能收到告警”,而是能否用 Google Cloud 原生能力把告警闭环到国内开发团队最常用的协作工具 Slack
面试官希望听到:

  1. 你熟悉 Cloud SQL 的自动备份失败事件在 Cloud Logging 中的具体日志特征;
  2. 你能用Cloud Alerting Policy精确过滤该事件,而不是全量告警;
  3. 你理解国内网络环境下 Slack Webhook 的可达性风险,并给出合规、可落地的通道方案(如国内反向代理、企业微信中转、或直接使用 Google Chat 再同步到 Slack);
  4. 你能在 Terraform 或 gcloud 脚本里一键可复制地把策略、通知渠道、权限一次性交付,体现“基础设施即代码”思维。

知识点

  • Cloud SQL 备份失败日志标识protoPayload.methodName="cloudsql.backupRuns.create"severity=ERRORbackupRuns.status="FAILED"
  • Cloud Logging 高级过滤语法:利用 resource.type="cloudsql_database"jsonPayload.status.detail 做精细化过滤,避免误报
  • Alerting Policy 的阈值型 vs 日志型:备份失败属于离散事件,必须选日志型策略(Log-based Alerting)
  • Notification Channel 国内可用性:Slack Webhook 域名 hooks.slack.com备案域名加速或 HTTPS 代理,否则建议先发到 Google Chat,再通过 Chat 内置 Slack 应用同步
  • IAM 最小权限:Alerting 通知渠道使用Notification Channel Sender角色;日志查看须roles/logging.viewer;Terraform 服务账号需roles/monitoring.editor
  • Terraform 资源google_monitoring_alert_policy + google_monitoring_notification_channel(type = “slack”)
  • 告警风暴抑制:在 Policy 中设置60 秒通知间隔5 分钟自动关闭,避免同一备份窗口多次轰炸 Slack
  • 可观测性延伸:把告警写入BigQuery 审计表,用 DataStudio 生成月度 SLA 报表,体现你具备SRE 可观测闭环能力

答案

分五步落地,全部可脚本化:

  1. 提取日志过滤语句
    在 Cloud Logging 控制台先试运行:

    resource.type="cloudsql_database"
    protoPayload.methodName="cloudsql.backupRuns.create"
    jsonPayload.status.detail:"FAILED" OR jsonPayload.status.detail:"error"
    

    确认能命中真实失败记录后,保存为日志查询快捷方式

  2. 创建 Slack 通知渠道(国内合规版)
    方案 A:若公司 Slack 已备案并可通过 HTTPS 出站,直接在 Monitoring → Notification Channel 新建 Slack Webhook,填入 https://hooks.slack.com/services/...
    方案 B:若网络受限,先创建 Google Chat 空间,在 Chat 里安装官方 “Slack” 应用,完成 Chat→Slack 桥接,再把 Chat 空间 Hook 地址填到 Notification Channel,实现零翻墙同步

  3. 定义日志型告警策略
    在 Monitoring → Alerting 选 “Log-based Alert”,粘贴第 1 步过滤语句;
    设置通知间隔 60 秒、自动关闭 5 分钟
    选择第 2 步建好的 Slack Channel;
    消息模板加入变量:

    ${resource.labels.database_id} 备份失败,错误信息:${jsonPayload.status.detail},请 @on-call 处理
    
  4. 权限与审计
    给 Terraform 运行账号授予 roles/monitoring.editorroles/logging.viewer
    在组织策略里加一条 boolean constraint 禁止公开 Slack Webhook,防止员工把告警流到外部匿名频道。

  5. 一键 Terraform 模板(核心片段)

    resource "google_monitoring_notification_channel" "slack" {
      display_name = "cloudsql-backup-fail-slack"
      type         = "slack"
      labels = {
        "channel_name" = "#dba-oncall"
      }
      sensitive_labels {
        auth_token = var.slack_webhook_path  // 仅存储路径,域名在代理层统一
      }
    }
    
    resource "google_monitoring_alert_policy" "backup_fail" {
      display_name = "CloudSQL Backup Failed"
      combiner     = "OR"
      conditions {
        display_name = "Backup Run Failed"
        condition_matched_log {
          filter = <<EOT
            resource.type="cloudsql_database"
            protoPayload.methodName="cloudsql.backupRuns.create"
            jsonPayload.status.detail:"FAILED"
          EOT
        }
      }
      notification_channels = [google_monitoring_notification_channel.slack.id]
      alert_strategy {
        auto_close = "300s"
        notification_rate_limit {
          period = "60s"
        }
      }
    }
    

    执行 terraform apply 后,备份失败 30 秒内即可在 Slack 看到卡片,实现零运维告警闭环。

拓展思考

  • 双通道高可用:同时配置 Slack + 短信(通过 Google Cloud 的PagerDuty 集成或直接调用国内短信服务商),防止 Slack 被封时漏警。
  • 备份失败自愈:用 Cloud Composer 或 Workflows 监听同一日志,自动执行 backupRuns.create 重试;若连续 3 次失败再发告警,减少误报。
  • 成本优化:对开发环境实例,把告警策略加metadata.label.env=prod 过滤,非生产失败只发邮件,降低 Slack 噪音。
  • 合规审计:把告警事件转发到 Log Analytics Bucket,开启 Log Analytics Lake,用 SQL 计算月度备份成功率,向金融客户出具 SLA 报告,体现你对国内监管要求的理解。