首页 > 解决方案 > 具有动态环境变量的 AWS CDK StateMachine BatchSubmitJob

问题描述

我正在尝试在 AWS CDK 中创建一个带有 BatchSubmitJob 的状态机,并在 BatchContainerOverrides 中使用动态环境变量。我在想这样的事情:

container_overrides = sfn_tasks.BatchContainerOverrides(
    environment={
        "TEST.$": "$.dynamic_from_payload"
    }
)

return sfn_tasks.BatchSubmitJob(self.scope,
                                id="id",
                                job_name="name",
                                job_definition_arn="arn",
                                job_queue_arn="arn",
                                container_overrides=container_overrides,
                                payload=sfn.TaskInput.from_object({
                                    "dynamic_from_payload.$": "$.input.some_variable"
                                }))

但是,在部署时,CDK 会在状态机定义中添加“名称”和“值”,但值现在是静态的。这是控制台中看到的状态机定义的一部分:

"Environment": [
    {
        "Name": "TEST.$",
        "Value": "$.dynamic_from_payload"
    }
]

但我需要这样:

"Environment": [
    {
        "Name": "TEST",
        "Value.$": "$.dynamic_from_payload"
    }
]

我还尝试使用“Ref::”,就像这里对命令参数所做的那样:AWS Step and Batch Dynamic Command。但这也不起作用。

我还研究了逃生舱口,覆盖了 CloudFormation 模板。但我认为这不适用于这里,因为生成的状态机定义字符串基本上是一个大字符串。

我可以想到两种解决方案,这两种方法都不让我高兴:使用转义阴影覆盖状态机定义字符串,并使用副本在某些条件下替换“值”(可能使用正则表达式)或在状态机中放置一个 lambda这将创建并触发批处理作业和一个将在作业完成时进行轮询的 lambda。

长话短说:有没有人知道如何在 CDK 中将动态环境变量与 BatchSubmitJob 一起使用?

标签: aws-cdkaws-step-functionsaws-batch

解决方案


您可以使用aws_cdk.aws_stepfunctions.JsonPath类:

container_overrides = sfn_tasks.BatchContainerOverrides(
    environment={
        "TEST": sfn.JsonPath.string_at("$.dynamic_from_payload")
    }
)

推荐阅读