AWS Step Function ContainerOverrides 清除已定义的环境变量

Sam*_*eff 6 amazon-web-services amazon-ecs aws-step-functions

我正在使用 AWS Step Function 来调用 Fargate 容器。ECS 任务定义定义了多个环境变量,其中一些具有固定值,一些来自 Systems Manager Parameter Store。状态机使用 . 添加一个额外的环境变量ContainerOverrides

不幸的是,这似乎替换了而不是添加了任务定义中指定的环境变量。

如果我在步骤定义中未定义任何环境变量,则任务定义中的环境变量将在运行时存在。如果我在步骤定义中定义了一个变量,那么运行时只有步骤定义中的变量存在。

如何让 Fargate/ECS/Step Functions 合并环境变量而不是全部替换?

状态机

{
  "Comment": "Sample State Machine",
  "StartAt": "Prerequisites",
  "States": {
    "Prerequisites": {
      "Type": "Task",
      "Resource": "arn:aws:states:::ecs:runTask.sync",
      "Parameters": {
        "Cluster": "arn:aws:ecs:us-west-2:1232123123:cluster/step-function-executor",
        "TaskDefinition": "step-function-generic-script-executor",
        "LaunchType":"FARGATE",
        "NetworkConfiguration": {
          "AwsvpcConfiguration" : {
            "AssignPublicIp" : "DISABLED",
            "SecurityGroups" : [
              "sg-123",
              "sg-456"
            ],
            "Subnets" : [
              "subnet-123" ,
              "subnet-456"
            ]
          }
        },
        "Overrides": {
          "ContainerOverrides": [
            {
              "Name": "step-function-generic-script-container",
              "Environment": [ 
                {
                  "Name": "STEP_SCRIPT_NAME",
                  "Value": "db-daily-backup-01-prereq"
                }
              ]
            }
          ]
        }
      },
      "End": true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

任务定义

用于任务定义的 ECS 容器定义

ams*_*msh 4

这就是 ContainerOverrides 的工作方式,与它应该的工作方式相反。您有两种选择来解决此问题:

  1. 创建启动状态机的 Lambda 函数。

    • 当您想要调用状态机时,调用 Lambda 函数。
    • 该 Lambda 函数将调用describe_task_definitionECS SDK 函数来获取任务定义的完整详细信息,并在调用start_execution步骤函数的函数时,传递所有内容以及Parameters新的/更新的环境变量。
    • Lambda 函数可以计划或按需运行。
  2. 列出状态机中的所有环境变量。

    • 就像您提到新变量一样,您也可以提到所有以前的变量。(它的缺点是冗余)
    • 您可以对所有变量使用 SSM 参数存储,然后在状态机任务定义中提及所有路径。

第一个选项需要一些自定义实现,但可以让您免于手动配置。