本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
透過 Webhook 叫用 DevOps 代理程式
Webhook 可讓外部系統自動觸發 AWS DevOps 代理程式調查。這可整合票證系統、監控工具,以及可在事件發生時傳送 HTTP 請求的其他平台。
先決條件
在設定 Webhook 存取之前,請確定您有:
在 AWS DevOps 代理程式中設定的代理程式空間
存取 AWS DevOps 代理程式主控台
將傳送 Webhook 請求的外部系統
Webhook 類型
AWS DevOps Agent 支援下列類型的 Webhook:
整合特定的 Webhook – 當您設定第三方整合時自動產生,例如 Dynatrace、Splunk、Datadog、New Relic、ServiceNow 或 Slack。這些 Webhook 與特定整合相關聯,並使用整合類型決定的身分驗證方法
一般 Webhook – 可以手動建立,以觸發來自特定整合未涵蓋之任何來源的調查。一般 Webhook 目前使用 HMAC 身分驗證 (目前無法使用承載字符)。
Grafana 提醒 Webhook – Grafana 可以透過 Webhook 聯絡點將提醒通知直接傳送至 AWS DevOps 代理程式。如需包含自訂通知範本的設定說明,請參閱連接 Grafana。
Webhook 身分驗證方法
Webhook 的身分驗證方法取決於它與哪個整合相關聯:
HMAC 身分驗證 – 用於:
Dynatrace 整合 Webhook
一般 Webhook (未連結至特定的第三方整合)
承載字符身分驗證 – 用於:
Splunk 整合 Webhook
Datadog 整合 Webhook
新的 Relic 整合 Webhook
ServiceNow 整合 Webhook
Slack 整合 Webhook
Grafana 整合 Webhook
了解 HMAC 身分驗證
HMAC (以雜湊為基礎的訊息驗證碼) 是一種密碼編譯機制,可驗證 Webhook 請求的完整性和真實性。當您使用 HMAC 身分驗證傳送 Webhook 時,您會使用私密金鑰搭配 SHA-256 演算法,將請求時間戳記和承載雜湊在一起來產生簽章。 AWS DevOps 代理程式會在其端獨立運算相同的雜湊,並比較兩個簽章。如果相符,則會接受請求。
由於時間戳記包含在簽章中,HMAC 也提供重播保護: AWS DevOps 代理程式可以拒絕過去時間戳記太久的請求,防止攻擊者擷取和重新傳送有效的請求。
在 HMAC 和承載字符之間進行選擇
| 考量事項 | HMAC | 承載字符 |
|---|---|---|
| 設定複雜性 | 更複雜 – 您的用戶端必須使用時間戳記和承載來計算每個請求的簽章 | 更簡單:在 Authorization 標頭中包含靜態字符 |
| 承載完整性 | 已驗證 — 簽署後對承載的任何修改都會使簽章失效 | 未驗證 — 字符會驗證寄件者,但不保護承載內容 |
| 重播保護 | 內建 — 簽章中的時間戳記可讓伺服器拒絕過時的請求 | 非內建 - 擷取的字符可以重複使用,直到輪換為止 |
| 秘密暴露風險 | 較低 — 請求中永遠不會傳輸秘密;只會傳送計算的簽章 | 較高 — 權杖會在每個請求標頭中傳送,如果攔截流量,則會增加暴露 |
| 使用情況 | 當您需要更強大的安全保證時建議使用,例如用於一般 Webhook 或具有嚴格合規要求的環境 | 適合當易於整合是優先事項且您的網路傳輸受到信任時,例如透過 HTTPS 進行受管 SaaS 整合時 |
設定 Webhook 存取
步驟 1:導覽至 Webhook 組態
登入 AWS 管理主控台並導覽至 AWS DevOps 代理程式主控台
選取您的客服人員空間
前往功能索引標籤
在 Webhook 區段中,按一下設定
步驟 2:產生 Webhook 登入資料
對於整合特定的 Webhook:
當您完成第三方整合的組態時,Webhook 會自動產生。Webhook 端點 URL 和登入資料會在整合設定程序結束時提供。
對於一般 Webhook:
按一下產生 Webhook
系統會產生 HMAC 金鑰對
安全地存放產生的金鑰和秘密 - 您將無法再次擷取它們
複製提供的 Webhook 端點 URL
步驟 3:設定外部系統
使用 Webhook 端點 URL 和登入資料,將外部系統設定為將請求傳送至 AWS DevOps 代理程式。特定組態步驟取決於您的外部系統。
管理 Webhook 登入資料
移除登入資料 – 若要刪除 Webhook 登入資料,請前往 Webhook 組態區段,然後按一下移除。移除登入資料後,Webhook 端點將不再接受請求,直到您產生新的登入資料為止。
重新產生登入資料 – 若要產生新的登入資料,請先移除現有的登入資料,然後產生新的金鑰對或字符。
使用 Webhook
Webhook 請求格式
若要觸發調查,您的外部系統應將 HTTP POST 請求傳送至 Webhook 端點 URL。
對於第 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"
故障診斷 Webhook
如果您沒有收到 200
收到 200 和 Webhook 等訊息表示已通過身分驗證,且訊息已排入佇列,供系統驗證和處理。如果您沒有得到 200,但 4xx 最有可能是身分驗證或標頭有問題。嘗試使用 curl 選項手動傳送,以協助偵錯身分驗證。
如果您收到 200,但調查未開始
可能的原因是承載格式錯誤。
檢查時間戳記和事件 ID 是否已更新且是唯一的。重複的訊息會刪除重複訊息。
檢查訊息是否為有效的 JSON
檢查格式是否正確
如果您收到 200 且調查立即取消
您很可能已達到該月的限制。如果適用,請與您的 AWS 聯絡人討論,要求變更費率限制。