

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

# 使用创建自定义事件总线资源 CloudFormation
<a name="eb-custom-bus-cloudformation"></a>

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

## 资源类型
<a name="eb-custom-bus-cloudformation-types"></a>
+ `AWS::EventsV2::EventBus`是一条总线，包括其保留期和加密密钥。它需要`Name`。
+ `AWS::EventsV2::Subscriber`是总线上的一个订阅者：它的过滤器、转换、重试策略和它的单一目标。它需要`Name``EventBusArn`、和`InvokeConfiguration`，而这本身就需要`TargetArn`和`RoleArn`。
+ `AWS::EventsV2::EventSource`是将 AWS 服务事件或合作伙伴事件传送到总线中的一个托管源。它需要`Name``EventBusArn`、和`Configuration`。请参阅[自定义事件总线的事件源](eb-custom-bus-event-sources.md)。
+ `AWS::EventsV2::ResourcePolicy`是已经存在的总线的资源策略。它需要`EventBusArn`和`PolicyDocument`。请参阅[自定义事件总线的访问控制](eb-custom-bus-access.md)。

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

## 示例：公共汽车、队列和订阅者
<a name="eb-custom-bus-cloudformation-example"></a>

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

```
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`交付角色。

## 返回值
<a name="eb-custom-bus-cloudformation-returns"></a>

`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`。

## 替换资源的属性
<a name="eb-custom-bus-cloudformation-replacement"></a>

有六个订阅者属性只能创建，因此在模板中更改其中任何一个属性都会替换订户：`Name``EventBusArn`、`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`是。

## 指来自另一个堆栈的总线
<a name="eb-custom-bus-cloudformation-crossstack"></a>

订阅者需要完整的总线 ARN，其中包括总线名称后面服务生成的标识符。存储并传递 ARN，而不是名称。请参阅[自定义事件总线的名称、终端节点和 IAM 权限](eb-custom-bus-names.md)。

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

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