실패한 Eventbridge 호출 디버깅

Eventbridge가 이벤트를 대상으로 전송하려고 시도하고 전송에 실패하는 경우 기본적으로 이를 알 수 있는 유일한 방법은 FailedInvocation Cloudwatch Metric입니다. 메트릭 자체는 이벤트 전달이 실패하는 실제 이유를 파악하기에 충분하지 않습니다.
일반적으로 문제FailedInvocaton를 디버깅하는 두 가지 옵션이 있습니다.
  • 리소스 수준에서 디버그합니다. Eventbridge 규칙이 Lambda 함수를 대상으로 하는 경우 Cloudtrail 로그에서 실패한 Lambda 호출을 검색해 보십시오.
  • 실패한 배달을 DLQ(Dead Letter Queue)로 전달합니다.

  • 이 블로그 게시물에서는 DLQ를 Eventbridge 대상으로 구성하는 방법과 Cloudwatch Logs에 오류 로그를 작성하는 방법을 보여줍니다.

    다음에서 전체 템플릿을 얻을 수 있습니다. https://github.com/markymarkus/cloudformation/blob/master/eventbridge-debug-dlq/template.yml

    연습



    우리는 AWS::Events::Rule에서 계정 222222222222의 이벤트 버스로 이벤트를 전달하는 계정 111111111111의 매우 기본적인 custom.source부터 시작합니다. FailedInvocation 지표는 모든 호출이 실패하고 있음을 보여줍니다.(그림 1 참조)

    오류 로깅 활성화



    이벤트가 대상 eventbus에 도달하지 못하는 이유를 더 잘 이해할 수 있도록 다음 리소스가 추가되었습니다.
  • 실패한 대상에 대해 DLQ(SQS)를 구성합니다.
  • Eventbridge 대상 재시도 횟수를 0으로 설정합니다. 관련된 오류 유형에 따라 Eventbridge는 실패하고 이벤트를 DLQ로 전송하기 24시간 전에 이벤트 전송을 재시도합니다. 재시도 횟수를 0으로 설정하면 실패한 이벤트가 최대한 빨리 DLQ로 전송됩니다.
  • DLQ(SQS) 대기열에서 오류 메시지를 가져오고 오류 로그를 Cloudwatch Logs에 쓰는 Lambda 함수를 생성합니다.


  • 그림 1 아키텍처

    그리고 이것은 Cloudformation template에서 구성이 보이는 방식입니다.

      CustomEventsRule:
        Type: AWS::Events::Rule
        Properties:
          EventBusName: !GetAtt CustomEventBus.Arn
          EventPattern:
            source:
              - custom.source
          State: ENABLED
          Targets:
            - Id: 'customtarget'
              Arn: 'arn:aws:events:eu-west-1:222222222222:event-bus/default'
              RetryPolicy:
                MaximumRetryAttempts: 0
              DeadLetterQueue:
                Arn: !GetAtt DLQueue.Arn
    


    배달 못한 편지 대기열 설정이 완료되면 다음 호출 실패를 기다리고 Cloudwath Logs에서 DLQ 핸들러 Lambda의 실행 로그를 엽니다. ERROR_MESSAGEERROR_CODE 필드에는 전송이 실패하는 사람이 읽을 수 있는 이유가 있습니다.

    ....
                "messageAttributes": {
                    "RULE_ARN": {
                        "stringValue": "arn:aws:events:eu-west-1:111111111111:rule/custom_event_bus/dev-eb-debug-CustomEventsRule-3GTDO9NDN1Q9",
                        "stringListValues": [],
                        "binaryListValues": [],
                        "dataType": "String"
                    },
                    "TARGET_ARN": {
                        "stringValue": "arn:aws:events:eu-west-1:222222222222:event-bus/default",
                        "stringListValues": [],
                        "binaryListValues": [],
                        "dataType": "String"
                    },
                    "ERROR_MESSAGE": {
                        "stringValue": "Lack of permissions to invoke cross account target.",
                        "stringListValues": [],
                        "binaryListValues": [],
                        "dataType": "String"
                    },
                    "ERROR_CODE": {
                        "stringValue": "NO_PERMISSIONS",
                        "stringListValues": [],
                        "binaryListValues": [],
                        "dataType": "String"
                    }
                },
    


    이번에는 수신 AWS 계정에서 종료된 Eventbridge 정책으로 인해 전송이 실패했습니다.

    결론



    일반적으로 DLQ에는 실패한 이벤트를 처리하기 위한 논리가 필요합니다. 실패한 Eventbridge 호출에 대한 경보를 추가하고 DLQ를 통한 로깅은 해당 논리를 추가로 개발해야 하는지 이해하기 위한 첫 번째 단계입니다.

    좋은 웹페이지 즐겨찾기