使用 Amazon EventBridge 事件启动 AWS Glue 工作流 - AWS Glue

使用 Amazon EventBridge 事件启动 AWS Glue 工作流

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 账户创建跟踪

使用 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 规则和目标。以下是您可以附加的一个示例策略。您可能需要将其范围缩小,以限制操作和资源。

    { "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": "*" } ] }
  2. 创建 EventBridge 服务将事件传递到 AWS Glue 时可承担的 IAM 角色。

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

    2. 完成 Create role (创建角色) 向导。向导会自动附加 CloudWatchEventsBuiltInTargetExecutionAccessCloudWatchEventsInvocationAccess 策略。

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

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:notifyEvent" ], "Resource": [ "arn:aws:glue:<region>:<account-id>:workflow/<workflow-name>" ] } ] }
  3. 输入以下命令以创建工作流。

    请参阅《AWS CLI 命令参考》中的创建工作流,了解有关其他可选命令行参数的信息。

    aws glue create-workflow --name <workflow-name>
  4. 输入以下命令,为工作流创建 EventBridge 事件触发器。这将是工作流的启动触发器。将 <actions> 替换为要执行的操作(要启动的任务和爬网程序)。

    请参阅《AWS CLI 命令参考》中的创建触发器,了解有关如何编码 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 秒,这是最大窗口大小。

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

    aws glue create-trigger --workflow-name eventtest --type EVENT --name objectArrival --event-batching-condition BatchSize=3,BatchWindow=300 --actions JobName=test1
  5. 在 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>/*"}}] }
    2. 使用您的首选工具将规则 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}
    3. 运行以下命令,创建您可编辑的 JSON 参数模板,以便将输入参数指定给后续 put-rule 命令。在文件中保存输出。在此示例中,文件名为 ruleCommand

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

      有关 --generate-cli-skeleton 参数的更多信息,请参阅《AWS 命令行界面用户指南》中的从 JSON 或 YAML 输入文件生成 AWS CLI 骨架和输入参数

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

      { "Name": "", "ScheduleExpression": "", "EventPattern": "", "State": "ENABLED", "Description": "", "RoleArn": "", "Tags": [ { "Key": "", "Value": "" } ], "EventBusName": "" }
    4. 编辑文件,选择性地删除参数,并且至少指定 NameEventPatternState 参数。对于 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" }
      注意

      在完成工作流构建之前,最好将规则保持禁用状态。

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

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

      以下输出代表成功。

      {
          "RuleArn": "<rule-arn>"
      }
      
  6. 输入以下命令,将策略附加到目标。目标是指 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": []
    }
  7. 输入以下命令,确认规则和目标连接成功。

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

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

    {
        "RuleNames": [
            "<rule-name>"
        ]
    }
    
  8. 登录 AWS Management Console,然后打开 AWS Glue 控制台,网址为:https://console.aws.amazon.com/glue/

  9. 选择工作流,确认启动触发器及其操作(触发器启动的任务或爬网程序)在工作流图表上显示。然后,继续执行 步骤 3:添加更多触发器 中的程序。或者,使用 AWS Glue API 或 AWS Command Line Interface,将更多组件添加到工作流。

  10. 完全指定工作流后,启用规则。

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

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