本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在自定义事件总线上订阅事件
订阅者是一种资源,它说明你想要哪些事件以及将它们发送到哪里。你可以使用它来创建它CreateSubscriber,命名总线、过滤器和一个目标。它监视该总线,保留与其过滤器匹配的事件,选择性地转换每个总线,然后将其传送到一个目标。要将一个事件传播到多个目标,请在同一条总线上为每个目标创建一个订阅者。
EventBridge 在给定总线上一次应用一个订阅者创建或删除,无论哪个账户调用。正在运行的另一DeleteSubscriber条总线CreateSubscriber或在同一条总线上运行时失败ConcurrentModificationException;重试。自定义事件总线配额因此,中的创建和删除费率适用于每条总线。
筛选哪些事件到达目标
FilterConfiguration包含的清单Filters。每个过滤器都有一个Pattern、 EventBridge 事件模式语法和一个Scope。每个范围最多只能有一个过滤器,并且仅当它与列表中的每个过滤器匹配时才会 EventBridge 传递事件。没有 a 的订阅者FilterConfiguration会收到总线上的所有事件。
-
DATA: 与有效载荷相匹配。将图案写在中描述的形状上事件结构:数据、元数据和系统元数据。 -
METADATA: 匹配生产者设置的键值对,仅限精PutRawEvents确匹配。 -
SYSTEM_METADATA: 匹配字段 EventBridge 集,例如aws:Source或EventGroupId。
有关模式语法、范围规则和示例,请参见为订阅者筛选事件。
改造有效载荷
Transformer.Type选择目标接收的内容。通用目标不使用它;参见自定义事件总线的通用目标。
-
RAW,默认。仅限有效载荷。 -
WITH_METADATA。完整活动:Data,Metadata, 和SystemMetadata. -
JSONATA。jsoNata 表达式的结果JsonataConfiguration.Expression,用{% %}分隔符包装,事件可用作。$events
EventBridge 创建订阅者时检查表达式的语法,并在交付时对其进行评估。抛出或不产生任何值的表达式会导致该事件的传递失败。在依赖真实事件之前,先根据真实事件测试表达式。有关有效$events内容、额外功能和限制,请参阅使用 JSonata 转换事件。
实现一个目标
InvokeConfiguration携带TargetArn、 EventBridge 假RoleArn定调用目标的,以及最多一个与目标类型匹配的参数块。大多数参数值接受 JSonata 表达式,因此值可以来自事件。下表列出了定制的目标类型及其参数块;每种目标类型下自定义事件总线订阅者的目标都有自己的页面。
| 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 表达式从事件中派生的每条消息值。常量使目标丢弃第一条消息之后的每条消息。
通用目标直接调用 Amazon API 操作,中间没有函数。例如 arn:aws:events:::aws-sdk:service:apiActionarn:aws:events:::aws-sdk:dynamodb:putItem,它的 ARN 具有表单,它将请求UniversalTargetParameters.Input保存为 JSON 或生成该请求的 JSONata 表达式。有关命名规则、批处理和失败行为,请参见自定义事件总线的通用目标。
创建订阅者时,从 ARN EventBridge 解析目标类型并检查三件事:参数块是否与目标类型匹配、ARN 是否属于您的账户,以及每个表达式是否解析。在交付时会检查目标是否存在、角色是否可以到达目标以及目标的 API 是否接受这些值,因此请在目标处确认首次交付。
重试和死信队列
RetryPolicy设置交付失败的 EventBridge 重试时间(默认情况下,在 300 秒内重试 5 次),并OnFailureConfiguration.Arn命名接收每个耗尽重试次数的事件记录的 Amazon SQS 队列。创建订阅者时同时设置两者。有关限制、录制格式以及如何重新驾驶,请参阅重试策略和死信队列。
交付角色
中的角色RoleArn必须属于您的账户并信任events.amazonaws.com服务主体。您的呼叫者需要iam:PassRole该角色才能创建订阅者,或者在检查目标 ARN 之前 EventBridge 拒绝该请求。该角色的权限策略需要两次授权。
-
目标所需的操作,例如
sqs:SendMessage对队列、lambda:InvokeFunctionsns: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" } ] }
示例:向队列交付大宗订单
以下命令创建一个订阅者,该订阅者将超过 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" }'
疑难解答:你发布了但没有到达目标
发布者的回应仅表示公交车接受并存储了该事件;它从未确认交付。按顺序完成以下检查。
- 症状
发布调用返回了 HTTP 200,没有失败的条目,并且目标在几分钟后没有收到任何内容。
- 原因
按频率排序,有五件事之一:交付仍在重试中;订阅者已被撤销;订阅者在订阅者存在之前发布了该事件;过滤器是为另一个发布API编写的,没有任何匹配项;或者交付角色无法到达目标或死信队列。
STOPPEDStartingPositionLATESTTargetInvocations告诉你你遇到了哪一半的问题。数据点开启但未TargetInvocations开启EventsDelivered表示尝试交付但失败。TargetInvocations当FilterEvaluated有数据点时没有开启数据点意味着没有尝试交付;检查订阅者是否有RUNNING,然后检查。EventTransformationFailures- 解决方案
-
阅读订阅者。
State必须存在RUNNING且Revoked必须不存在;它仅在为真时出现。注意StartingPosition事项和过滤器。aws eventsv2 describe-subscriber \ --subscriber-arn arn:aws:events:us-east-1:111122223333:subscriber/large-orders/EXAMPLE1234567890abcdef阅读订阅者的指标
AWS/EventsV2。FilterEvaluated设置为零表示没有事件到达该订阅者:制作人发布到另一辆公共汽车上,或者在订阅者存在之前LATEST。FilterEvaluated大于零且FilterMatched为零表示过滤器不匹配;参见事件结构:数据、元数据和系统元数据。何时FilterMatched有数据点和没有,交付EventsDelivered会失败,哪个指标记录结果取决于订阅者:EventsDropped何时未配置死信队列、事件OnFailureDestinationDelivered何时到达队列以及OnFailureDestinationFailed何时没有。打开日志并进行复制。设置
LogConfiguration.Level为INFO和IncludePayload为FULL,连接日志传输,再次发布并读取EVENT_DELIVERY_ATTEMPT记录。每个都带有目标自己的错误代码和消息,以及details.target_input,这是 EventBridge 发送的内容,而不是你打算发送的内容。请参阅自定义事件总线的可观察性:指标、日志和 CloudTrail。如果过滤器是可疑的,则在同一条总线上添加一个没有过滤器的诊断订阅者
Transformer.TypeWITH_METADATA,并将您拥有的队列作为目标。它完全按照所 EventBridge 见、和DataMetadata,交付每个事件SystemMetadata。然后逐个简化过滤条件;删除的最后一个条件就是原因。
- 验证
发布一个应该匹配但不应该匹配的事件。第一个到达目标并
EventsDelivered递增一;第二个未到达而递增,而未到达则FilterEvaluatedFilterMatched递增。
注意
订阅者的指标可供总线所有者和订阅者的所有者使用;其日志仅传送给订阅者的所有者。