具有动态环境变量的 AWS CDK StateMachine BatchSubmitJob

AWS CDK StateMachine BatchSubmitJob with dynamic environment variables

我正在尝试在 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_cdk.aws_stepfunctions.JsonPath class:

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

感谢 !

解决了

对于批量提交作业,我最终得到了 intrinsic functions to format the value and the aws_cdk.aws_stepfunctions.JsonPath 的通过状态。

所以像这样:

sfn.Pass(scope
    id="id",
    result_path="$.result",
    parameters={"dynamic_from_payload.$": "States.Format('static_sub_part/{}',$.dynamic_sub_part)"} )

...

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