触发 Fargate 处理上传到 S3 的文件

Posted

技术标签:

【中文标题】触发 Fargate 处理上传到 S3 的文件【英文标题】:Trigger Fargate to process file uploaded to S3 【发布时间】:2021-06-03 05:52:00 【问题描述】:

我正在尝试让 CDK 应用程序设置 Fargate 任务,该任务将自动处理上传到 S3 存储桶的文件。

我有一个规则目标:

rule_target = targets.EcsTask(
    cluster=cluster,
    task_definition=task_definition,
    task_count=1
)

我有一个规则:

s3_upload_rule = events.Rule(
    self,
    's3_upload_rule',
    event_pattern=trigger_event_pattern,
    rule_name='s3_upload_rule',
    targets=[rule_target]
)

当然还有很多其他的东西,但据我所知,解决方案必须在这里。如果我要列出所有内容,这将是一个很长的帖子。规则有效,Fargate 任务被执行,但没有得到任何输入。

我最初的假设是像使用常规 run_task 一样使用 container_overrides,但由于它只接受字符串,因此很难告诉它我想要事件或事件的一部分。

其他事件目标采用 RuleTargetInput 参数可以解决这个问题,但是 EcsTask 没有。

规则的文档说:

targets (Optional[List[IRuleTarget]]) – 当此规则匹配事件时调用的目标。输入将是完全匹配的事件。如果您希望指定自定义目标输入,请使用 addTarget(target[, inputOptions])。默认值:- 无目标。

如果我尝试这样做,我会得到 TypeError: add_target() 需要 1 到 2 个位置参数,但给出了 3 个,因此文档似乎不正确。

我还尝试使用输入规范创建 RuleTargetConfig,但我还没有找到将其连接到规则或规则目标 (EcsTask) 的方法。 EcsTask 没有任何 ARN。

使用 bind 将 rule_target 连接到规则很诱人,因为它返回一个 RuleTargetConfig,但输入参数是只读的,所以这也是一个死胡同。

我知道这对 lambda 来说很简单,并且 lambda 处理程序默认获取完整事件,但我需要进行繁重的处理,这有时会导致 lambda 函数超时。当然也有可能触发将运行 Fargate 任务的 lambda。这将解决我的问题,但是我将继续尝试在没有 lambda 的情况下解决这个问题,因为它似乎必须在没有 lambda 的情况下可行。为什么会有从 EventBridge 触发 EcsTasks 的可能性。

【问题讨论】:

看起来您必须使用InputTransformer 来构建容器覆盖。我自己没有这样做,但我找到了example blog post。 我之前所做的是触发一个启动步进函数的 lambda。 step 函数做了一些处理,然后触发了 fargate 任务。效果很好,并为您提供了一些额外的可见性和控制力。 我查看了 InputTransformer 方法。 CDK 似乎不支持它,至少对于 EcsTask 而言。 我最终可能会得到一个 lambda 来触发处理。我可能会链接在 S3 上触发的 lambda 函数,因为 stepfunctions 不支持 SageMaker 推理。 【参考方案1】:

我在这里回答我自己的帖子。简而言之,到目前为止,我的结论是这是不可行的,至少在不使用自定义资源的情况下是不可行的。

我认为现在最好的解决方法是 urirot 建议从 s3 触发 lambda 并让该 lambda 开始运行任务。

【讨论】:

还是这样吗?我相信您应该能够按照本文中强调的那样做到这一点:docs.aws.amazon.com/eventbridge/latest/userguide/… 但是我不确定如何将它包含在我目前正在寻找的 CDK 中。让我知道你是否最终找到了解决方案,干杯

以上是关于触发 Fargate 处理上传到 S3 的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Fargate 任务提供上传到 S3 的正确权限

如何将 AWS-Fargate 用作 Python 脚本

使用 spark 下载、处理、上传大量 s3 文件

如何在将文件上传到s3时处理互联网不可用?

pyspark读写S3文件与简单处理(指定Schema,直接写S3或先本地再上传)

AWS - 想要将多个文件上传到 S3,并且只有在所有文件都上传后才会触发 lambda 函数