

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在自定义事件总线上订阅事件
<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 传递事件。没有 a 的订阅者`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 | 
| 亚马逊 SNS 话题 | SnsParameters | 
| HTTP 端点或 API 目标 | HttpParameters | 
| 消防水带直播 | FirehoseParameters | 

自定义事件总线或自定义事件总线-经典也可以作为目标：将总线 ARN 设置为`TargetArn`。对于 FIFO 目标（例如 `SqsParameters.MessageDeduplicationId` Amazon SQS FIFO 队列），在参数块中将目标自己的重复数据删除标识符设置为使用 JSonata 表达式从事件中派生的每条消息值。常量使目标丢弃第一条消息之后的每条消息。

*通用目标直接*调用 AWS API 操作，中间没有函数。例如 `arn:aws:events:::aws-sdk:{{service}}:{{apiAction}}``arn:aws:events:::aws-sdk:dynamodb:putItem`，它的 ARN 具有表单，它将请求`UniversalTargetParameters.Input`保存为 JSON 或生成该请求的 JSONata 表达式。有关命名规则、批处理和失败行为，请参见[自定义事件总线的通用目标](eb-custom-bus-universal-targets.md)。

创建订阅者时，从 ARN EventBridge 解析目标类型并检查三件事：参数块是否与目标类型匹配、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`该角色才能创建订阅者，或者在检查目标 ARN 之前 EventBridge 拒绝该请求。该角色的权限策略需要两次授权。
+ 目标所需的操作，例如`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，没有失败的条目，并且目标在几分钟后没有收到任何内容。

原因  
按频率排序，有五件事之一：交付仍在重试中；订阅者已被撤销；订阅者在订阅者存在之前发布了该事件；过滤器是为另一个发布API编写的，没有任何匹配项；或者交付角色无法到达目标或死信队列。`STOPPED` `StartingPosition` `LATEST``TargetInvocations`告诉你你遇到了哪一半的问题。数据点开启但未`TargetInvocations`开启`EventsDelivered`表示尝试交付但失败。`TargetInvocations`当`FilterEvaluated`有数据点时没有开启数据点意味着没有尝试交付；检查订阅者是否有`RUNNING`，然后检查。`EventTransformationFailures`

解决方案  

1. 阅读订阅者。`State`必须存在`RUNNING`且`Revoked`必须不存在；它仅在为真时出现。注意`StartingPosition`事项和过滤器。

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

1. 阅读订阅者的指标`AWS/EventsV2`。`FilterEvaluated`设置为零表示没有事件到达该订阅者：制作人发布到另一辆公共汽车上，或者在订阅者存在之前`LATEST`。`FilterEvaluated`大于零且`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 见、和 `Data``Metadata`，交付每个事件`SystemMetadata`。然后逐个简化过滤条件；删除的最后一个条件就是原因。

验证  
发布一个应该匹配但不应该匹配的事件。第一个到达目标并`EventsDelivered`递增一；第二个未到达而递增，而未到达则`FilterEvaluated``FilterMatched`递增。

**注意**  
订阅者的指标可供总线所有者和订阅者的所有者使用；其日志仅传送给订阅者的所有者。