

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

# Amazon EventBridge에서 `PutEvents`를 통해 이벤트 전송
<a name="eb-putevents"></a>

`PutEvents` 작업은 단일 요청으로 EventBridge에 여러 개의 [이벤트](eb-events.md)를 전송합니다. 자세한 내용은 *Amazon EventBridge API 참조*의 [PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html) 및 *AWS CLI 명령 참조*의 [put-events](https://docs.aws.amazon.com/cli/latest/reference/events/put-events.html)를 참조하세요.

각 `PutEvents` 요청은 제한된 수의 항목을 지원할 수 있습니다. 자세한 내용은 [Amazon EventBridge 할당량](eb-quota.md) 단원을 참조하십시오. `PutEvents` 작업은 요청의 일반 순서에 따라 모든 항목들을 처리하고자 시도합니다. `PutEvents`를 호출하면 EventBridge는 각 이벤트에 고유 ID를 할당합니다.

다음 예제의 Java 코드는 EventBridge에 동일한 이벤트를 두 개 전송합니다.

------
#### [ AWS SDK for Java Version 2.x ]

```
EventBridgeClient eventBridgeClient =
    EventBridgeClient.builder().build();

PutEventsRequestEntry requestEntry = PutEventsRequestEntry.builder()
    .resources("resource1", "resource2")
    .source("com.mycompany.myapp")
    .detailType("myDetailType")
    .detail("{ \"key1\": \"value1\", \"key2\": \"value2\" }")
    .build();

List <
PutEventsRequestEntry > requestEntries = new ArrayList <
PutEventsRequestEntry > ();
requestEntries.add(requestEntry);

PutEventsRequest eventsRequest = PutEventsRequest.builder()
    .entries(requestEntries)
    .build();

PutEventsResponse result = eventBridgeClient.putEvents(eventsRequest);

for (PutEventsResultEntry resultEntry: result.entries()) {
    if (resultEntry.eventId() != null) {
        System.out.println("Event Id: " + resultEntry.eventId());
    } else {
        System.out.println("PutEvents failed with Error Code: " + resultEntry.errorCode());
    }
}
```

------
#### [ AWS SDK for Java Version 1.0 ]

```
EventBridgeClient eventBridgeClient =
    EventBridgeClient.builder().build();
    
PutEventsRequestEntry requestEntry = new PutEventsRequestEntry()
        .withTime(new Date())
        .withSource("com.mycompany.myapp")
        .withDetailType("myDetailType")
        .withResources("resource1", "resource2")
        .withDetail("{ \"key1\": \"value1\", \"key2\": \"value2\" }");

PutEventsRequest request = new PutEventsRequest()
        .withEntries(requestEntry, requestEntry);

PutEventsResult result = awsEventsClient.putEvents(request);

for (PutEventsResultEntry resultEntry : result.getEntries()) {
    if (resultEntry.getEventId() != null) {
        System.out.println("Event Id: " + resultEntry.getEventId());
    } else {
        System.out.println("Injection failed with Error Code: " + resultEntry.getErrorCode());
    }
}
```

------

이 코드를 실행하면 `PutEvents` 결과에 응답 항목 어레이가 포함됩니다. 응답 어레이의 각 항목은 요청 및 응답이 처음부터 끝까지 순서대로 나열된 요청 어레이의 항목에 해당합니다. 응답의 `Entries` 어레이에는 항상 요청 어레이와 같은 수의 항목이 포함됩니다.

## `PutEvents`를 사용하여 실패 처리
<a name="eb-failure-handling"></a>

기본적으로 요청 내의 개별 항목이 실패하더라도 EventBridge는 요청의 나머지 항목을 계속 처리합니다. 응답 `Entries` 어레이에는 성공한 항목과 실패한 항목이 모두 포함될 수 있습니다. 따라서 실패한 항목들을 찾아서 후속 호출에 이를 포함시켜야 합니다.

성공한 결과 항목에는 `Id` 값이 포함되고, 실패한 결과 항목에는 `ErrorCode` 및 `ErrorMessage` 값이 포함됩니다. `ErrorCode`는 오류 유형을 설명하며 `ErrorMessage`는 오류에 대한 자세한 정보를 제공합니다. 다음 예제에서는 하나의 `PutEvents` 요청에 대해 3개의 결과 항목이 있습니다. 두 번째 항목은 실패했습니다.

```
{
    "FailedEntryCount": 1, 
    "Entries": [
        {
            "EventId": "11710aed-b79e-4468-a20b-bb3c0c3b4860"
        },
        {   "ErrorCode": "InternalFailure",
            "ErrorMessage": "Internal Service Failure"
        },
        {
            "EventId": "d804d26a-88db-4b66-9eaf-9a11c708ae82"
        }
    ]
}
```

**참고**  
`PutEvents`를 사용하여 존재하지 않는 이벤트 버스에 이벤트를 게시하는 경우 EventBridge 이벤트 매칭은 해당 규칙을 찾지 못하고 이벤트를 삭제합니다. EventBridge는 `200` 응답을 보내지만 요청이 실패하거나 요청 응답의 `FailedEntryCount` 값에 이벤트를 포함하지 않습니다.

후속 `PutEvents` 요청에 실패한 항목들을 포함할 수 있습니다. 먼저, 요청에 실패한 항목이 있는지 알아보려면 `PutEventsResult`에서 `FailedRecordCount` 파라미터를 확인합니다. 값이 0이 아닌 경우 null이 아닌 `ErrorCode` 값을 가진 각 `Entry` 항목을 후속 요청에 추가할 수 있습니다. 다음 예제에서는 실패 핸들러를 보여줍니다.

```
PutEventsRequestEntry requestEntry = new PutEventsRequestEntry()
        .withTime(new Date())
        .withSource("com.mycompany.myapp")
        .withDetailType("myDetailType")
        .withResources("resource1", "resource2")
        .withDetail("{ \"key1\": \"value1\", \"key2\": \"value2\" }");

List<PutEventsRequestEntry> putEventsRequestEntryList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    putEventsRequestEntryList.add(requestEntry);
}

PutEventsRequest putEventsRequest = new PutEventsRequest();
putEventsRequest.withEntries(putEventsRequestEntryList);
PutEventsResult putEventsResult = awsEventsClient.putEvents(putEventsRequest);

while (putEventsResult.getFailedEntryCount() > 0) {
    final List<PutEventsRequestEntry> failedEntriesList = new ArrayList<>();
    final List<PutEventsResultEntry> PutEventsResultEntryList = putEventsResult.getEntries();
    for (int i = 0; i < PutEventsResultEntryList.size(); i++) {
        final PutEventsRequestEntry putEventsRequestEntry = putEventsRequestEntryList.get(i);
        final PutEventsResultEntry putEventsResultEntry = PutEventsResultEntryList.get(i);
        if (putEventsResultEntry.getErrorCode() != null) {
            failedEntriesList.add(putEventsRequestEntry);
        }
    }
    putEventsRequestEntryList = failedEntriesList;
    putEventsRequest.setEntries(putEventsRequestEntryList);
    putEventsResult = awsEventsClient.putEvents(putEventsRequest);
    }
```

## 를 사용하여 이벤트 전송 AWS CLI
<a name="eb-send-events-aws-cli"></a>

 AWS CLI 를 사용하여 사용자 지정 이벤트를 EventBridge로 전송하여 처리할 수 있습니다. 다음 예제는 EventBridge로 하나의 사용자 지정 이벤트를 입력합니다.

```
aws events put-events \
--entries '[{"Time": "2016-01-14T01:02:03Z", "Source": "com.mycompany.myapp", "Resources": ["resource1", "resource2"], "DetailType": "myDetailType", "Detail": "{ \"key1\": \"value1\", \"key2\": \"value2\" }"}]'
```

사용자 지정 이벤트가 포함된 JSON 파일을 생성할 수도 있습니다.

```
[
  {
    "Time": "2016-01-14T01:02:03Z",
    "Source": "com.mycompany.myapp",
    "Resources": [
      "resource1",
      "resource2"
    ],
    "DetailType": "myDetailType",
    "Detail": "{ \"key1\": \"value1\", \"key2\": \"value2\" }"
  }
]
```

그런 다음 AWS CLI 를 사용하여이 파일의 항목을 읽고 이벤트를 보내려면 명령 프롬프트에 다음을 입력합니다.

```
aws events put-events --entries file://entries.json
```

## PutEvents 이벤트 항목 크기 계산
<a name="eb-putevent-size"></a>

`PutEvents` 작업을 사용하여 EventBridge로 사용자 지정 이벤트를 전송할 때 효율성을 위해 최대 10개의 이벤트 항목을 하나의 요청으로 일괄 처리할 수 있습니다. 총 요청 크기, 즉 요청의 모든 이벤트 항목 합계는 1MB 미만이어야 합니다. 이 제한은 개별 항목이 아닌 요청 전체에 적용됩니다. 단일 이벤트는 요청의 유일한 항목인 경우 최대 1MB를 사용할 수 있습니다. 이벤트를 전송하기 전에 항목 크기를 계산할 수 있습니다.



**참고**  
*항목*에는 크기 제한이 있습니다. 항목이 크기 제한보다 작더라도 EventBridge의 *이벤트*는 JSON 형식의 문자와 키로 이벤트를 표현해야 하므로 항상 항목 크기보다 큽니다. 자세한 내용은 [Amazon EventBridge의 이벤트](eb-events.md) 단원을 참조하십시오.

EventBridge는 다음과 같이 `PutEventsRequestEntry` 크기를 계산합니다.
+ 지정된 경우 `Time` 파라미터는 14바이트입니다.
+ `Source` 및 `DetailType` 파라미터는 UTF-8 인코딩 형식의 바이트 수입니다.
+ 지정된 경우 `Detail` 파라미터는 UTF-8 인코딩 형식의 바이트 수입니다.
+ 지정된 경우 각 `Resources` 파라미터 항목은 UTF-8 인코딩 형식의 바이트 수입니다.

다음의 Java 코드 예제는 지정된 `PutEventsRequestEntry` 객체의 크기를 계산합니다. 1MB 제한이 위반되지 않았는지 확인하려면 요청의 모든 이벤트에 대해 계산을 수행해야 합니다.

```
int getSize(PutEventsRequestEntry entry) {
    int size = 0;
    if (entry.getTime() != null) {
        size += 14;
    }
    size += entry.getSource().getBytes(StandardCharsets.UTF_8).length;
    size += entry.getDetailType().getBytes(StandardCharsets.UTF_8).length;
    if (entry.getDetail() != null) {
        size += entry.getDetail().getBytes(StandardCharsets.UTF_8).length;
    }
    if (entry.getResources() != null) {
        for (String resource : entry.getResources()) {
            if (resource != null) {
                size += resource.getBytes(StandardCharsets.UTF_8).length;
            }
        }
    }
    return size;
}
```

**참고**  
항목 크기가 1MB보다 큰 경우 이벤트를 Amazon S3 버킷에 업로드하고 `PutEvents` 항목에 `Object URL`를 포함하는 것이 좋습니다.