

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

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

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

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

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

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

1. 确保您拥有 Amazon 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 服务将事件传递到 Amazon Glue 时可承担的 IAM 角色。

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

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

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

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

****  

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

------

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

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

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

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

   请参阅《Amazon CLI 命令参考》**中的[创建触发器](https://docs.amazonaws.cn/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": [
          "Amazon 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    \"Amazon 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` 参数的更多信息，请参阅《Amazon 命令行界面用户指南》**中的[从 JSON 或 YAML 输入文件生成 Amazon CLI 骨架和输入参数](https://docs.amazonaws.cn/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    \"Amazon 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 Amazon 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. 输入以下命令，将策略附加到目标。目标是指 Amazon 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. 登录 Amazon Web Services 管理控制台，然后打开 Amazon Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.amazonaws.cn/glue/)。

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

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

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

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

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