从 S3 事件触发 ECS 任务

Posted

技术标签:

【中文标题】从 S3 事件触发 ECS 任务【英文标题】:Trigger ECS Task from S3 Event 【发布时间】:2019-03-15 10:34:43 【问题描述】:

我想在文件进入 S3 存储桶时触发 ECS 任务。我尝试在 S3 事件上使用 Cloudwatch 规则,但它似乎需要特定位置的特定文件或文件到达整个存储桶时触发,没有通配符/前缀/后缀来控制这两个极端之间的东西。

我也尝试过触发 SNS 主题,但似乎无法正确使用语法来处理我的特定主题。这是我到目前为止所拥有的:


 "source": [
   "aws.sns"
 ],
 "detail-type": [
   "AWS API Call via CloudTrail"
 ],
 "detail": 
   "eventSource": [
     "sns.amazonaws.com"
   ],
   "EventSubscriptionARN": [
     "arn:aws:sns:us-east-1:123456789123:WCIS_ECS_Test:xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
   ],
   "TopicARN": [
     "arn:aws:sns:us-east-1:123456789123:My_Topic"
   ],
   "eventName": [
     "Publish"
   ]
 

如果有人可以帮助整理一下它的语法,那就太棒了,或者,如果我应该研究另一种模式,那么这个建议也会很棒。

【问题讨论】:

【参考方案1】:

您可以尝试此链接上的教程: https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/

它基本上回答了您的问题,即如何处理 上传到您的 S3 存储桶中,使用 Lambda 和队列上传到您的 ECS 环境中。

本教程可能有点旧,因为它是在 2015 年编写的,但它仍然有效,您可以使用一些优化,例如避免使用 shell 脚本并将其替换为 Python SDK,和/或使用 lambda步骤函数来调用 SQS 和 ECS 服务。 您还可以使用 FIFO SQS 队列来确保不会丢失任何消息。

希望这会有所帮助!

【讨论】:

【参考方案2】:

您可以尝试选择 S3 触发器(首选)或 SNS 触发器或 SQS 触发器来执行 lambda 函数。在您的 lambda 函数中,您可以使用 AWS Python SDK - Boto3 根据您的 S3 文件元数据运行 ECS 任务。

链接 - https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html https://docs.aws.amazon.com/sns/latest/dg/sns-lambda.html https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ecs.html

示例代码 -

import boto3
client = boto3.client('ecs')
response = client.run_task(
    cluster='myCluster',
    taskDefinition='myECSService',
    count=1,
    launchType='EC2'
)

【讨论】:

以上是关于从 S3 事件触发 ECS 任务的主要内容,如果未能解决你的问题,请参考以下文章

如何将输入转换器用于 ECS Fargate 启动类型和 Terraform CloudWatch 事件触发器

S3 事件触发器是不是可扩展?

使用从 S3 事件调用的 AWS Lambda 触发 Airflow DAG

多个 cloudwatch 事件规则可以触发 aws 目标吗

在单个 S3 对象上传事件上触发多个 lambda

Cloudformation 模板在 S3 事件上触发 Lambda