本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
通过 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 — 可以手动创建,用于触发来自特定集成未涵盖的任何来源的调查。通用 webhook 目前使用 HMAC 身份验证(不记名令牌目前不可用)。
Grafana 警报 webhook — Grafana 可以通过 webhook 联系点直接向代理发送警报通知。 AWS DevOps 有关包括自定义通知模板在内的设置说明,请参阅连接 Grafana。
Webhook 身份验证方法
Webhook 的身份验证方法取决于它与哪个集成关联:
HMAC 身份验证 — 使用者:
Dynatrace 集成网络挂钩
通用 webhook(未链接到特定的第三方集成)
持有者令牌身份验证 — 使用者:
Splunk 集成 webhook
Datadog 集成 webhook
全新 Relic 集成 webhook
ServiceNow 集成 webhook
Slack 集成 webhook
Grafana 集成网络挂钩
了解 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
系统将生成 HMAC 密钥对
安全地存储生成的密钥和机密——您将无法再次检索它们
复制提供的 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>
请求正文:
请求正文应包含有关事件的信息:
json { "title": "Incident title", "severity": "high", "affectedResources": ["resource-id-1", "resource-id-2"], "timestamp": "2025-11-23T18:00:00Z", "description": "Detailed incident description", "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 联系人联系,要求更改速率限制。