我可以从 S3 中的特定文件上传触发 ECS/Fargate 任务吗?

Can I trigger an ECS/Fargate task from a specific file upload in S3?

我知道我可以在上传文件时触发任务(根据 https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatch-Events-tutorial-ECS.html)但是,我如何在上传特定 文件时触发任务?

Amazon 似乎没有预料到人们有多个工作看着同一个存储桶中的不同文件:(

S3 不会为特定对象生成事件,而是为存储桶内发生的事件生成事件。下图是 bucket 可以发送的事件的 S3 控制台。

请注意,您可以使用前缀 and/or 后缀来接近您想要的内容,但单个对象无法生成事件。不过,一个不错的选择是可以过滤对象名称的 Lambda,如果它符合您的要求,运行 ECS 任务。

您可以使用 CloudTrail Data Events 中的 CloudWatch Events 完成此操作。

前往 CloudTrail,为您的帐户创建一个 Trail。

  • 对于 Apply trail to all regions,选择 No。
  • 管理事件,Read/Write 事件,select none。
  • 在数据事件下,select S3。输入您的 S3 存储桶名称和文件夹名称(前缀)以记录数据事件,并 select 写入(不要设置读取)。
  • 在存储位置下,创建一个新存储桶或提供一个用于存储日志文件的存储桶。
  • Select 创建

接下来,创建一个 CloudWatch 事件规则,在 CloudTrail 数据事件发生时以您的 ECS 任务为目标。

前往 CloudWatch 并 Create a new Event rule

  • 对于事件源select事件模式
  • 将显示 "Build event pattern to match events by service" 的下拉列表更改为 select "Custom Event Pattern"
  • 在下面输入事件模式:
{
  "source": [
    "aws.s3"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "s3.amazonaws.com"
    ],
    "eventName": [
      "PutObject"
    ],
    "requestParameters": {
      "bucketName": [
        "your-bucket-name" // this is the bucket where your events are happening
      ],
      "key": [
        "your-object-key" // this is the object key you want to trigger starting your ECS task, note that it's an array.
      ]
    }
  }
}

  • 根据您的使用情况自定义上面的 bucketNamekey
  • 对于您的目标,select ECS 任务,根据需要配置任务。
  • Select Configure details,为规则命名并将状态设置为Enabled,然后单击Create rule

现在您的规则已启用,当您将具有指定键的对象上传到指定存储桶时,CloudWatch Events 将触发您指定的 ECS 任务。

您的评论中似乎有通配符。要从 hephalump 添加到事件模式,您还可以为键指定一个前缀,它将匹配具有该前缀的任何键,而不仅仅是特定键:

{
  "source": [
    "aws.s3"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "s3.amazonaws.com"
    ],
    "eventName": [
      "PutObject"
    ],
    "requestParameters": {
      "bucketName": [
        "your-bucket-name" // this is the bucket where your events are happening
      ],
      "key": [
        {"prefix": "path/to/key"}
      ]
    }
  }
}