

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Webhook를 통해 DevOps 에이전트 호출
<a name="configuring-capabilities-for-aws-devops-agent-invoking-devops-agent-through-webhook"></a>

Webhook를 사용하면 외부 시스템이 자동으로 AWS DevOps 에이전트 조사를 트리거할 수 있습니다. 이를 통해 티켓팅 시스템, 모니터링 도구 및 인시던트 발생 시 HTTP 요청을 보낼 수 있는 기타 플랫폼과 통합할 수 있습니다.

## 사전 조건
<a name="prerequisites"></a>

웹후크 액세스를 구성하기 전에 다음을 갖추어야 합니다.
+ in AWS DevOps 에이전트에 구성된 에이전트 공간
+  AWS DevOps 에이전트 콘솔에 대한 액세스
+ Webhook 요청을 전송할 외부 시스템

## Webhook 유형
<a name="webhook-types"></a>

AWS DevOps Agent는 다음과 같은 유형의 웹후크를 지원합니다.
+ **통합별 웹후크 -** Dynatrace, Splunk, Datadog, New Relic, ServiceNow 또는 Slack과 같은 타사 통합을 구성할 때 자동으로 생성됩니다. 이러한 웹후크는 특정 통합과 연결되며 통합 유형에 따라 결정되는 인증 방법을 사용합니다.
+ **일반 웹후크 **- 특정 통합에서 다루지 않는 소스에서 조사를 트리거하기 위해 수동으로 생성할 수 있습니다. 일반 웹후크는 현재 **HMAC** 인증을 사용합니다(베어러 토큰은 현재 사용할 수 없음).
+ **Grafana 알림 웹후크** - Grafana는 웹후크 연락 지점을 통해 AWS DevOps 에이전트에 직접 알림 알림을 보낼 수 있습니다. 사용자 지정 알림 템플릿을 포함한 설정 지침은 [Grafana 연결을](connecting-telemetry-sources-connecting-grafana.md) 참조하세요.

## Webhook 인증 방법
<a name="webhook-authentication-methods"></a>

웹후크의 인증 방법은 연결된 통합에 따라 다릅니다.

**HMAC 인증** - 다음에서 사용:
+ Dynatrace 통합 웹후크
+ 일반 웹후크(특정 타사 통합에 연결되지 않음)

**베어러 토큰 인증** - 다음에서 사용:
+ Splunk 통합 웹후크
+ Datadog 통합 웹후크
+ New Relic 통합 웹후크
+ ServiceNow 통합 웹후크
+ Slack 통합 웹후크

## 웹후크 액세스 구성
<a name="configuring-webhook-access"></a>

### 1단계: Webhook 구성으로 이동
<a name="step-1-navigate-to-the-webhook-configuration"></a>

1.  AWS Management Console에 로그인하고 AWS DevOps 에이전트 콘솔로 이동합니다.

1. 에이전트 스페이스 선택

1. **기능** 탭으로 이동

1. **Webhook** 섹션에서 **구성을** 클릭합니다.

### 2단계: Webhook 자격 증명 생성
<a name="step-2-generate-webhook-credentials"></a>

**통합별 웹후크의 경우:**

타사 통합 구성을 완료하면 Webhook가 자동으로 생성됩니다. Webhook 엔드포인트 URL 및 자격 증명은 통합 설정 프로세스가 끝날 때 제공됩니다.

**일반 웹후크의 경우:**

1. **웹후크 생성을 클릭합니다.**

1. 시스템에서 HMAC 키 페어를 생성합니다.

1. 생성된 키와 보안 암호를 안전하게 저장합니다. 다시 검색할 수 없습니다.

1. 제공된 웹후크 엔드포인트 URL 복사

### 3단계: 외부 시스템 구성
<a name="step-3-configure-your-external-system"></a>

Webhook 엔드포인트 URL 및 자격 증명을 사용하여 외부 시스템이 AWS DevOps Agent에 요청을 보내도록 구성합니다. 특정 구성 단계는 외부 시스템에 따라 다릅니다.

## Webhook 자격 증명 관리
<a name="managing-webhook-credentials"></a>

**자격 증명 제거** - 웹후크 자격 증명을 삭제하려면 웹후크 구성 섹션으로 이동하여 **제거**를 클릭합니다. 자격 증명을 제거한 후에는 새 자격 증명을 생성할 때까지 웹후크 엔드포인트가 더 이상 요청을 수락하지 않습니다.

**자격 증명 재생성** - 새 자격 증명을 생성하려면 먼저 기존 자격 증명을 제거한 다음 새 키 페어 또는 토큰을 생성합니다.

## Webhook 사용
<a name="using-the-webhook"></a>

### Webhook 요청 형식
<a name="webhook-request-format"></a>

조사를 트리거하려면 외부 시스템이 HTTP POST 요청을 웹후크 엔드포인트 URL로 보내야 합니다.

**버전 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"
    }
  }
}
```

### 예제 코드
<a name="example-code"></a>

**버전 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"
```

## 웹후크 문제 해결
<a name="troubleshooting-webhooks"></a>

### 200을 받지 못한 경우
<a name="if-you-do-not-receive-a-200"></a>

200과 웹후크와 같은 메시지가 수신되면 인증이 통과되었고 시스템에서 확인 및 처리할 수 있도록 메시지가 대기열에 있음을 나타냅니다. 200은 얻지 못하지만 4xx는 인증 또는 헤더에 문제가 있을 가능성이 높습니다. 인증을 디버깅하는 데 도움이 되도록 curl 옵션을 사용하여 수동으로 전송해 보세요.

### 200을 수신했지만 조사가 시작되지 않는 경우
<a name="if-you-receive-a-200-but-an-investigation-does-not-start"></a>

잘못된 페이로드가 원인일 수 있습니다.

1. 타임스탬프와 인시던트 ID가 모두 업데이트되고 고유한지 확인합니다. 중복 메시지는 중복 제거됩니다.

1. 메시지가 유효한 JSON인지 확인합니다.

1. 형식이 올바른지 확인합니다.

### 200을 수신하고 조사가 즉시 취소되는 경우
<a name="if-you-receive-a-200-and-investigation-is-immediately-cancelled"></a>

해당 월의 한도에 도달했을 가능성이 높습니다. 해당하는 경우 AWS 연락처에 문의하여 속도 제한 변경을 요청하십시오.

## 관련 주제
<a name="related-topics"></a>
+ [에이전트 스페이스 생성](getting-started-with-aws-devops-agent-creating-an-agent-space.md)
+ [DevOps 에이전트 웹 앱이란 무엇입니까?](about-aws-devops-agent-what-is-a-devops-agent-web-app.md)
+ [DevOps 에이전트 IAM 권한](aws-devops-agent-security-devops-agent-iam-permissions.md)