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

AWS Step Function ContainerOverrides clearing out already defined environment variables

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

添加一个额外的环境变量

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

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

如何获得 Fargate/ECS/Step 函数来合并环境变量而不是全部替换?

状态机

{
  "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
    }
  }
}

任务定义

这是 ContainerOverrides 的工作方式,与其应有的工作方式相反。你有两种选择来解决这个问题:

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

    • 当您想调用状态机时调用 Lambda 函数。
    • 该 Lambda 函数将调用 describe_task_definition ECS SDK 函数以获取任务定义的完整详细信息,并在为步骤函数调用 start_execution 函数时传递 [=12= 的所有内容] 以及 new/updated 环境变量。
    • Lambda 函数可以按需安排或运行。
  2. 列出状态机中的所有环境变量。

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

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

我按照这个例子,环境变量合并得很好:

https://cloudonaut.io/resilient-task-scheduling-with-ecs-fargate-cron-scheduled-task/

我还在容器定义中使用 EnvironmentFiles 参数在 s3 存储桶中定义变量。

为您的环境变量使用 s3 存储桶可能是您的另一个选择 3。