View a markdown version of this page

自定义事件总线的事件源 - 亚马逊 EventBridge

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

自定义事件总线的事件源

事件源将来自 AWS 服务或 SaaS 合作伙伴的事件提取到自定义事件总线上。您可以使用创建它,例如CreateEventSource,命名目标总线和一个起点aws.s3,然后将事件从起点 EventBridge 传送到总线。您自己的应用程序直接发布到总线,因此您只需要为非自己生成的事件提供事件源。

采集的事件以信封形式到达目的地总线,内容类型application/eventbridge+json为 EventBridge 信封。事件数据包含信封字段:sourcedetail-type、account、time、region、resources、和detail。 EventBridge 还设置信封aws:Source和中的aws:DetailType系统元数据字段detail-type。source请参阅事件结构:数据、元数据和系统元数据。

事件是如何移动的

当您创建事件源时, EventBridge 在您的账户中在 “自定义事件总线-Classic” 上创建托管规则和目标,然后它们会将事件从源传输到您的自定义事件总线。两者都会显示在您的账户中,ManagedBy设置为events.amazonaws.com。您不管理它们;删除或撤消事件源会将其移除。因此,这些事件仍会出现在自定义事件总线-Classic 的指标中。

AWS 服务事件源

AWS 服务事件源提取一项 AWS 服务(例如aws.s3或aws.ec2)为您的账户发出的事件。默认情况下,来自该服务的每个事件都会到达总线;要缩小范围,请添加Pattern. 以下示例创建了一个事件源,该事件源仅允许 Amazon S3 对象创建的事件。

aws eventsv2 create-event-source \ --name s3-object-created \ --event-bus-arn arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef \ --configuration '{"AwsServiceEventsConfiguration":{"AwsService":"aws.s3","Pattern":"{\"detail-type\":[\"Object Created\"]}"}}'

事件源的模式决定了什么会穿过总线。订阅者的过滤器决定该订阅者从流经总线的事件中收到什么;请参阅为订阅者筛选事件。用 EventBridge 事件模式语法 (亚马逊 EventBridge 事件模式) 编写模式,并 EventBridge 根据封套对其进行评估。将密source钥、顶层account和region密钥排除在模式之外: EventBridge 将这些条件本身、来自您的账户和地区以及您选择的服务添加进来,并拒绝提供这些条件的模式。

合作伙伴事件源

合作伙伴事件源采集 SaaS 合作伙伴发送到您的账户的事件。在创建合作伙伴事件源之前,合作伙伴必须为您的账户提供合作伙伴事件来源(参见接收来自亚马逊 SaaS 合作伙伴的活动 EventBridge),并且该来源必须处于PENDING状态。以下示例为其创建事件源。

aws eventsv2 create-event-source \ --name example-partner-events \ --event-bus-arn arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef \ --configuration '{"PartnerEventsConfiguration":{"PartnerEventSourceArn":"arn:aws:events:us-east-1::event-source/aws.partner/example.com/12345"}}'

创建事件源时,请在您的账户中 EventBridge 创建一个托管合作伙伴事件总线(自定义事件总线-Classic)以激活合作伙伴来源。当您删除事件源时, EventBridge 将删除该总线并将合作伙伴源返回到PENDING。要使用客户管理的密钥对该总线进行加密,请在您的账户和区域中设置PartnerBusKmsKeyIdentifier为密钥;否则 EventBridge 使用 AWS 自有密钥。

Dead-letter 队列

要捕获无法到达总线的事件,请在您的账户和地区设置OnFailureConfiguration.Arn为标准的 Amazon SQS 队列;FIFO 队列将被拒绝。消息从events.amazonaws.com服务主体而不是您提供的角色到达队列,因此请在队列的资源策略sqs:SendMessage中授予该委托人。

{ "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-east-1:111122223333:my-event-source-dlq", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" } } }

合作伙伴事件源根据两个来源 ARN 向队列发送事件:托管规则(针对交付失败)和托管合作伙伴事件总线(针对加密失败)。有条件的政策aws:SourceArn必须允许两者兼而有之。

Permissions

要使用另一个账户在公交车上创建事件源,公交车所有者必须通过 AWS RAM 共享(AWSRAMEventBridgeEventBusV2EventSourceAccess或FullAccess)或公交车上的PutResourcePolicy声明向您events:CreateEventSource授权。events:source条件密钥带有 AWS 服务名称或合作伙伴事件源名称,因此总线所有者可以允许或拒绝特定的来源。请参阅与其他账号共享自定义事件总线。

要对托管合作伙伴事件总线进行加密,您需要使用您的身份kms:DescribeKey和kms:Decrypt您所输入的密钥进行加密PartnerBusKmsKeyIdentifier;如果没有它们,CreateEventSource则会失败AccessDeniedException。

{ "Effect": "Allow", "Action": ["kms:DescribeKey", "kms:Decrypt"], "Resource": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" }

如果另一个账户拥有目标总线并使用客户管理的密钥对其进行加密,则该密钥的政策也必须允许您的账户;否则,创建、更新和描述事件源将失败。

订阅已摄取的事件

要匹配订阅者的 AWS 服务或合作伙伴事件,请在aws:Source系统元数据字段中进行筛选。 EventBridge 写入此字段,任何发布调用都无法设置以开头的值aws.,因此匹配其值是证明事件起源的唯一匹配项。对于 AWS 服务事件,匹配服务名称;对于合作伙伴事件,匹配合作伙伴事件源名称。

{ "Scope": "SYSTEM_METADATA", "Pattern": "{\"aws:Source\":[\"aws.s3\"]}" } { "Scope": "SYSTEM_METADATA", "Pattern": "{\"aws:Source\":[{\"prefix\":\"aws.partner/example.com\"}]}" }

要筛选活动内容,请添加DATA过滤器。信封下方装有内容detail。

{ "Scope": "DATA", "Pattern": "{\"detail\":{\"bucket\":{\"name\":[\"amzn-s3-demo-bucket\"]}}}" }

事件数据还带有source和detail-type,任何发布者都可以将这些值写入有效负载,因此它们无法证明其来源。aws:Source按值进行匹配,而不是按在线状态进行匹配:直接PutEvents呼叫也从其自身开始设置 aws:SourceSource,从不开始aws.。

永久停止事件源

总线所有者可以通过调用RevokeResource事件源的 ARN 来永久阻止事件源摄取;请参阅。撤销订阅者或事件源已撤销的事件源无法恢复。撤销涵盖您命名的一个资源,因此请将其与总线资源策略配对,以阻止同一个账户创建另一个资源。要阻止该账户在总线上创建任何事件源,请执行以下操作:

{ "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::444455556666:root" }, "Action": "events:CreateEventSource", "Resource": "arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef" }

要在允许其他来源的同时封锁一个来源,请将拒绝设为开启events:source。

{ "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::444455556666:root" }, "Action": "events:CreateEventSource", "Resource": "arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef", "Condition": { "StringEquals": { "events:source": "aws.partner/example.com/12345" } } }

确认事件已上传到公交车上

两组指标显示摄取的事件是否到达自定义事件总线。托管规则将在下方报告您账户中的常用规则指标AWS/Events。目标总线的发布指标带有EventSource维度,该维度按事件源划分了入站流量;请参阅。自定义事件总线的可观察性:指标、日志和 CloudTrail

当订阅者跨账户将事件从一个自定义事件总线传送到另一个自定义事件总线时,aws:DetailType只要活动的结构aws:Source和内容保持不变, AWS 服务和合作伙伴的事件就会保持不变。 EventBridge 使用授权他们到达目标总线events:PutEvents,因此目标总线的资源策略必须将该操作授予转发角色。您发布的应用程序发生的事件events:PutRawEvents,因此将两者混合在一起的直播需要同时执行这两个操作;请参阅事件总线目标:总线到总线。