从 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 事件调用的 AWS Lambda 触发 Airflow DAG