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

Posted

技术标签:

【中文标题】我可以从 S3 中的特定文件上传触发 ECS/Fargate 任务吗?【英文标题】:Can I trigger an ECS/Fargate task from a specific file upload in S3? 【发布时间】:2020-01-01 00:54:03 【问题描述】:

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

亚马逊似乎没有预料到会有多个工作的人为不同的文件查看同一个存储桶:(

【问题讨论】:

特定文件是什么意思? @MunavirChavody S3 将在任何文件落在存储桶中时生成一个事件。我只想在 foo/bar/myfile.* 进入存储桶时看到一个事件 【参考方案1】:

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

前往CloudTrail,并为您的帐户创建跟踪。

对于将跟踪应用到所有区域,选择否。 在管理事件、读/写事件下,选择无。 在数据事件下,选择 S3。输入您的 S3 存储桶名称和文件夹名称(前缀)以记录数据事件,然后选择写入(不要设置读取)。 在存储位置下,创建一个新存储桶或提供一个存储桶用于存储日志文件。 选择创建

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

前往 CloudWatch 和 Create a new Event rule。

对于事件源,选择事件模式 将“构建事件模式以匹配服务事件”的下拉菜单更改为选择“自定义事件模式” 在下面输入事件模式:

  "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。 对于您的目标,选择 ECS 任务,根据需要配置任务。 选择Configure details,为规则命名并将状态设置为Enabled,然后单击Create rule

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

【讨论】:

很好的答案,但我想知道是否可以为不同的文件名触发不同的 ECS 任务?即【参考方案2】:

您的评论中好像有通配符。要从 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"
      ]
    
  

【讨论】:

【参考方案3】:

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

请注意,您可以使用前缀和/或后缀来接近您想要的,但单个对象不能生成事件。不过,一个不错的选择是可以过滤对象名称的 Lambda,如果它与您想要的匹配,则运行 ECS 任务。

【讨论】:

以上是关于我可以从 S3 中的特定文件上传触发 ECS/Fargate 任务吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 terraform 上传 AWS S3 中的多个文件

从上传到 S3 的文件触发的无服务器框架和 AWS Step Functions(AWS 状态机)

使用 NodeJS 中的特定路径将文件上传到 AWS S3

将图像从 Android 上传到 Amazon S3?

将文件上传到 S3 存储桶后,AWS Glue Crawler 的基于事件的触发器?

AWS lambda 函数 python/pyspark