本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
透過 Webhook 叫用 DevOps 代理程式
Webhook 可讓外部系統自動觸發 AWS DevOps 代理程式調查。這可整合票證系統、監控工具,以及可在事件發生時傳送 HTTP 請求的其他平台。
先決條件
在設定 Webhook 存取之前,請確定您有:
在 AWS DevOps 代理程式中設定的代理程式空間
存取 AWS DevOps 代理程式主控台
將傳送 Webhook 請求的外部系統
Webhook 類型
AWS DevOps 代理程式支援下列類型的 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
設定 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" } } }
範例程式碼
第 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 聯絡人討論,要求變更費率限制。