

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

# 为 Amazon S3 来源 (CLI) 创建 EventBridge 规则
<a name="create-cloudtrail-S3-source-cli"></a><a name="proc-cli-event-s3-createtrail"></a>

**创建 AWS CloudTrail 跟踪并启用日志记录**

要使用创建跟踪，请调用**create-trail**命令，指定： AWS CLI 
+ 跟踪名称。
+ 已将 AWS CloudTrail的存储桶策略应用于的存储桶。

有关更多信息，请参阅使用[AWS 命令行界面创建跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail-by-using-the-aws-cli.html)。

1. 调用 **create-trail** 命令并包含 `--name` 和 `--s3-bucket-name` 参数。

   **我为何做出此更改？** 这将创建 S3 源存储桶所需的 CloudTrail 跟踪。

   以下示例命令使用 `--name` 和 `--s3-bucket-name` 创建一个名为 `my-trail` 的跟踪和一个名为 `amzn-s3-demo-source-bucket` 的存储桶。

   ```
   aws cloudtrail create-trail --name my-trail --s3-bucket-name amzn-s3-demo-source-bucket
   ```

1. 调用 **start-logging** 命令并包含 `--name` 参数。

   **我为何做出此更改？** 此命令启动您的源存储桶的 CloudTrail 日志记录并将事件发送到 EventBridge。

   示例：

   以下命令使用 `--name` 启动针对名为 `my-trail` 的跟踪的日志记录。

   ```
   aws cloudtrail start-logging --name my-trail
   ```

1. 调用 **put-event-selectors** 命令并包含 `--trail-name` 和 `--event-selectors` 参数。使用事件选择器指定您希望您的跟踪记录源存储桶的数据事件并将事件发送到 EventBridge 规则。

   **我为何做出此更改？** 此命令筛选事件。

   示例：

   以下示例命令使用 `--trail-name` 和 `--event-selectors` 指定源存储桶的数据事件以及名为 `amzn-s3-demo-source-bucket/myFolder` 的前缀。

   ```
   aws cloudtrail put-event-selectors --trail-name my-trail --event-selectors '[{ "ReadWriteType": "WriteOnly", "IncludeManagementEvents":false, "DataResources": [{ "Type": "AWS::S3::Object", "Values": ["arn:aws:s3:::amzn-s3-demo-source-bucket/myFolder/file.zip"] }] }]'
   ```<a name="proc-cli-event-s3-createrule"></a>

**创建以 Amazon S3 作为事件源和 CodePipeline 目标的 EventBridge 规则并应用权限策略**

1. 授 EventBridge 予使用调 CodePipeline 用规则的权限。有关更多信息，请参阅[使用适用于 Amazon EventBridge 的基于资源的政策。](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-use-resource-based.html)

   1. 使用以下示例创建允许 EventBridge 担任服务角色的信任策略。将它命名为 `trustpolicyforEB.json`。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "events.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }
      ```

------

   1. 使用以下命令创建 `Role-for-MyRule` 角色并附加信任策略。

      **我为何做出此更改？** 将此信任策略添加到该角色会为创建权限 EventBridge。

      ```
      aws iam create-role --role-name Role-for-MyRule --assume-role-policy-document file://trustpolicyforEB.json
      ```

   1. 为名为 `MyFirstPipeline` 的管道创建权限策略 JSON，如此处所示。将权限策略命名为 `permissionspolicyforEB.json`。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "codepipeline:StartPipelineExecution"
                  ],
                  "Resource": [
                      "arn:aws:codepipeline:us-west-2:111122223333:MyFirstPipeline"
                  ]
              }
          ]
      }
      ```

------

   1. 使用以下命令将新的 `CodePipeline-Permissions-Policy-for-EB` 权限策略附加到您创建的 `Role-for-MyRule` 角色。

      ```
      aws iam put-role-policy --role-name Role-for-MyRule --policy-name CodePipeline-Permissions-Policy-For-EB --policy-document file://permissionspolicyforEB.json
      ```

1. 调用 **put-rule** 命令并包含 `--name`、`--event-pattern` 和 `--role-arn` 参数。

   以下示例命令创建名为 `MyS3SourceRule` 的规则。

   ```
   aws events put-rule --name "MyS3SourceRule" --event-pattern "{\"source\":[\"aws.s3\"],\"detail-type\":[\"AWS API Call via CloudTrail\"],\"detail\":{\"eventSource\":[\"s3.amazonaws.com\"],\"eventName\":[\"CopyObject\",\"PutObject\",\"CompleteMultipartUpload\"],\"requestParameters\":{\"bucketName\":[\"amzn-s3-demo-source-bucket\"],\"key\":[\"my-key\"]}}}
    --role-arn "arn:aws:iam::ACCOUNT_ID:role/Role-for-MyRule"
   ```

1. 要添加 CodePipeline 为目标，请调用**put-targets**命令并添加`--rule`和`--targets`参数。

   以下示例命令为名为 `MyS3SourceRule` 的规则指定此内容，目标 `Id` 由数字 1 组成，这指示此内容位于规则的目标列表中，而这是目标 1。此命令还为管道指定一个示例 `ARN`。管道在存储库中发生更改时启动。

   ```
   aws events put-targets --rule MyS3SourceRule --targets Id=1,Arn=arn:aws:codepipeline:us-west-2:80398EXAMPLE:TestPipeline
   ```

1. （可选）要为特定映像 ID 配置具有源覆盖的输入转换器，请在 CLI 命令中使用以下 JSON：以下示例配置了覆盖，其中：
   + `actionName`，本示例中的 `Source`，是在创建管道时定义的动态值，不是从源事件派生的。
   + `revisionType`，本示例中的 `S3_OBJECT_VERSION_ID`，是在创建管道时定义的动态值，不是从源事件派生的。
   + 在本示例中`revisionValue`，< *revisionValue* > 是从源事件变量派生的。

   ```
   {
       "Rule": "my-rule",
       "Targets": [
           {
               "Id": "MyTargetId",
               "Arn": "ARN",
               "InputTransformer": {
                   "InputPathsMap": {
                       "revisionValue": "$.detail.object.version-id"
                   },
                   "InputTemplate": {
                       "sourceRevisions": {
                           "actionName": "Source",
                           "revisionType": "S3_OBJECT_VERSION_ID",
                           "revisionValue": "<revisionValue>"
                       }
                   }
               }
           }
       ]
   }
   ```<a name="proc-cli-flag-s3"></a>

**编辑管道的 PollForSourceChanges 参数**
**重要**  
使用此方法创建管道时，如果 `PollForSourceChanges` 参数未明确设置为 false，则默认为 true。添加基于事件的更改检测时，必须将参数添加到输出并将其设置为 false 以禁用轮询。否则，您的管道将针对单个源更改启动两次。有关更多信息，请参阅 [`PollForSourceChanges` 参数的有效设置](PollForSourceChanges-defaults.md)。

1. 运行 **get-pipeline** 命令以将管道结构复制到 JSON 文件中。例如，对于名为 `MyFirstPipeline` 的管道，运行以下命令：

   ```
   aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json
   ```

   该命令不会返回任何结果，但您创建的文件将出现在您运行命令所在的目录中。

1. 在任何纯文本编辑器中打开 JSON 文件并通过将名为 `amzn-s3-demo-source-bucket` 的存储桶的 `PollForSourceChanges` 参数更改为 `false` 来编辑源阶段，如此示例中所示。

   **我为何做出此更改？** 将此参数设置为 `false` 将关闭定期检查，因此您只能使用基于事件的更改检测。

   ```
   "configuration": {
       "S3Bucket": "amzn-s3-demo-source-bucket",
       "PollForSourceChanges": "false",
       "S3ObjectKey": "index.zip"
   },
   ```

1. 如果您要使用通过 **get-pipeline** 命令检索到的管道结构，则必须删除 JSON 文件中的 `metadata` 行。否则，**update-pipeline** 命令无法使用它。删除 `"metadata": { }` 行以及 `"created"`、`"pipelineARN"` 和 `"updated"` 字段。

   例如，从结构中删除以下各行：

   ```
   "metadata": {
       "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name",
       "created": "date",
       "updated": "date"
   },
   ```

   保存该文件。

1. 要应用更改，请运行 **update-pipeline** 命令，指定管道 JSON 文件：
**重要**  
务必在文件名前包含 `file://`。此命令中需要该项。

   ```
   aws codepipeline update-pipeline --cli-input-json file://pipeline.json
   ```

   该命令会返回编辑后的管道的整个结构。
**注意**  
**update-pipeline** 命令会停止管道。如果在运行 **update-pipeline** 命令时正在通过管道运行修订，则该运行会被停止。您必须手动启动管道，通过升级后的管道运行此修订。使用 **start-pipeline-execution** 命令手动启动您的管道。