Amazon Web Services 한국 블로그

Amazon EventBridge 향상된 로그 기능을 통한 이벤트 기반 애플리케이션 모니터링 및 디버깅

오늘부터 Amazon EventBridge의 향상된 로깅 기능을 사용하여 포괄적인 로그를 통해 이벤트 기반 애플리케이션을 모니터링하고 디버깅할 수 있습니다. 이 새로운 기능은 이벤트 흐름을 모니터링하고 문제를 해결하는 방법을 개선하는 데 유용합니다.

Amazon EventBridge 콘솔에서 이 새로운 기능을 찾는 방법은 다음과 같습니다.

새로운 관찰성 기능은 포괄적인 이벤트 수명 주기 추적을 지원하여 마이크로서비스 및 이벤트 기반 아키텍처의 모니터링 문제를 해결합니다. 이제 EventBridge는 규칙과 일치하는 이벤트가 게시되거나 그러한 이벤트가 구독자에게 전송되거나 실패 및 재시도가 발생할 때마다 자세한 로그 항목을 생성합니다.

성공, 실패 및 상태 코드에 대한 자세한 정보를 통해 전체 이벤트 여정을 파악할 수 있어, 문제를 식별하고 진단하기가 쉽습니다. 몇 시간씩 걸리던 시행착오 방식의 디버깅을 이제는 상세한 이벤트 수명 주기 추적과 내장된 쿼리 도구를 통해 몇 분 만에 완료할 수 있습니다.

Amazon EventBridge 향상된 관찰성 기능 사용
Amazon EventBridge의 로깅 기능을 보여주는 데모를 살펴보겠습니다.

기존 이벤트 버스에 대해 로깅을 활성화하거나 새 사용자 지정 이벤트 버스를 생성할 때 실행되도록 로깅을 활성화할 수 있습니다. 먼저 EventBridge 콘솔로 이동하여 왼쪽 탐색 창에서 이벤트 버스를 선택합니다. 사용자 지정 이벤트 버스에서 이벤트 버스 생성을 선택합니다.

이 새로운 기능은 로그 섹션에 있습니다. 로그 대상Amazon CloudWatch Logs, Amazon Data Firehose 스트림, Amazon Simple Storage Service(Amazon S3) 등의 세 가지 옵션을 사용하여 구성할 수 있습니다. 로그를 데이터 레이크로 스트리밍하려는 경우 Amazon Kinesis Data Firehose 스트림을 선택하면 됩니다. 로그는 전송 시 TLS로 암호화되며 이벤트 버스에 대해 고객 관리형 키(CMK)가 제공될 경우 저장 시에도 암호화됩니다. CloudWatch Logs는 고객 관리형 키를 지원하고, Data Firehose는 다운스트림 대상에 대한 서버 측 암호화를 제공합니다.

이 데모에서는 CloudWatch 로그S3 로그를 선택합니다.

오류, 정보 또는 트레이스에서 로그 수준을 선택할 수도 있습니다. 페이로드를 검토해야 하므로 추적을 선택하고 실행 데이터 포함을 선택합니다. 로깅 페이로드 데이터에는 민감한 정보가 포함될 수 있으며 선택한 모든 로그 대상에 이 설정이 적용되므로 주의해야 합니다. 다음으로, CloudWatch 로그 그룹S3 로그에 대해 각각 하나씩 두 개의 대상을 구성합니다. 그런 다음 생성을 선택합니다.

로깅이 활성화되면 테스트 이벤트 게시를 시작하여 로깅 동작을 관찰할 수 있습니다.

첫 번째 시나리오에서는 AWS Lambda 함수를 빌드하고 이 Lambda 함수를 대상으로 구성했습니다.

이벤트 버스로 이동하고 이벤트 전송을 선택하여 샘플 이벤트를 전송합니다.

이 예에 사용한 페이로드는 다음과 같습니다.

{
  "Source": "ecommerce.orders",
  "DetailType": "Order Placed",
  "Detail": {
    "orderId": "12345",
    "customerId": "cust-789",
    "amount": 99.99,
    "items": [
      {
        "productId": "prod-456",
        "quantity": 2,
        "price": 49.99
      }
    ]
  }
}

샘플 이벤트를 전송한 후, S3 버킷에서 로그를 사용할 수 있음을 확인할 수 있습니다.

Amazon CloudWatch Logs에 표시되는 로그 항목도 볼 수 있습니다. 로그는 EVENT_RECEIPT부터 SUCCESS까지의 이벤트 수명 주기를 보여줍니다. TBD:DOC_PAGE에서 전체 이벤트 수명 주기에 대해 자세히 알아봅니다.

이제 이들 로그를 평가해 보겠습니다. 설명의 편의를 위해 로그를 몇 개만 포함하고 알아보기 쉽게 수정했습니다. 다음은 이벤트를 트리거했을 때의 로그입니다.

{
    "resource_arn": "arn:aws:events:us-east-1:123:event-bus/demo-logging",
    "message_timestamp_ms": 1751608776896,
    "event_bus_name": "demo-logging",
// REDACTED FOR BREVITY //
    "message_type": "EVENT_RECEIPT",
    "log_level": "TRACE",
    "details": {
        "caller_account_id": "123",
        "source_time_ms": 1751608775000,
        "source": "ecommerce.orders",
        "detail_type": "Order Placed",
        "resources": [],
        "event_detail": "REDACTED FOR BREVITY"
    }
}

다음은 이벤트가 성공적으로 간접 호출되었을 때의 로그입니다.

{
    "resource_arn": "arn:aws:events:us-east-1:123:event-bus/demo-logging",
    "message_timestamp_ms": 1751608777091,
    "event_bus_name": "demo-logging",
// REDACTED FOR BREVITY //
    "message_type": "INVOCATION_SUCCESS",
    "log_level": "INFO",
    "details": {
// REDACTED FOR BREVITY //
        "total_attempts": 1,
        "final_invocation_status": "SUCCESS",
        "ingestion_to_start_latency_ms": 105,
        "ingestion_to_complete_latency_ms": 183,
        "ingestion_to_success_latency_ms": 183,
        "target_duration_ms": 53,
        "target_response_body": "<REDACTED FOR BREVITY>",
        "http_status_code": 202
    }
}

추가 로그 항목으로는 문제를 쉽게 해결할 수 있도록 해주는 풍부한 메타데이터가 있습니다. 예를 들어 이벤트가 성공하면 이벤트 시작부터 완료까지의 지연 시간, 대상이 처리를 완료하는 데 걸리는 시간, HTTP 상태 코드를 확인할 수 있습니다.

전체 이벤트 수명 주기 추적을 통한 오류 디버깅
문제가 발생하면 EventBridge 로깅의 이점이 명확하게 나타납니다. 오류 시나리오를 테스트하기 위해 의도적으로 Lambda 함수의 권한을 잘못 구성하고, 적절한 권한이 없는 다른 Lambda 함수를 가리키도록 규칙을 변경했습니다.

권한 누락으로 인해 영구 오류가 발생하여 시도가 실패했습니다. 로그에는 FIRST 시도로 인해 NO_PERMISSIONS 상태가 된 것으로 표시됩니다.

{
    "message_type": "INVOCATION_ATTEMPT_PERMANENT_FAILURE",
    "log_level": "ERROR",
    "details": {
        "rule_arn": "arn:aws:events:us-east-1:123:rule/demo-logging/demo-order-placed",
        "role_arn": "arn:aws:iam::123:role/service-role/Amazon_EventBridge_Invoke_Lambda_123",
        "target_arn": "arn:aws:lambda:us-east-1:123:function:demo-evb-fail",
        "attempt_type": "FIRST",
        "attempt_count": 1,
        "invocation_status": "NO_PERMISSIONS",
        "target_duration_ms": 25,
        "target_response_body": "{\"requestId\":\"a4bdfdc9-4806-4f3e-9961-31559cb2db62\",\"errorCode\":\"AccessDeniedException\",\"errorType\":\"Client\",\"errorMessage\":\"User: arn:aws:sts::123:assumed-role/Amazon_EventBridge_Invoke_Lambda_123/db4bff0a7e8539c4b12579ae111a3b0b is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:123:function:demo-evb-fail because no identity-based policy allows the lambda:InvokeFunction action\",\"statusCode\":403}",
        "http_status_code": 403
    }
}

마지막 로그 항목은 타이밍 지표 및 정확한 오류 메시지와 함께 전체 실패를 요약합니다.

{
    "message_type": "INVOCATION_FAILURE",
    "log_level": "ERROR",
    "details": {
        "rule_arn": "arn:aws:events:us-east-1:123:rule/demo-logging/demo-order-placed",
        "role_arn": "arn:aws:iam::123:role/service-role/Amazon_EventBridge_Invoke_Lambda_123",
        "target_arn": "arn:aws:lambda:us-east-1:123:function:demo-evb-fail",
        "total_attempts": 1,
        "final_invocation_status": "NO_PERMISSIONS",
        "ingestion_to_start_latency_ms": 62,
        "ingestion_to_complete_latency_ms": 114,
        "target_duration_ms": 25,
        "http_status_code": 403
    },
    "error": {
        "http_status_code": 403,
        "error_message": "User: arn:aws:sts::123:assumed-role/Amazon_EventBridge_Invoke_Lambda_123/db4bff0a7e8539c4b12579ae111a3b0b is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:123:function:demo-evb-fail because no identity-based policy allows the lambda:InvokeFunction action",
        "aws_service": "AWSLambda",
        "request_id": "a4bdfdc9-4806-4f3e-9961-31559cb2db62"
    }
}

이들 로그는 병목 현상을 찾아내는 데 도움이 되는 자세한 성능 지표를 제공합니다. ingestion_to_start_latency_ms: 62는 이벤트 수집부터 간접 호출 시작까지 소요된 시간을 보여주고, ingestion_to_complete_latency_ms: 114는 수집부터 완료까지 소요된 총 시간을 나타냅니다. 또한 target_duration_ms: 25는 대상 서비스가 응답하는 데 걸린 시간을 나타내며, 이는 EventBridge 처리 시간과 대상 서비스 성능을 구분하는 데 도움이 됩니다.

오류 메시지에는 실패한 작업, lambda:InvokeFunction 작업, 실패한 원인(이 작업을 허용하는 ID 기반 정책이 없음), 관련 역할(Amazon_EventBridge_Invoke_Lambda_1428392416), 영향을 받은 특정 리소스[Lambda 함수 Amazon Resource Name(ARN)으로 표시됨] 등을 명확하게 보여줍니다.

EventBridge 로깅을 사용한 API 대상 디버깅
EventBridge 로깅 기능이 유용할 것으로 생각되는 구체적인 사용 사례 중 하나는 API 대상 관련 문제를 디버깅하는 경우입니다. EventBridge API 대상은 이벤트 버스 규칙 또는 파이프의 대상으로 간접 호출할 수 있는 HTTPS 엔드포인트입니다. HTTPS 엔드포인트는 HTTPS 직접 호출을 사용하여 이벤트 버스에서 외부 시스템, 서비스형 소프트웨어(SaaS) 애플리케이션 또는 서드 파티 API로 이벤트를 라우팅할 수 있도록 합니다. 이 엔드포인트는 연결을 사용하여 인증과 자격 증명을 처리하므로, 이벤트 기반 아키텍처를 모든 HTTPS 기반 서비스와 손쉽게 통합할 수 있습니다.

API 대상은 외부 HTTPS 엔드포인트에 이벤트를 전송하는 데 주로 사용되며, 외부 엔드포인트에서 발생한 오류를 디버깅하기가 어려울 수 있습니다. 이 문제는 일반적으로 엔드포인트 인증 요구 사항의 변경이나 자격 증명 수정으로 인해 발생합니다.

이 디버깅 기능을 보여드리기 위해 의도적으로 연결 리소스에 잘못된 자격 증명을 사용하여 API 대상을 구성했습니다.

잘못 구성된 이 엔드포인트에 이벤트를 전송하면 향상된 로깅 기능이 이 오류의 근본 원인을 보여줍니다.

{
    "resource_arn": "arn:aws:events:us-east-1:123:event-bus/demo-logging",
    "message_timestamp_ms": 1750344097251,
    "event_bus_name": "demo-logging",
    //REDACTED FOR BREVITY//,
    "message_type": "INVOCATION_FAILURE",
    "log_level": "ERROR",
    "details": {
        //REDACTED FOR BREVITY//,
        "total_attempts": 1,
        "final_invocation_status": "SDK_CLIENT_ERROR",
        "ingestion_to_start_latency_ms": 135,
        "ingestion_to_complete_latency_ms": 549,
        "target_duration_ms": 327,
        "target_response_body": "",
        "http_status_code": 400
    },
    "error": {
        "http_status_code": 400,
        "error_message": "Unable to invoke ApiDestination endpoint: The request failed because the credentials included for the connection are not authorized for the API destination."
    }
}

이 로그를 통해 오류를 즉각적으로 명확하게 파악할 수 있습니다. target_arn은 이 오류가 API 대상과 관련이 있음을 보여주고, final_invocation_statusSDK_CLIENT_ERROR와 클라이언트 측 문제를 가리키는 http_status_code 400을 나타냅니다. 무엇보다, error_messageUnable to invoke ApiDestination endpoint: The request failed because the credentials included for the connection are not authorized for the API destination.라고 명시되어 있는 것이 중요합니다.

이 전체 로그 시퀀스에서 제공하는 인사이트는 이벤트 수신부터 수집, 규칙 매칭, 간접 호출 시도에 이르기까지, 이벤트가 EventBridge를 통해 어떻게 이동했는지 정확히 확인할 수 있다는 점에서 유용합니다. 이 같은 자세한 정보 덕분에 추측에 의존하지 않아도 되고 문제의 근본 원인을 직접 찾아낼 수 있습니다.

추가 정보
몇 가지 주요 사항을 알려드립니다.

  • 아키텍처 지원 – 로깅은 사용자 지정 이벤트 버스, 파트너 이벤트 소스, HTTPS 엔드포인트의 API 대상 등, 모든 EventBridge 기능에 사용할 수 있습니다.
  • 성능에 미치는 영향 – 로깅은 비동기식으로 작동하므로 이벤트 처리 지연 시간이나 처리량에 측정 가능한 영향을 미치지 않습니다.
  • 요금 – 로그 저장 및 전송과 관련하여 표준 Amazon S3, Amazon CloudWatch Logs 또는 Amazon Data Firehose 요금이 부과됩니다. EventBridge 로깅 자체에는 추가 요금이 발생하지 않습니다. 자세한 내용은 Amazon EventBridge 요금 페이지를 참조하세요.
  • 가용성 – Amazon EventBridge 로깅 기능은 EventBridge가 지원되는 모든 AWS 리전에서 사용할 수 있습니다.
  • 설명서 – 자세한 내용은 Amazon EventBridge 모니터링 및 디버깅 설명서를 참조하세요.

EventBridge 콘솔에서 Amazon EventBridge 로깅 기능을 시작하고 이벤트 버스에 대한 로깅을 활성화하세요.

즐겁게 빌드해 보세요!
Donnie