View a markdown version of this page

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

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

使用创建自定义事件总线资源 Amazon CloudFormation

您可以通过 Amazon CloudFormation 模板创建总线、其订阅者、事件源及其资源策略。资源类型在AWS::EventsV2命名空间中。这些AWS::Events类型属于自定义事件总线-经典,无法配置自定义事件总线。

资源类型

  • AWS::EventsV2::EventBus是一条总线,包括其保留期和加密密钥。它需要Name。

  • AWS::EventsV2::Subscriber是总线上的一个订阅者:它的过滤器、转换、重试策略和它的单一目标。它需要NameEventBusArn、和InvokeConfiguration,而这本身就需要TargetArn和RoleArn。

  • AWS::EventsV2::EventSource是将 Amazon 服务事件或合作伙伴事件传送到总线中的一个托管源。它需要NameEventBusArn、和Configuration。请参阅自定义事件总线的事件源。

  • AWS::EventsV2::ResourcePolicy是已经存在的总线的资源策略。它需要EventBusArn和PolicyDocument。请参阅自定义事件总线的访问控制。

订阅者RoleArn必须在与订阅者相同的账户中命名角色。因此,跨账户共享的总线不止一个堆栈:所有者账户中的总线,以及每个消费账户中的目标、交付角色和订阅者。

示例:公共汽车、队列和订阅者

以下模板创建了一个将事件保留七天的总线、一个 Amazon SQS 队列、一个死信队列、一个交付角色以及一个向该队列交付 500 多个订单的订阅者。 Amazon CloudFormation 在订阅者之前创建角色和队列,因为订阅者使用这些角色和队列来引用Fn::GetAtt他们。保留期决定了订阅者可以追溯多久才能开始阅读;请参阅向订阅者重播保留的事件。

AWSTemplateFormatVersion: '2010-09-09' Resources: OrdersBus: Type: AWS::EventsV2::EventBus Properties: Name: orders Description: Order events for the fulfillment platform StorageConfiguration: RetentionPeriodInDays: 7 OrdersQueue: Type: AWS::SQS::Queue Properties: QueueName: large-orders OrdersDeadLetterQueue: Type: AWS::SQS::Queue Properties: QueueName: large-orders-dlq DeliveryRole: Type: AWS::IAM::Role Properties: RoleName: EventBusDeliveryRole AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: events.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: DeliverToQueues PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: sqs:SendMessage Resource: - !GetAtt OrdersQueue.Arn - !GetAtt OrdersDeadLetterQueue.Arn LargeOrders: Type: AWS::EventsV2::Subscriber Properties: Name: large-orders EventBusArn: !Ref OrdersBus FilterConfiguration: Filters: - Scope: DATA Pattern: '{"detail":{"total":[{"numeric":[">",500]}]}}' InvokeConfiguration: TargetArn: !GetAtt OrdersQueue.Arn RoleArn: !GetAtt DeliveryRole.Arn RetryPolicy: MaxRetryAttempts: 10 MaxEventAgeInSeconds: 3600 OnFailureConfiguration: Arn: !GetAtt OrdersDeadLetterQueue.Arn Outputs: OrdersBusArn: Value: !Ref OrdersBus Export: Name: orders-bus-arn

交付角色信任两个队列sqs:SendMessage上的events.amazonaws.com服务主体和授权。如果死信队列中没有授权,则无法记录交付失败,也无法观察到任何东西。部署堆栈的身份也需要iam:PassRole交付角色。

返回值

Ref返回资源的主要标识符,即 ARN。Fn::GetAtt返回只读属性。下表列出了每种资源类型的值。

资源类型 Ref 返回 Fn::GetAtt 属性
AWS::EventsV2::EventBus EventBusArn EventBusArn, State, CreationTime, LastModifiedTime
AWS::EventsV2::Subscriber SubscriberArn SubscriberArn, BusName, CreationTime, LastModifiedTime
AWS::EventsV2::EventSource EventSourceArn EventSourceArn, State, Revoked, CreationTime, LastModifiedTime
AWS::EventsV2::ResourcePolicy EventBusArn RevisionId

订阅者State是您设置的属性,而不是您读取的属性。将其设置STOPPED为暂停交付,然后将其设置RUNNING为恢复。总线State是只读的,其结算值为ACTIVE。

替换资源的属性

有六个订阅者属性只能创建,因此在模板中更改其中任何一个属性都会替换订户:NameEventBusArn、InvokeConfiguration.TargetArn、Type、StartingPosition、和PointInTimeConfiguration。所有其他订阅者属性,包括过滤器、转换、重试策略和死信队列,都已更新到位。

重要

订阅者替换会在创建新订户之前删除旧订阅者。在这两个步骤之间没有订阅者。然后,新订阅者从自己的事件LATEST开始StartingPosition,从最新的事件开始,因此它永远不会交付在该窗口内发布的事件。因此,除非你为差距做好计划,否则更改目标 ARN、订购类型或起始位置会丢失事件。

为避免间隙,请部署两次。首先将替换订阅者添加到新的逻辑 ID 下,然后等待其State到达RUNNING。然后在第二次部署中删除旧订阅者。两个订阅者都在重叠期间交付,因此目标接收每个匹配事件两次;只有在可以接受重复事件时才使用这种方法。

如果您无法进行两次部署,请将新订阅者设置为PointInTimeConfiguration自部署前起 Unix 纪元StartingPosition以来的秒数,POINT_IN_TIME并TIMESTAMP以 a StartingPoint 表示关闭。PointType然后,订阅者阅读其错过的事件,前提是这些事件仍在公交车的保留期内。

在总线上,Name仅限创建,因此保留期、描述、加密密钥和标签都将按原样更新。在事件源上Name,EventBusArn仅限创建,在资源策略上,EventBusArn是。

指来自另一个堆栈的总线

订阅者需要完整的总线 ARN,其中包括总线名称后面服务生成的标识符。存储并传递 ARN,而不是名称。请参阅自定义事件总线的名称、终端节点和 IAM 权限。

在一个账户和区域中,像示例一样从拥有总线的堆栈中导出 ARN,然后使用EventBusArn: !ImportValue orders-bus-arn它导入。 Amazon CloudFormation 不允许您在另一个堆栈导入导出的值时更改或删除该值。重命名总线会取代它并更改其 ARN,因此在存在导入时重命名失败。先删除导入订户,或使用新名称导出。

无法从其他账户或其他地区导入导出内容。改为将总线 ARN 作为模板参数传递到消费堆栈中。总线所有者还必须向其他账户授予总线上的权限,您可以通过资源策略或 Amazon 资源访问管理器 (Amazon RAM) 授予该权限。请参阅自定义事件总线的访问控制。