

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

# 사용자 지정 이벤트 버스에서 이벤트 구독
<a name="eb-custom-bus-subscribers"></a>

구독자는 원하는 이벤트와 전송할 위치를 알려주는 하나의 리소스입니다. 버스`CreateSubscriber`, 필터 및 하나의 대상의 이름을 지정하여 로 생성합니다. 버스를 감시하고 필터와 일치하는 이벤트를 유지하며 선택적으로 각 이벤트를 변환하고 정확히 하나의 대상으로 전달합니다. 이벤트를 여러 대상으로 팬아웃하려면 동일한 버스에서 각 대상에 대해 하나의 구독자를 생성합니다.

EventBridge는 지정된 버스에서 한 번에 하나의 구독자 생성 또는 삭제를 적용합니다. 진행 중인 동안 동일한 버스`DeleteSubscriber`의 두 번째 `CreateSubscriber` 또는는에서 실패합니다. `ConcurrentModificationException`다시 시도하세요. [사용자 지정 이벤트 버스 할당량](eb-quota.md#eb-custom-bus-quotas) 따라서의 생성 및 삭제 요금이 버스당 적용됩니다.

## 대상에 도달하는 이벤트 필터링
<a name="eb-custom-bus-subscribers-filter"></a>

`FilterConfiguration` 에는 목록이 있습니다`Filters`. 각 필터에는 EventBridge 이벤트 패턴 구문`Pattern`의 , 및 하나의가 있습니다`Scope`. 범위당 최대 하나의 필터를 가질 수 있으며, EventBridge는 목록의 모든 필터와 일치하는 경우에만 이벤트를 제공합니다. 가 없는 구독자는 버스에서 모든 이벤트를 `FilterConfiguration` 수신합니다.
+ `DATA`: 페이로드와 일치합니다. 에 설명된 셰이프에 대해 패턴을 작성합니다[이벤트 구조: 데이터, 메타데이터 및 시스템 메타데이터](eb-custom-bus-addressing.md).
+ `METADATA`:는 생산자가 설정한 키-값 페어와 일치`PutRawEvents`하며, 정확히 일치합니다.
+ `SYSTEM_METADATA`: `aws:Source` 또는와 같이 EventBridge가 설정하는 필드와 일치합니다`EventGroupId`.

패턴 구문, 범위 규칙 및 예제는 섹션을 참조하세요[구독자에 대한 이벤트 필터링](eb-custom-bus-filtering.md).

## 페이로드 변환
<a name="eb-custom-bus-subscribers-transform"></a>

`Transformer.Type`는 대상이 수신하는 항목을 선택합니다. 범용 대상은 이를 사용하지 않습니다. 섹션을 참조하세요[사용자 지정 이벤트 버스의 범용 대상](eb-custom-bus-universal-targets.md).
+ `RAW`, 기본값입니다. 페이로드만.
+ `WITH_METADATA`. 전체 이벤트: `Data`, `Metadata`및 `SystemMetadata`.
+ `JSONATA`. 에서 `{% %}` 구분 기호로 `JsonataConfiguration.Expression`래핑된 JSONata 표현식의 결과로, 이벤트를 로 사용할 수 있습니다`$events`.

EventBridge는 구독자를 생성할 때 표현식의 구문을 확인하고 전송 시 평가합니다. 를 발생시키거나 값을 생성하지 않는 표현식은 해당 이벤트의 전송에 실패합니다. 실제 이벤트에 의존하기 전에 실제 이벤트에 대해 표현식을 테스트합니다. `$events`의 내용, 추가 함수 및 제한은 섹션을 참조하세요[JSONata로 이벤트 변환](eb-custom-bus-transform.md).

## 하나의 대상으로 전송
<a name="eb-custom-bus-subscribers-deliver"></a>

`InvokeConfiguration` 에는 `TargetArn`, EventBridge가 대상을 호출하기 위해 수임`RoleArn`하는 , 대상 유형과 일치하는 최대 하나의 파라미터 블록이 포함됩니다. 대부분의 파라미터 값은 JSONata 표현식을 수락하므로 값은 이벤트에서 가져올 수 있습니다. 다음 표에는 사용자 지정 대상 유형과 해당 파라미터 블록이 나열되어 있습니다. 각 에는 아래에 자체 페이지가 있습니다[사용자 지정 이벤트 버스 구독자의 대상](eb-custom-bus-targets.md).


| 대상 | 파라미터 블록 | 
| --- | --- | 
| Amazon SQS 대기열 | SqsParameters | 
| Lambda 함수 | LambdaParameters | 
| Kinesis 스트림 | KinesisParameters | 
| Step Functions 상태 머신 | StepFunctionsParameters | 
| Amazon SNS 주제 | SnsParameters | 
| HTTP 엔드포인트 또는 API 대상 | HttpParameters | 
| Firehose 스트림 | FirehoseParameters | 

사용자 지정 이벤트 버스 또는 사용자 지정 이벤트 버스 - Classic도 대상이 될 수 있습니다. 버스 ARN을 로 설정합니다`TargetArn`. Amazon SQS FIFO 대기열과 같은 FIFO 대상의 경우 파라미터 블록에서 대상의 자체 중복 제거 식별자를 JSONata 표현식을 사용하여 이벤트에서 파생된 메시지`SqsParameters.MessageDeduplicationId`당 값으로 설정합니다. 상수는 대상이 첫 번째 메시지 이후 모든 메시지를 무시하도록 합니다.

*범용 대상*은 그 사이에 함수 없이 AWS API 작업을 직접 호출합니다. ARN의 형식은 `arn:aws:events:::aws-sdk:{{service}}:{{apiAction}}`입니다. 예를 들어, `arn:aws:events:::aws-sdk:dynamodb:putItem`는 JSON 또는 JSONata 표현식으로 요청을 `UniversalTargetParameters.Input` 보관합니다. 이름 지정 규칙, 일괄 처리 및 실패 동작은 섹션을 참조하세요[사용자 지정 이벤트 버스의 범용 대상](eb-custom-bus-universal-targets.md).

구독자를 생성할 때 EventBridge는 ARN에서 대상 유형을 확인하고 파라미터 블록이 대상 유형과 일치하는지, ARN이 계정에 속하는지, 모든 표현식이 구문 분석되는지 세 가지 사항을 확인합니다. 대상이 존재하는지, 역할에 도달할 수 있는지, 대상의 API가 값을 수락하는지는 전송 시 확인되므로 대상에서 첫 번째 전송을 확인합니다.

## 재시도 및 배달 못한 편지 대기열
<a name="eb-custom-bus-subscribers-retry"></a>

`RetryPolicy`는 EventBridge가 기본적으로 300초 이내에 실패한 전송을 재시도하는 시간을 설정하고 재시도를 소진한 각 이벤트에 대한 레코드를 수신하는 Amazon SQS 대기열의 `OnFailureConfiguration.Arn` 이름을 지정합니다. 구독자를 생성할 때 둘 다 설정합니다. 제한, 레코드 형식 및 리드라이브 방법은 섹션을 참조하세요[재시도 정책 및 배달 못한 편지 대기열](eb-custom-bus-retry.md).

## 전송 역할
<a name="eb-custom-bus-subscribers-role"></a>

의 역할은 계정에 속하고 `events.amazonaws.com` 서비스 보안 주체를 신뢰해야 `RoleArn` 합니다. 호출자가 `iam:PassRole` 역할을 통해 구독자를 생성해야 하거나 EventBridge가 대상 ARN을 확인하기 전에 요청을 거부합니다. 역할의 권한 정책에는 두 가지 권한이 필요합니다.
+ 예를 들어 `sqs:SendMessage` 대기열, 함수, 주제 또는 스트림`lambda:InvokeFunction`에서 대상`sns:Publish`에 필요한 작업`kinesis:PutRecords`입니다.
+ `sqs:SendMessage`의 배달 못한 편지 대기열. `OnFailureConfiguration.Arn` 전송이 실패하면 전송 실패 시 아무 곳도 자체적으로 기록할 수 없으며 이러한 이벤트는 신호 없이 손실됩니다.

다음 신뢰 정책은 EventBridge가 역할을 수임하도록 허용합니다.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { "Service": "events.amazonaws.com" },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

다음 권한 정책은 Amazon SQS 대기열로 전송하고 배달 못한 편지를 두 번째 대기열로 전송합니다.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "InvokeTheTarget",
            "Effect": "Allow",
            "Action": "sqs:SendMessage",
            "Resource": "arn:aws:sqs:us-east-1:111122223333:large-orders"
        },
        {
            "Sid": "WriteToTheDeadLetterQueue",
            "Effect": "Allow",
            "Action": "sqs:SendMessage",
            "Resource": "arn:aws:sqs:us-east-1:111122223333:large-orders-dlq"
        }
    ]
}
```

## 예: 대기열에 대량 주문 전달
<a name="eb-custom-bus-subscribers-example"></a>

다음 명령은에 게시된 이벤트에 대해 Amazon SQS 대기열에 500개 이상의 주문을 전달하는 구독자를 생성하고 배달 못한 편지 대기열에 실패를 `PutEvents`보냅니다.

```
aws eventsv2 create-subscriber \
    --name large-orders \
    --event-bus-arn arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef \
    --filter-configuration '{
        "Filters": [
            { "Scope": "DATA", "Pattern": "{\"detail\":{\"total\":[{\"numeric\":[\">\",500]}]}}" }
        ]
    }' \
    --invoke-configuration '{
        "TargetArn": "arn:aws:sqs:us-east-1:111122223333:large-orders",
        "RoleArn": "arn:aws:iam::111122223333:role/EventBusDeliveryRole"
    }' \
    --on-failure-configuration '{ "Arn": "arn:aws:sqs:us-east-1:111122223333:large-orders-dlq" }'
```

## 문제 해결: 게시했지만 대상에 아무것도 도착하지 않음
<a name="eb-custom-bus-subscribers-nothing-arrived"></a>

게시 응답에는 버스가 이벤트를 수락하고 저장했다고만 표시되며 전송을 확인하지 않습니다. 다음 검사를 순서대로 수행합니다.

증상  
게시 호출은 실패한 항목 없이 HTTP 200을 반환했으며 몇 분 후에 대상이 아무것도 수신하지 않았습니다.

원인  
전송이 여전히 재시도 중이고, 구독자가 `STOPPED`이거나 취소되었으며, 구독자의 이고 구독자가 존재하기 전에 `StartingPosition` `LATEST` 이벤트가 게시되었거나, 필터가 다른 게시 API에 대해 작성되고 아무것도 일치하지 않거나, 전송 역할이 대상 또는 배달 못한 편지 대기열에 도달할 수 없는 다섯 가지 항목 중 하나입니다.는 문제의 절반을 `TargetInvocations` 알려줍니다. 가 `TargetInvocations` 없는의 데이터 포인트는 전송이 시도되고 실패함을 `EventsDelivered` 의미합니다. `FilterEvaluated`에 데이터 포인트가 있는 `TargetInvocations` 동안에는에 데이터 포인트가 없으므로 전송을 시도하지 않습니다. 구독자가 인지 확인하고를 `RUNNING`확인합니다`EventTransformationFailures`.

Solution  

1. 구독자를 읽습니다. `State`는 `RUNNING` 이고는 없어야 `Revoked` 하며, true인 경우에만 나타납니다. `StartingPosition` 및 필터를 기록해 둡니다.

   ```
   aws eventsv2 describe-subscriber \
       --subscriber-arn arn:aws:events:us-east-1:111122223333:subscriber/large-orders/EXAMPLE1234567890abcdef
   ```

1. 에서 구독자의 지표를 읽습니다`AWS/EventsV2`. 0`FilterEvaluated`은이 구독자에게 도달한 이벤트가 없음을 의미합니다. 즉, 생산자가 다른 버스에 게시했거나 구독자가와 함께 존재하기 전입니다`LATEST`. 0`FilterEvaluated`을 초과하고 0`FilterMatched`을 초과하면 필터가 일치하지 않음을 의미합니다. 섹션을 참조하세요[이벤트 구조: 데이터, 메타데이터 및 시스템 메타데이터](eb-custom-bus-addressing.md). `FilterMatched`에 데이터 포인트가 있고 그렇지 `EventsDelivered` 않은 경우 전송이 실패하고 결과를 기록하는 지표는 구독자에 따라 달라집니다. 즉, 배달 못한 편지 대기열이 구성되지 않은 `EventsDropped` 경우, 이벤트가 대기열에 도달한 `OnFailureDestinationDelivered` 경우 및 그렇지 않은 `OnFailureDestinationFailed` 경우입니다.

1. 로그를 켜고 재현합니다. `LogConfiguration.Level`를 `INFO``IncludePayload`로 설정하고`FULL`, 로그 전송을 연결하고, 다시 게시하고, `EVENT_DELIVERY_ATTEMPT` 레코드를 읽습니다. 각 에는 대상의 자체 오류 코드와 메시지가 포함되어 있으며, `details.target_input`는 전송하려는 것이 아니라 EventBridge가 전송한 것입니다. [사용자 지정 이벤트 버스에 대한 관찰성: 지표, 로그 및 CloudTrail](eb-custom-bus-observability.md) 섹션을 참조하세요.

1. 필터가 의심되는 경우 필터, `Transformer.Type` `WITH_METADATA`및 대상으로 소유한 대기열 없이 동일한 버스에 진단 구독자를 추가합니다. 각 이벤트는 EventBridge가 보는 대로 , `Metadata`및 `Data`로 정확하게 전달됩니다`SystemMetadata`. 그런 다음 한 번에 한 조건씩 필터를 단순화합니다. 제거한 마지막 조건이 원인입니다.

Verification(확인)  
일치하는 이벤트 하나와 그렇지 않은 이벤트를 게시합니다. 첫 번째는 대상에 도착하고 1씩 `EventsDelivered` 증가하며, 두 번째는 도착하지 않고 `FilterEvaluated` 증가하지만 `FilterMatched`는 그렇지 않습니다.

**참고**  
구독자의 지표는 버스 소유자와 구독자의 소유자가 사용할 수 있으며, 해당 로그는 구독자의 소유자에게만 전달됩니다.