

# 使用 Amazon EventBridge 事件启动 AWS Glue 工作流
<a name="starting-workflow-eventbridge"></a>

Amazon EventBridge 又名 CloudWatch Events，可助力您自动执行您的 AWS 服务并自动响应系统事件，例如应用程序可用性问题或资源更改。AWS 服务中的事件将近乎实时传输到 EventBridge。您可以编写简单规则来指示您关注的事件，并指示要在事件匹配规则时执行的自动化操作。

通过 EventBridge 支持，AWS Glue 可以在事件驱动型架构中充当事件创建者和使用者。对于工作流，AWS Glue 作为使用者支持任何类型的 EventBridge 事件。可能最常见的使用案例是 Amazon S3 存储桶中新对象的到达。如果数据以不规则或未定义的间隔到达，您可以尽可能在此数据到达时处理数据。

**注意**  
AWS Glue 不保证传送 EventBridge 消息。如果 EventBridge 传送重复消息，AWS Glue 不会执行重复数据删除。您必须基于自己的使用案例来管理幂等性。  
请确保正确配置 EventBridge 规则，避免发送不必要事件。

**开始前的准备工作**  
如果您要使用 Amazon S3 数据事件启动工作流，则必须确保关注的 S3 存储桶的事件记录到 AWS CloudTrail 和 EventBridge。为此，您必须创建 CloudTrail 跟踪。有关更多信息，请参阅[为您的 AWS 账户创建跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)。

**使用 EventBridge 事件启动工作流**
**注意**  
在以下命令中：  
将 *<workflow-name>* 替换为要分配给工作流的名称。
将 *<trigger-name>* 替换为要分配给触发器的名称。
将 *<bucket-name>* 替换为 Amazon S3 存储桶的名称。
将 *<account-id>* 替换为有效 AWS 账户 ID。
将 *<region>* 替换为区域的名称（例如，`us-east-1`）。
将 *<rule-name>* 替换为要分配给 EventBridge 规则的名称。

1. 确保您拥有 AWS Identity and Access Management（IAM）权限，可以创建和查看 EventBridge 规则和目标。以下是您可以附加的一个示例策略。您可能需要将其范围缩小，以限制操作和资源。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "events:PutRule",
           "events:DisableRule",
           "events:DeleteRule",
           "events:PutTargets",
           "events:RemoveTargets",
           "events:EnableRule",
           "events:List*",
           "events:Describe*"
         ],
         "Resource": "*"
       }
     ]
   }
   ```

------

1. 创建 EventBridge 服务将事件传递到 AWS Glue 时可承担的 IAM 角色。

   1. 在 IAM 控制台的 **Create role (创建角色)** 页面上，选择 **AWS Service (亚马逊云科技服务)**。然后，选择服务 **CloudWatch Events**。

   1. 完成 **Create role (创建角色)** 向导。向导会自动附加 `CloudWatchEventsBuiltInTargetExecutionAccess` 和 `CloudWatchEventsInvocationAccess` 策略。

   1. 将下面的内联策略附加到角色。此策略允许 EventBridge 服务将事件定向到 AWS Glue。

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

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "glue:notifyEvent"
            ],
            "Resource": [
              "arn:aws:glue:us-east-1:111122223333:workflow/workflow-name"
            ]
          }
        ]
      }
      ```

------

1. 输入以下命令以创建工作流。

   请参阅《AWS CLI 命令参考》**中的[创建工作流](https://docs.aws.amazon.com/cli/latest/reference/glue/create-workflow.html)，了解有关其他可选命令行参数的信息。

   ```
   aws glue create-workflow --name <workflow-name>
   ```

1. 输入以下命令，为工作流创建 EventBridge 事件触发器。这将是工作流的启动触发器。将 *<actions>* 替换为要执行的操作（要启动的任务和爬网程序）。

   请参阅《AWS CLI 命令参考》**中的[创建触发器](https://docs.aws.amazon.com/cli/latest/reference/glue/create-trigger.html)，了解有关如何编码 `actions` 参数的信息。

   ```
   aws glue create-trigger --workflow-name <workflow-name> --type EVENT --name <trigger-name> --actions <actions>
   ```

   如果您希望工作流由批量事件（而不是单个 EventBridge 事件）触发，请改为输入以下命令。

   ```
   aws glue create-trigger --workflow-name <workflow-name> --type EVENT --name <trigger-name> --event-batching-condition BatchSize=<number-of-events>,BatchWindow=<seconds> --actions <actions>
   ```

   对于 `event-batching-condition` 参数，`BatchSize` 为必需项，`BatchWindow` 为可选项。如果忽略 `BatchWindow`，则窗口默认为 900 秒，这是最大窗口大小。  
**Example**  

   下面的示例会创建一个触发器，该触发器在三个 EventBridge 事件到达后，或者第一个事件到达后五分钟（以先到者为准），启动 `eventtest` 工作流。

   ```
   aws glue create-trigger --workflow-name eventtest --type EVENT --name objectArrival --event-batching-condition BatchSize=3,BatchWindow=300 --actions JobName=test1
   ```

1. 在 Amazon EventBridge 中创建规则。

   1. 在您的首选文本编辑器中创建规则详细信息的 JSON 对象。

      以下示例将 Amazon S3 事件指定为事件源，`PutObject` 为事件名称，存储桶名称为请求参数。当新对象到达存储桶时，此规则将启动工作流。

      ```
      {
        "source": [
          "aws.s3"
        ],
        "detail-type": [
          "AWS API Call via CloudTrail"
        ],
        "detail": {
          "eventSource": [
            "s3.amazonaws.com"
          ],
          "eventName": [
            "PutObject"
          ],
          "requestParameters": {
            "bucketName": [
              "<bucket-name>"
            ]
          }
        }
      }
      ```

      要在新对象到达存储桶内的文件夹时启动工作流，您可以将以下代码替换为 `requestParameters`。

      ```
          "requestParameters": {
            "bucketName": [
              "<bucket-name>"
            ]
            "key" : [{ "prefix" : "<folder1>/<folder2>/*"}}]
        }
      ```

   1. 使用您的首选工具将规则 JSON 对象转义字符串转换为转义字符串。

      ```
      {\n  \"source\": [\n    \"aws.s3\"\n  ],\n  \"detail-type\": [\n    \"AWS API Call via CloudTrail\"\n  ],\n  \"detail\": {\n    \"eventSource\": [\n      \"s3.amazonaws.com\"\n    ],\n    \"eventName\": [\n      \"PutObject\"\n    ],\n    \"requestParameters\": {\n      \"bucketName\": [\n        \"<bucket-name>\"\n      ]\n    }\n  }\n}
      ```

   1. 运行以下命令，创建您可编辑的 JSON 参数模板，以便将输入参数指定给后续 `put-rule` 命令。在文件中保存输出。在此示例中，文件名为 `ruleCommand`。

      ```
      aws events put-rule --name <rule-name> --generate-cli-skeleton >ruleCommand
      ```

      有关 `--generate-cli-skeleton` 参数的更多信息，请参阅《AWS 命令行界面用户指南》**中的[从 JSON 或 YAML 输入文件生成 AWS CLI 骨架和输入参数](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-skeleton.html)。

      输出文件应与以下内容类似。

      ```
      {
          "Name": "",
          "ScheduleExpression": "",
          "EventPattern": "",
          "State": "ENABLED",
          "Description": "",
          "RoleArn": "",
          "Tags": [
              {
                  "Key": "",
                  "Value": ""
              }
          ],
          "EventBusName": ""
      }
      ```

   1. 编辑文件，选择性地删除参数，并且至少指定 `Name`、`EventPattern` 和 `State` 参数。对于 `EventPattern` 参数，请为您在上一步中创建的规则详细信息提供转义字符串。

      ```
      {
          "Name": "<rule-name>",
          "EventPattern": "{\n  \"source\": [\n    \"aws.s3\"\n  ],\n  \"detail-type\": [\n    \"AWS API Call via CloudTrail\"\n  ],\n  \"detail\": {\n    \"eventSource\": [\n      \"s3.amazonaws.com\"\n    ],\n    \"eventName\": [\n      \"PutObject\"\n    ],\n    \"requestParameters\": {\n      \"bucketName\": [\n        \"<bucket-name>\"\n      ]\n    }\n  }\n}",
          "State": "DISABLED",
          "Description": "Start an AWS Glue workflow upon new file arrival in an Amazon S3 bucket"
      }
      ```
**注意**  
在完成工作流构建之前，最好将规则保持禁用状态。

   1. 输入以下 `put-rule` 命令，该命令从文件 `ruleCommand` 中读取输入参数。

      ```
      aws events put-rule --name <rule-name> --cli-input-json file://ruleCommand
      ```

      以下输出代表成功。

      ```
      {
          "RuleArn": "<rule-arn>"
      }
      ```

1. 输入以下命令，将策略附加到目标。目标是指 AWS Glue 中的工作流。将 *<role-name>* 替换为您在此程序开始时创建的角色。

   ```
   aws events put-targets --rule <rule-name> --targets "Id"="1","Arn"="arn:aws:glue:<region>:<account-id>:workflow/<workflow-name>","RoleArn"="arn:aws:iam::<account-id>:role/<role-name>" --region <region>
   ```

   以下输出代表成功。

   ```
   {
       "FailedEntryCount": 0,
       "FailedEntries": []
   }
   ```

1. 输入以下命令，确认规则和目标连接成功。

   ```
   aws events list-rule-names-by-target --target-arn arn:aws:glue:<region>:<account-id>:workflow/<workflow-name>
   ```

   以下输出代表成功，其中 *<rule-name>* 是所创建规则的名称。

   ```
   {
       "RuleNames": [
           "<rule-name>"
       ]
   }
   ```

1. 登录 AWS 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 选择工作流，确认启动触发器及其操作（触发器启动的任务或爬网程序）在工作流图表上显示。然后，继续执行 [步骤 3：添加更多触发器](creating_running_workflows.md#workflow-step3) 中的程序。或者，使用 AWS Glue API 或 AWS Command Line Interface，将更多组件添加到工作流。

1. 完全指定工作流后，启用规则。

   ```
   aws events enable-rule --name <rule-name>
   ```

   工作流现在可以通过单个 EventBridge 事件或批量事件启动。

**另请参阅**  
[https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html)
[AWS Glue 中的工作流概述](workflows_overview.md)
[在 AWS Glue 中手动创建和构建工作流](creating_running_workflows.md)