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机器人, 事件响应, 自动修复, 运维自动化