View a markdown version of this page

通过 Webhook 调用 DevOps 代理 - AWS DevOps 代理人

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

通过 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 配置

  1. 登录 AWS 管理控制台并导航到 AWS DevOps 代理控制台

  2. 选择您的代理空间

  3. 前往 “功能” 选项卡

  4. Webhook 部分中,点击配置

步骤 2:生成 webhook 凭证

对于特定于集成的网络挂钩:

当您完成第三方集成的配置时,会自动生成 Webhook。webhook 端点 URL 和凭据是在集成设置过程结束时提供的。

对于通用 Webhook:

  1. 点击生成 webhook

  2. 系统将生成 HMAC 密钥对

  3. 安全地存储生成的密钥和机密——您将无法再次检索它们

  4. 复制提供的 webhook 端点 URL

步骤 3:配置您的外部系统

使用 webhook 端点 URL 和凭据将您的外部系统配置为向 AWS DevOps 代理发送请求。具体的配置步骤取决于您的外部系统。

管理 webhook 凭证

删除凭据 -要删除 webhook 凭据,请转到 webhook 配置部分,然后单击删除。移除凭据后,Webhook 端点将不再接受请求,直到您生成新的凭据。

重新生成凭证-要生成新证书,请先删除现有证书,然后生成新的 key pair 或令牌。

使用 webhook

Webhook 请求格式

要触发调查,您的外部系统应向 webhook 端点 URL 发送 HTTP POST 请求。

对于版本 1(HMAC 身份验证):

标头:

  • Content-Type: application/json

  • x-amzn-event-signature: <HMAC signature>

  • x-amzn-event-timestamp: <+%Y-%m-%dT%H:%M:%S.000Z>

HMAC 签名是通过使用 SHA-256您的密钥对请求正文进行签名来生成的。

对于版本 2(持有者令牌身份验证):

标头:

  • Content-Type: application/json

  • Authorization: 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 但调查尚未开始

可能的原因是有效载荷格式错误。

  1. 检查时间戳和事件 ID 是否已更新且唯一。重复的消息会被删除。

  2. 检查消息是否有效 JSON

  3. 检查格式是否正确

如果您收到 200,调查立即取消

你很可能已经达到了当月的上限。如果合适,请与您的 AWS 联系人联系,要求更改速率限制。