本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
通过 Webhook 调用 DevOps 代理
Webhook 允许外部系统自动触发 AWS DevOps 代理调查。这可以与票务系统、监控工具和其他平台集成,这些平台可以在事件发生时发送 HTTP 请求。
先决条件
在配置 webhook 访问权限之前,请确保您具有:
在代理中配置的 AWS DevOps 代理空间
访问 AWS DevOps 代理控制台
将发送 webhook 请求的外部系统
Webhook 类型
AWS DevOps 代理支持以下类型的 Webhook:
Integration-specific webhook — 当你配置 Dynatrace、Splunk、Datadog、New Relic 或 Slack 等第三方集成时自动生成。 ServiceNow这些 Webhook 与特定的集成相关联,并使用由集成类型确定的身份验证方法
通用 webhook — 可以手动创建,用于触发来自特定集成未涵盖的任何来源的调查。在 AWS DevOps 代理控制台中,将一个通用 webhook 创建为代理空间 webhook(范围为代理空间)。创建通用 webhook 时,您可以选择其身份验证方法:HMAC 或 API 密钥(不记名令牌)。
Grafana 警报 webhook — Grafana 可以通过 webhook 联系点直接向代理发送警报通知。 AWS DevOps 有关包括自定义通知模板在内的设置说明,请参阅连接 Grafana。
Webhook 身份验证方法
Webhook 的身份验证方法取决于它与哪个集成关联:
HMAC 身份验证 — 使用者:
Dynatrace 集成 webhook
通用 Webhook(创建时选择 HMAC)
MCP 服务器网络挂钩(创建时选择 HMAC)
持有者令牌身份验证 — 使用者:
Splunk 集成 webhook
Datadog 集成 webhook
全新 Relic 集成 webhook
ServiceNow 集成 webhook
Slack 集成 webhook
Grafana 集成网络挂钩
通用 Webhook(创建时选择 API 密钥)
MCP 服务器 Webhook(在创建时选择 API 密钥)
了解 HMAC 身份验证
HMAC(Hash-based 消息身份验证码)是一种加密机制,用于验证 Webhook 请求的完整性和真实性。当您发送带有 HMAC 身份验证的 Webhook 时,您可以使用带有算法的密钥将请求时间戳和有效负载一起哈希处理,从而生成签名。 SHA-256 AWS DevOps 代理独立计算其侧面的相同哈希值并比较两个签名。如果它们匹配,则请求被接受。
由于签名中包含时间戳,HMAC 还提供重播保护 — AWS DevOps 代理可以拒绝时间戳过于过去的请求,从而防止攻击者捕获和重新发送有效的请求。
在 HMAC 和持有者代币之间进行选择
| 考虑因素 | HMAC | 不记名代币 |
|---|---|---|
| 设置复杂性 | 更复杂 — 您的客户端必须使用时间戳和有效负载为每个请求计算签名 | 更简单 — 在标题中加入静态Authorization标记 |
| 有效载荷完整性 | 已验证 — 签名后对有效载荷的任何修改都会使签名失效 | 未验证 — 令牌对发送者进行身份验证,但不保护有效载荷内容 |
| 重播保护 | Built-in — 签名中的时间戳允许服务器拒绝陈旧的请求 | 不是内置的 — 捕获的代币在轮换之前可以重复使用 |
| 秘密曝光风险 | 较低 — 从不在请求中传输机密;只发送计算出的签名 | 更高 — 令牌在每个请求标头中发送,如果流量被拦截,则会增加曝光率 |
| 何时使用 | 当您需要更强的安全保障时,建议使用,例如适用于通用 webhook 或具有严格合规性要求的环境 | 适用于优先考虑易于集成且您的网络传输值得信赖的情况,例如通过 HTTPS 进行托管 SaaS 集成 |
配置 webhook 访问权限
步骤 1:导航到 webhook 配置
登录 AWS 管理控制台并导航到 AWS DevOps 代理控制台
选择您的代理空间
前往 “功能” 选项卡
在 Webhook 部分中,选择配置
第 2 步:生成 webhook 凭证
对于特定于集成的网络挂钩:
当您完成第三方集成的配置时,会自动生成 Webhook。webhook 端点 URL 和凭据是在集成设置过程结束时提供的。
对于通用 Webhook:
选择生成 webhook
对于 Webhook 身份验证类型,请选择 HMAC 或 API 密钥:
HMAC — 系统生成 webhook 签名密钥。您的客户对每个请求进行签名并在
x-amzn-event-signature标头中发送签名(参见下面的版本 1)。API 密钥 — 系统生成 API 密钥(不记名令牌)。您的客户端在
Authorization: Bearer <token>标题中将其发送(参见下面的版本 2)。
安全地存储生成的密钥或 API 密钥。您将无法再次检索它。
复制提供的 webhook 端点 URL
步骤 3:配置您的外部系统
使用 webhook 端点 URL 和凭据将您的外部系统配置为向 AWS DevOps 代理发送请求。具体的配置步骤取决于您的外部系统。
管理 webhook 凭证
删除凭据 -要删除 webhook 凭据,请转到 webhook 配置部分并选择删除。移除凭据后,Webhook 端点将不再接受请求,直到您生成新的凭据。
重新生成凭证-要生成新证书,请先删除现有证书,然后生成新的 key pair 或令牌。
使用 webhook
Webhook 请求格式
要触发调查,您的外部系统应向 webhook 端点 URL 发送 HTTP POST 请求。
对于版本 1(HMAC 身份验证):
标头:
Content-Type: application/jsonx-amzn-event-signature: <HMAC signature>x-amzn-event-timestamp: <+%Y-%m-%dT%H:%M:%S.000Z>
HMAC 签名是通过使用 SHA-256您的密钥对请求正文进行签名来生成的。
对于版本 2(持有者令牌身份验证):
标头:
Content-Type: application/jsonAuthorization: Bearer <your-token>
请求正文:
请求正文应包含有关事件的信息:
{ "eventType": "incident", "incidentId": "incident-123", "action": "created", "priority": "HIGH", "title": "High CPU usage on production server", "description": "High CPU usage on production server host ABC in AWS account 1234 region us-east-1", "timestamp": "2025-11-23T18:00:00Z", "service": "MyProductionService", "data": { "metadata": { "region": "us-east-1", "environment": "production" } } }
有效载荷架构:
{ eventType: 'incident'; incidentId: string; action: 'created' | 'updated' | 'closed' | 'resolved'; priority: "CRITICAL" | "HIGH" | "MEDIUM" | "LOW" | "MINIMAL"; title: string; description?: string; timestamp?: string; service?: string; // The original event generated by service is attached here. data?: object; }
代码示例
版本 1(HMAC 身份验证)- JavaScript:
const crypto = require('crypto'); // Webhook configuration const webhookUrl = 'https://your-webhook-endpoint.amazonaws.com/invoke'; const webhookSecret = 'your-webhook-secret-key'; // Incident data const incidentData = { eventType: 'incident', incidentId: 'incident-123', action: 'created', priority: "HIGH", title: 'High CPU usage on production server', description: 'High CPU usage on production server host ABC in AWS account 1234 region us-east-1', timestamp: new Date().toISOString(), service: 'MyTestService', data: { metadata: { region: 'us-east-1', environment: 'production' } } }; // Convert data to JSON string const payload = JSON.stringify(incidentData); const timestamp = new Date().toISOString(); const hmac = crypto.createHmac("sha256", webhookSecret); hmac.update(`${timestamp}:${payload}`, "utf8"); const signature = hmac.digest("base64"); // Send the request fetch(webhookUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-amzn-event-timestamp': timestamp, 'x-amzn-event-signature': signature }, body: payload }) .then(res => { console.log(`Status Code: ${res.status}`); return res.text(); }) .then(data => { console.log('Response:', data); }) .catch(error => { console.error('Error:', error); });
版本 1(HMAC 身份验证)-curl:
#!/bin/bash # Configuration WEBHOOK_URL="https://event-ai.us-east-1.api.aws/webhook/generic/YOUR_WEBHOOK_ID" SECRET="YOUR_WEBHOOK_SECRET" # Create payload TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%S.000Z) INCIDENT_ID="test-alert-$(date +%s)" PAYLOAD=$(cat <<EOF { "eventType": "incident", "incidentId": "$INCIDENT_ID", "action": "created", "priority": "HIGH", "title": "Test Alert", "description": "Test alert description", "service": "TestService", "timestamp": "$TIMESTAMP" } EOF ) # Generate HMAC signature SIGNATURE=$(echo -n "${TIMESTAMP}:${PAYLOAD}" | openssl dgst -sha256 -hmac "$SECRET" -binary | base64) # Send webhook curl -X POST "$WEBHOOK_URL" \ -H "Content-Type: application/json" \ -H "x-amzn-event-timestamp: $TIMESTAMP" \ -H "x-amzn-event-signature: $SIGNATURE" \ -d "$PAYLOAD"
版本 2(持有者令牌身份验证)- JavaScript:
function sendEventToWebhook(webhookUrl, secret) { const timestamp = new Date().toISOString(); const payload = { eventType: 'incident', incidentId: 'incident-123', action: 'created', priority: "HIGH", title: 'Test Alert', description: 'Test description', timestamp: timestamp, service: 'TestService', data: {} }; fetch(webhookUrl, { method: "POST", headers: { "Content-Type": "application/json", "x-amzn-event-timestamp": timestamp, "Authorization": `Bearer ${secret}`, // Fixed: template literal }, body: JSON.stringify(payload), }); }
版本 2(持有者令牌身份验证)-cURL:
#!/bin/bash # Configuration WEBHOOK_URL="https://event-ai.us-east-1.api.aws/webhook/generic/YOUR_WEBHOOK_ID" SECRET="YOUR_WEBHOOK_SECRET" # Create payload TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%S.000Z) INCIDENT_ID="test-alert-$(date +%s)" PAYLOAD=$(cat <<EOF { "eventType": "incident", "incidentId": "$INCIDENT_ID", "action": "created", "priority": "HIGH", "title": "Test Alert", "description": "Test alert description", "service": "TestService", "timestamp": "$TIMESTAMP" } EOF ) # Send webhook curl -X POST "$WEBHOOK_URL" \ -H "Content-Type: application/json" \ -H "x-amzn-event-timestamp: $TIMESTAMP" \ -H "Authorization: Bearer $SECRET" \ -d "$PAYLOAD"
网络挂钩疑难解答
如果你没有收到 200
200 和收到的类似于 webhook 的消息表示身份验证已通过,消息已排队等待系统验证和处理。如果你得到的不是200,而是4xx,则很可能是身份验证或标头有问题。尝试使用 curl 选项手动发送以帮助调试身份验证。
如果您收到 200 但调查尚未开始
可能的原因是有效载荷格式不正确。
检查时间戳和事件 ID 是否已更新且唯一。重复的消息会被删除。
检查消息是否有效 JSON
检查格式是否正确
如果您收到 200,但调查立即取消
你很可能已经达到了当月的上限。如果合适,请与您的 AWS 联系人联系,要求更改速率限制。