View a markdown version of this page

在自定义事件总线上订阅事件 - Amazon EventBridge
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

在自定义事件总线上订阅事件

订阅者是一种资源,它说明你想要哪些事件以及将它们发送到哪里。你可以使用它来创建它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编写的,没有任何匹配项;或者交付角色无法到达目标或死信队列。STOPPED StartingPosition LATESTTargetInvocations告诉你你遇到了哪一半的问题。数据点开启但未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
  2. 阅读订阅者的指标AWS/EventsV2。FilterEvaluated设置为零表示没有事件到达该订阅者:制作人发布到另一辆公共汽车上,或者在订阅者存在之前LATEST。FilterEvaluated大于零且FilterMatched为零表示过滤器不匹配;参见事件结构:数据、元数据和系统元数据。何时FilterMatched有数据点和没有,交付EventsDelivered会失败,哪个指标记录结果取决于订阅者:EventsDropped何时未配置死信队列、事件OnFailureDestinationDelivered何时到达队列以及OnFailureDestinationFailed何时没有。

  3. 打开日志并进行复制。设置LogConfiguration.Level为INFO和IncludePayload为FULL,连接日志传输,再次发布并读取EVENT_DELIVERY_ATTEMPT记录。每个都带有目标自己的错误代码和消息,以及details.target_input,这是 EventBridge 发送的内容,而不是你打算发送的内容。请参阅自定义事件总线的可观察性:指标、日志和 CloudTrail。

  4. 如果过滤器是可疑的,则在同一条总线上添加一个没有过滤器的诊断订阅者 Transformer.TypeWITH_METADATA,并将您拥有的队列作为目标。它完全按照所 EventBridge 见、和 DataMetadata,交付每个事件SystemMetadata。然后逐个简化过滤条件;删除的最后一个条件就是原因。

验证

发布一个应该匹配但不应该匹配的事件。第一个到达目标并EventsDelivered递增一;第二个未到达而递增,而未到达则FilterEvaluatedFilterMatched递增。

注意

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