

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

# 訂閱自訂事件匯流排上的事件
<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`。每個篩選條件都有一個 `Pattern`、EventBridge 事件模式語法，以及一個 `Scope`。每個範圍最多可以有一個篩選條件，而且 EventBridge 只會在符合清單中的每個篩選條件時傳送事件。沒有 的訂閱者`FilterConfiguration`會收到匯流排上的每個事件。
+ `DATA`： 符合承載。根據 中所述的形狀撰寫模式[事件結構：資料、中繼資料和系統中繼資料](eb-custom-bus-addressing.md)。
+ `METADATA`： 符合使用 設定的生產者金鑰值對`PutRawEvents`，僅完全相符。
+ `SYSTEM_METADATA`： 符合 EventBridge 設定的欄位，例如 `aws:Source`或 `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`。 中 JSONata 表達`{% %}`式的結果`JsonataConfiguration.Expression`，包裝在分隔符號中，事件可用為 `$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)。


| Target | 參數區塊 | 
| --- | --- | 
| Amazon SQS 佇列 | SqsParameters | 
| Lambda 函式 | LambdaParameters | 
| Kinesis 串流 | KinesisParameters | 
| Step Functions 狀態機器 | StepFunctionsParameters | 
| Amazon SNS 主題 | SnsParameters | 
| HTTP 端點或 API 目的地 | HttpParameters | 
| Firehose 串流 | FirehoseParameters | 

自訂事件匯流排或自訂事件匯流排 - Classic 也可以是目標：將匯流排 ARN 設定為 `TargetArn`。對於 FIFO 目標，例如 Amazon SQS FIFO 佇列，請在參數區塊中將目標自己的重複資料刪除識別符，例如 `SqsParameters.MessageDeduplicationId`，設定為從具有 JSONata 表達式的事件衍生的每個訊息值。常數可讓目標在第一個訊息之後捨棄每個訊息。

*通用目標*會直接叫用 AWS API 動作，其中沒有函數。其 ARN 的格式為 `arn:aws:events:::aws-sdk:{{service}}:{{apiAction}}`，例如 `arn:aws:events:::aws-sdk:dynamodb:putItem`，且其會將請求`UniversalTargetParameters.Input`保留為 JSON 或做為產生它的 JSONata 表達式。如需命名規則、批次處理和失敗行為，請參閱 [自訂事件匯流排的通用目標](eb-custom-bus-universal-targets.md)。

當您建立訂閱者時，EventBridge 會從 ARN 解析目標類型，並檢查三件事：參數區塊符合目標類型、ARN 屬於您的帳戶，以及每個表達式剖析。目標是否存在、角色是否可以到達，以及目標的 API 是否接受交付時檢查值，因此請在目標確認第一次交付。

## 重試和無效字母佇列
<a name="eb-custom-bus-subscribers-retry"></a>

`RetryPolicy` 設定 EventBridge 在 300 秒內重試失敗交付的時間長度，預設為 5 次嘗試，並`OnFailureConfiguration.Arn`命名 Amazon SQS 佇列，該佇列會收到已用盡其重試的每個事件的記錄。建立訂閱者時同時設定兩者。如需限制、記錄格式以及如何重新驅動，請參閱 [重試政策和無效字母佇列](eb-custom-bus-retry.md)。

## 交付角色
<a name="eb-custom-bus-subscribers-role"></a>

中的 角色`RoleArn`必須屬於您的帳戶，並信任 `events.amazonaws.com` 服務委託人。您的呼叫者需要角色 `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>

下列命令會針對使用 發佈的事件，建立將超過 500 個訂單交付至 Amazon SQS 佇列的訂閱者`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`表示嘗試交付且失敗。在 上沒有資料點，`TargetInvocations`而 `FilterEvaluated` 有資料點表示未嘗試傳遞；檢查訂閱者是否為 `RUNNING`，並檢查 `EventTransformationFailures`。

解決方案  

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`。`FilterEvaluated`零表示沒有事件到達此訂閱者：生產者發佈到另一個匯流排，或在訂閱者與 存在之前`LATEST`。零`FilterMatched`到零`FilterEvaluated`以上表示篩選條件不匹配；請參閱[事件結構：資料、中繼資料和系統中繼資料](eb-custom-bus-addressing.md)。當 `FilterMatched`有資料點但`EventsDelivered`沒有，交付會失敗，而哪個指標記錄結果取決於訂閱者：`EventsDropped`未設定無效字母佇列、事件到達佇列`OnFailureDestinationDelivered`，以及`OnFailureDestinationFailed`未設定。

1. 開啟日誌並重製。將 `LogConfiguration.Level`設定為 `INFO`，`IncludePayload`將日誌交付轉接`FULL`至 ，再次發佈，然後讀取`EVENT_DELIVERY_ATTEMPT`記錄。每個 都會攜帶目標自己的錯誤代碼和訊息，而 是 EventBridge 傳送的內容`details.target_input`，而不是您要傳送的內容。請參閱 [自訂事件匯流排的可觀測性：指標、日誌和 CloudTrail](eb-custom-bus-observability.md)。

1. 如果篩選條件是嫌疑者，請在相同匯流排上新增診斷訂閱者，而沒有篩選條件、 `Transformer.Type` `WITH_METADATA`以及您擁有做為目標的佇列。它將 EventBridge 看到的每個事件完全交付為 `Data`、 `Metadata`和 `SystemMetadata`。然後，一次簡化您的篩選條件一個條件；您移除的最後一個條件是原因。

驗證  
發佈一個應相符的事件和一個不應相符的事件。第一個 到達目標，並以 1 `EventsDelivered`為單位遞增；第二個 不會到達，而 `FilterMatched`不會`FilterEvaluated`。

**注意**  
訂閱者的指標可供匯流排擁有者和訂閱者的擁有者使用；其日誌只會交付給訂閱者的擁有者。