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 — 可以手动创建,以触发来自特定集成未涵盖的任何来源的调查。在 AWS DevOps 代理控制台中,通用 webhook 被创建为代理空间 webhook(范围为代理空间)。创建通用 Webhook 时,您可以选择其身份验证方法:HMAC API 密钥(持有者令牌)。

  • Grafana 警报 webhook — Grafana 可以通过 webhook 联系点直接向 AWS DevOps 代理发送警报通知。有关包括自定义通知模板在内的设置说明,请参阅连接 Grafana

Webhook 身份验证方法

您的 webhook 的身份验证方法取决于它与哪个集成:

HMAC 身份验证 — 用于:

  • Dynatrace 集成网络挂钩

  • 通用 webhook(创建时选择 HMAC)

  • MCP 服务器网络挂钩(创建时选择 HMAC

持有者令牌身份验证 — 用于:

  • Splunk 集成网络挂钩

  • Datadog 集成网络挂钩

  • 全新 Relic 集成网络挂钩

  • ServiceNow 集成网络挂钩

  • Slack 集成网络挂钩

  • Grafana 集成网络挂钩

  • 通用 webhook(创建时选择 API 密钥)

  • MCP 服务器 webhook(创建时选择 API 密钥)

了解 HMAC 身份验证

HMAC(Hash-based 消息身份验证码)是一种加密机制,用于验证 Webhook 请求的完整性和真实性。当您发送带有 HMAC 身份验证的 Webhook 时,您可以通过使用密钥和算法将请求时间戳和有效负载进行哈希处理来生成签名。 SHA-256 AWS DevOps 代理在其侧面独立计算相同的哈希值并比较两个签名。如果它们匹配,则该请求被接受。

由于时间戳包含在签名中,因此 HMAC 还提供重放保护—— AWS DevOps 代理可以拒绝时间戳过于过去的请求,从而防止攻击者捕获和重新发送有效请求。

在 HMAC 和 Bearer 代币之间进行选择

考虑因素 HMAC 持有者令牌
设置复杂性 更复杂——您的客户端必须使用时间戳和有效负载计算每个请求的签名 更简单 — 在标题中加入静态Authorization标记
有效载荷完整性 已验证 — 签名后对有效负载进行的任何修改都会使签名失效 未验证 — 令牌对发件人进行身份验证,但不保护有效载荷内容
重播保护 Built-in — 签名中的时间戳允许服务器拒绝过时的请求 不是内置的——捕获的代币在旋转之前可以重复使用
秘密曝光风险 Lower — 秘密永远不会在请求中传输;只发送计算出的签名 更高 — 令牌在每个请求标头中发送,如果流量被截取,则会增加曝光量
何时使用 当您需要更强的安全保障时(例如通用 Webhook 或具有严格合规要求的环境),推荐使用 适用于优先考虑易于集成且您的网络传输可信的情况,例如通过 HTTPS 进行托管 SaaS 集成

配置 webhook 访问权限

第 1 步:导航到 webhook 配置

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

  2. 选择您的代理空间

  3. 转到 能力” 选项卡

  4. Webhook 部分中,选择配置

第 2 步:生成 webhook 凭证

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

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

对于通用 webhook:

  1. 选择生成 webhook

  2. 对于 Webhook 身份验证类型,选择 HMAC API 密钥:

    • HMAC — 系统生成 webhook 签名密钥。您的客户签署每个请求并在x-amzn-event-signature标头中发送签名(参见下面的版本 1)。

    • API 密钥 — 系统生成 API 密钥(持有者令牌)。您的客户端将其发送到Authorization: Bearer <token>标头中(参见下面的版本 2)。

  3. 安全存储生成的密钥或 API 密钥。你将无法再次找回它。

  4. 复制提供的 webhook 端点 URL

步骤 3:配置外部系统

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

管理 webhook 凭证

Webhook 凭据很敏感。 AWS DevOps 当您创建 Webhook 时,代理会显示一次 Webhook 密钥。它不会通过控制台、API 或基础设施以代码形式再次返回密钥。网络挂钩网址保持可用。如果您丢失了密钥,或者在创建了 webhook 时没有记录它,请旋转 webhook 以生成新的密钥。

轮换 webhook 凭证

您可以从 “功能” 选项卡轮换任何 webhook 的证书。Rotation 会保留相同的 webhook 网址并生成一个新的密钥。轮换会使先前的密钥失效,因此发件人会停止,直到您使用新密钥对其进行更新。当你丢失了密钥或想要替换可能被泄露的密钥时,轮换 webhook。

要旋转 Web 挂钩,请执行以下操作:

  1. 登录 AWS 管理控制台并打开 AWS DevOps 代理控制台。

  2. 选择您的代理空间。

  3. 前往 功能” 选项卡,然后找到 webhook:

    • 对于集成 webhook,请使用 Capability Web hook 表。通过集成的标识符查找集成,例如您的 ServiceNow 实例 URL 或 Grafana 终端节点。

    • 对于通用 Webhook,请使用 Agent Space Webhook 部分

  4. 打开 webhook 编辑器。对于集成 webhook,请选择编辑。对于通用 Webhook,请选择操作,然后选择编辑

  5. 选择 “旋转 webhook”。控制台生成一个新的密钥并保留相同的 webhook URL。

  6. 选择 “下载 .csv 文件” 以保存 URL 和密钥,然后确认您已保存它们。离开此页面后,您将无法检索密钥。

  7. 使用新密钥更新发件人。要进行集成,请展开服务设置说明以了解特定服务的步骤,或参阅集成的连接指南。

要在不轮换密钥的情况下复制 webhook 网址,请选择 “复制 URL”。

使用基础设施即代码创建的 Webhook

当你使用 AWS CloudFormation、 AWS CDK 或 Terraform 创建 webhook 时,堆栈不会将 webhook 密钥作为输出返回,因为它是一个敏感值。部署完成后,通过轮换 webhook 获取密钥,如上一节所述。然后使用 webhook URL 和新密钥配置您的第三方服务。

移除 webhook 凭据

要删除通用 Webhook,请打开 Agent Space Webhook 部分,选择操作,然后选择删除。移除 webhook 后,在您创建新的 Webhook 之前,终端节点将不再接受请求。

使用 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>

请求正文:

请求正文应包含有关事件的信息:

{ "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 但调查没有开始

可能的原因是有效载荷格式不正确。

  1. 检查时间戳和事件 ID 是否已更新且具有唯一性。重复的邮件会被去重。

  2. 检查消息是否有效 JSON

  3. 检查格式是否正确

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

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