【发布时间】: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 推理。
标签: python amazon-ecs aws-cdk