

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EventBridge の `PutEvents` を使用したイベントの送信
<a name="eb-putevents"></a>

`PutEvents` アクションは、1 つのリクエストで複数の[イベント](eb-events.md)を Eventbridge に送ります。詳細については、*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 コード例は 2 つの同一のイベントを 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 つの結果エントリがあります。2 番目のエントリは成功していません。

```
{
    "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` パラメータを確認します。ゼロでない場合、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>

を使用して、カスタムイベントを EventBridge AWS CLI に送信して処理できます。以下の例では、Eventbridge に 1 つのカスタムイベントを送っています。

```
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 個のイベントエントリを 1 つのリクエストにバッチ処理して効率を高めることができます。リクエストの合計サイズ、つまりリクエスト内のすべてのイベントエントリの合計は、1 MB 未満である必要があります。この制限は、個々のエントリではなく、リクエスト全体に適用されます。1 つのイベントがリクエスト内の唯一のエントリである場合、最大 1 MB まで使用できます。イベントを送信する前に、エントリサイズを計算できます。



**注記**  
サイズ制限は*エントリ*に適用されます。エントリがサイズ制限未満であっても、イベントの JSON 表現に必要な文字やキーのため、EventBridge の*イベント*は常にエントリサイズよりも大きくなります。詳細については、「[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`に を含めることをお勧めします。