在 Amazon EventBridge PutEvents中使用 傳送事件 - Amazon EventBridge

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Amazon EventBridge PutEvents中使用 傳送事件

PutEvents 動作可在單一請求中將多個事件傳送至 EventBridge。如需詳細資訊,請參閱《Amazon EventBridge API 參考》中的 PutEventsAWS CLI 命令參考中的 Put-Events

每個 PutEvents 請求可支援有限數量的項目。如需詳細資訊,請參閱 Amazon EventBridge 配額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 處理失敗

根據預設,如果要求中的個別項目失敗,EventBridge 會繼續處理要求中其餘的項目。回應 Entries 陣列可以同時包含成功和失敗的項目。您必須偵測未成功處理的項目,並將它們包含於後續呼叫中。

成功的結果項目包含一個 Id 值,不成功的結果項目包括 ErrorCodeErrorMessage 值。ErrorCode 描述錯誤的類型。ErrorMessage 提供關於錯誤的詳細資訊。以下範例有 PutEvents 請求的三個結果項目。第二個項目不成功。

{ "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

您可以使用 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 事件項目大小

當您使用 PutEvents動作將自訂事件傳送至 EventBridge 時,您可以將多個事件項目批次處理為一個請求,以提高效率。不過,總項目大小 -- 也就是請求中所有事件的總和 -- 必須小於 256KB。您可以在傳送事件之前計算項目大小。

注意

項目有大小的限制。即使項目小於大小限制,由於事件之 JSON 表示法的必要字元和鍵,EventBridge 中的事件始終大於項目大小。如需詳細資訊,請參閱 Amazon EventBridge 中的事件

EventBridge 會計算 PutEventsRequestEntry 大小,如下所示:

  • 如果已指定,Time 參數為 14 個位元。

  • SourceDetailType 參數為其 UTF-8 編碼表單的位元組數。

  • 如果已指定,Detail 參數為其 UTF-8 編碼表單的位元組數。

  • 如果已指定,Resources 參數的每個項目為其 UTF-8 編碼表單的位元組數。

以下範例 Java 程式碼會計算指定的 PutEventsRequestEntry 物件的大小:為了確認 256KB 限制未違反,您需要對請求中的所有事件執行計算。

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; }
注意

如果項目大小大於 256KB,我們建議將事件上傳至 Amazon S3 儲存貯體,並在 PutEvents 項目中加入 Object URL