CMaselli23/azure-incident-bot

GitHub: CMaselli23/azure-incident-bot

基于 Azure Functions 和 Claude 的 AI 驱动安全事件响应机器人,通过 Slack 实现自动化告警分析与处置建议推送。

Stars: 0 | Forks: 0

# Azure 事件响应机器人 🚨 一个 AI 驱动的事件响应机器人,它可以接收 Azure Monitor 的 webhook 告警, 使用 Claude AI 生成分步操作手册,向 Slack 发布结构化的事件卡片, 并支持一键自动修复 —— 全部自动完成。 这是 **Maselli Technologies SRE 培训课程** 的一部分 —— 为期 6 个月的第 2 个月。 ## 运行架构 ``` Azure Monitor Alert │ ▼ Action Group (Webhook) │ ▼ Azure Function — incident_receiver (HTTP Trigger) │ Parses alert payload │ Classifies severity (P1/P2/P3) ▼ OpenRouter API (Claude AI) │ Generates contextual runbook ▼ Slack #incidents │ Structured incident card + action buttons │ ├── ✅ Acknowledge → threads reply tagging engineer ├── 🔄 Restart App → Azure REST API restart call └── 📈 Scale Out → Azure REST API scale call │ ▼ Azure Function — slack_interactions (HTTP Trigger) │ Verifies interaction │ Executes remediation ▼ Threaded reply in Slack with result ``` ## 功能介绍 当 Azure Monitor 触发告警时,此机器人会: 1. **接收** 通过 Action Group 从 Azure Monitor 发来的 webhook payload 2. **解析** 告警 —— 提取资源、严重性、描述、时间戳 3. **分类** 严重性 —— 将 Sev0/Sev1 映射为 P1,Sev2 映射为 P2,Sev3/Sev4 映射为 P3 4. **生成** 针对告警上下文的分步 AI 操作手册 5. **发布** 带有严重性标识和操作手册的结构化事件卡片到 Slack 6. **启用** 通过交互式按钮进行一键修复: - **确认** —— 将事件标记为已接管,并在帖子中提醒工程师 - **重启应用** —— 调用 Azure REST API 重启受影响的 App Service - **扩容** —— 通过 Azure REST API 将实例数增加 1 ## 展示的 SRE 技能 | 技能 | 实现方式 | |-------|---------------| | Webhook 接入 | Azure Functions HTTP trigger 接收 Azure Monitor payloads | | 告警分类 | 将 Azure schema 中的严重性映射到 P1/P2/P3 | | 操作手册自动化 | 通过 Claude 动态生成 AI 操作手册 —— 无需静态 wiki 页面 | | 事件通知 | 使用 Block Kit 格式化的结构化 Slack 卡片 | | 自动修复 | 通过 Azure Management REST API 实现一键重启和扩容 | | Service principal 认证 | 通过 Azure AD client credentials flow 进行 REST API 访问 | | Serverless 部署 | Azure Functions Consumption plan —— 可缩容至零,闲置时无成本 | | 基础设施即代码 | 所有 Azure 资源均通过 Azure CLI 进行配置 | | 可观测性 | Application Insights 随 Function App 自动配置 | | 复盘文化 | 仓库内包含 TROUBLESHOOTING.md + POSTMORTEM_TEMPLATE.md | ## 技术栈 - **Runtime:** Python 3.11, Azure Functions v4 (v2 编程模型) - **AI:** 通过 OpenRouter API 使用 Claude - **告警:** Azure Monitor 指标告警 + Action Groups - **通知:** 带有交互式按钮的 Slack Block Kit API - **修复:** Azure Management REST API (重启, 扩容) - **认证:** Azure AD service principal (client credentials flow) - **部署:** Azure Functions Consumption Plan (Linux, East US) - **可观测性:** Azure Application Insights ## 事件卡片示例 当 P1 告警触发时,机器人会向 Slack 发布以下内容: ``` 🔴 P1 — High CPU on App Service Affected Resource: maselli-app-service Resource Type: Microsoft.Web/sites Severity: Sev1 (P1) Fired At: 2026-05-10T01:44:00Z Description: CPU usage exceeded 90% for 5 minutes 🤖 AI-Generated Runbook: 1. Immediate Triage (first 5 minutes) a. Acknowledge alert and take ownership b. Check CPU metrics in Azure Portal c. Review recent deployments for changes ... [ ✅ Acknowledge ] [ 🔄 Restart App ] [ 📈 Scale Out ] ``` 当点击“重启应用”时: ``` Action taken by @Christian M: Restart App Result: App Service maselli-app-service restarted successfully. ``` ## 项目结构 ``` azure-incident-bot/ ├── function_app.py # Both functions — incident receiver + Slack interactions ├── host.json # Azure Functions host configuration ├── local.settings.json # Local environment settings (not committed) ├── requirements.txt # Python dependencies ├── .env # Secrets (not committed) ├── .gitignore ├── TROUBLESHOOTING.md # Post-mortem style log of 8 build issues ├── POSTMORTEM_TEMPLATE.md # Blameless post-mortem template for incidents └── README.md ``` ## 关键设计决策 **为什么使用 OpenRouter 而不是直接使用 Anthropic API?** 将 SRE 课程中所有项目的 API 开销集中到一个 key 下, 并允许在不修改代码的情况下切换模型。 **为什么选择 Http5xx 作为告警指标?** Linux Consumption Plan 的 Function Apps 不会通过 Azure Monitor 公开 CPU 指标。 Http5xx 是一个在运营上更具实际意义的信号 —— 它直接表明了面向用户的故障, 而不是基础设施的噪音。 **为什么在测试时要绕过本地 Azure Functions 运行时?** Azure Functions v4.1048 在使用 Python v2 编程模型时,在 Windows 上存在已知的存储健康检查问题。核心逻辑已通过独立的 Python 脚本进行了验证,然后直接部署到由平台管理存储的 Azure 上。 详情请参阅 TROUBLESHOOTING.md。 **为什么使用帖子回复而不是更新原始消息?** 使用帖子功能可以保留 Slack 中完整的事件时间线 —— 执行的每项操作都会按时间顺序显示在原始告警卡片下方,这与 SRE 团队记录事件时间线的方式直接对应。 **已知限制 —— Slack 在扩容时的 3 秒超时:** 扩容操作会连续进行两次 Azure REST API 调用,这可能会超出 Slack 按钮响应的 3 秒窗口。该操作最终会成功完成,但 Slack 会显示超时警告。彻底的修复方案将使用 response_url 进行异步回复。 请参阅 TROUBLESHOOTING.md 中的 Issue 8。 ## 部署说明 ### 前置条件 - Azure CLI (`az --version`) - Azure Functions Core Tools v4 (`func --version`) - Python 3.11 - OpenRouter API key - 具有 `chat:write` 和 `chat:write.public` 权限的 Slack Bot Token - Slack Signing Secret - 在资源组中具有 Contributor 角色的 Azure Service Principal ### 环境变量 | 变量 | 描述 | |----------|-------------| | `SLACK_BOT_TOKEN` | Slack bot token (xoxb-...) | | `SLACK_CHANNEL` | 目标频道 (#incidents) | | `SLACK_SIGNING_SECRET` | Slack app signing secret | | `OPENROUTER_API_KEY` | OpenRouter API key | | `OPENROUTER_MODEL` | 模型字符串 (anthropic/claude-3-haiku) | | `AZURE_TENANT_ID` | Azure AD tenant ID | | `AZURE_CLIENT_ID` | Service principal app ID | | `AZURE_CLIENT_SECRET` | Service principal secret | | `AZURE_SUBSCRIPTION_ID` | Azure 订阅 ID | | `AZURE_RESOURCE_GROUP` | 目标资源组 | ### 部署到 Azure ``` # 创建 resource group az group create --name rg-incident-bot --location eastus # 创建 storage account az storage account create --name maselliincidentbot --location eastus ` --resource-group rg-incident-bot --sku Standard_LRS # 创建 Function App az functionapp create --resource-group rg-incident-bot ` --consumption-plan-location eastus --runtime python ` --runtime-version 3.11 --functions-version 4 ` --name maselli-incident-bot --storage-account maselliincidentbot ` --os-type linux # 设置 environment variables az functionapp config appsettings set --name maselli-incident-bot ` --resource-group rg-incident-bot ` --settings ` SLACK_BOT_TOKEN="xoxb-..." ` "SLACK_CHANNEL=#incidents" ` SLACK_SIGNING_SECRET="..." ` OPENROUTER_API_KEY="sk-or-..." ` OPENROUTER_MODEL="anthropic/claude-3-haiku" ` AZURE_TENANT_ID="..." ` AZURE_CLIENT_ID="..." ` AZURE_CLIENT_SECRET="..." ` AZURE_SUBSCRIPTION_ID="..." ` AZURE_RESOURCE_GROUP="rg-incident-bot" # 部署代码 func azure functionapp publish maselli-incident-bot ``` ### 配置 Azure Monitor ``` # 创建指向 webhook 的 action group az monitor action-group create ` --name "ag-incident-bot" ` --resource-group rg-incident-bot ` --short-name "incbot" ` --action webhook "incident-receiver" ` "https://maselli-incident-bot.azurewebsites.net/api/incident_receiver" # 创建 alert rule az monitor metrics alert create ` --name "alert-high-5xx-incident-bot" ` --resource-group rg-incident-bot ` --scopes "" ` --condition "total Http5xx > 0" ` --window-size 5m ` --evaluation-frequency 1m ` --severity 1 ` --action "ag-incident-bot" ``` ### 启用 Slack 交互功能 1. 前往 api.slack.com/apps → incident-bot 2. 点击 Interactivity & Shortcuts 3. 开启 Interactivity 4. 设置 Request URL 为:`https://maselli-incident-bot.azurewebsites.net/api/slack_interactions` 5. 保存更改 ## 在线接口 | 接口 | 用途 | |----------|---------| | `POST /api/incident_receiver` | 接收 Azure Monitor 的 webhook 告警 | | `POST /api/slack_interactions` | 处理 Slack 按钮交互 | ## Maselli Technologies SRE 培训课程的一部分 | 月份 | 项目 | 重点 | 状态 | |-------|---------|-------|--------| | 1 | Azure SLO Dashboard + AI Explainer | SLIs, SLOs, Error Budgets, AIOps | ✅ 已完成 | | 2 | AI-Powered Incident Response Bot | 事件管理, 操作手册, 自动修复 | ✅ 已完成 | | 3 | AKS Observability Stack | Kubernetes, Prometheus, Grafana | 🔄 下一步 | | 4 | Internal Developer Platform API | 平台工程, GitOps | ⏳ 计划中 | | 5 | Chaos Engineering Suite | 混沌工程, 弹性 | ⏳ 计划中 | | 6 | Full SRE Platform + AI Ops Chatbot | 毕业项目集成 | ⏳ 计划中 |
标签:AI辅助运维, Azure, Claude, CVE检测, Slack机器人, 事件响应, 自动修复, 运维自动化