本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用创建自定义事件总线资源 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) 授予该权限。请参阅自定义事件总线的访问控制。