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 的工作方式,与其应有的工作方式相反。你有两种选择来解决这个问题:
创建启动状态机的 Lambda 函数。
- 当您想调用状态机时调用 Lambda 函数。
- 该 Lambda 函数将调用
describe_task_definition
ECS SDK 函数以获取任务定义的完整详细信息,并在为步骤函数调用 start_execution
函数时传递 [=12= 的所有内容] 以及 new/updated 环境变量。
- Lambda 函数可以按需安排或运行。
列出状态机中的所有环境变量。
- 就像你提到新变量一样,你也可能会提到所有以前的变量。 (它有冗余的缺点)
- 您可以为所有变量使用 SSM 参数存储,然后在状态机任务定义中也提及所有路径。
第一个选项需要一些自定义实现,但可以让您免于手动配置。
我按照这个例子,环境变量合并得很好:
https://cloudonaut.io/resilient-task-scheduling-with-ecs-fargate-cron-scheduled-task/
我还在容器定义中使用 EnvironmentFiles 参数在 s3 存储桶中定义变量。
为您的环境变量使用 s3 存储桶可能是您的另一个选择 3。
我正在使用 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 的工作方式,与其应有的工作方式相反。你有两种选择来解决这个问题:
创建启动状态机的 Lambda 函数。
- 当您想调用状态机时调用 Lambda 函数。
- 该 Lambda 函数将调用
describe_task_definition
ECS SDK 函数以获取任务定义的完整详细信息,并在为步骤函数调用start_execution
函数时传递 [=12= 的所有内容] 以及 new/updated 环境变量。 - Lambda 函数可以按需安排或运行。
列出状态机中的所有环境变量。
- 就像你提到新变量一样,你也可能会提到所有以前的变量。 (它有冗余的缺点)
- 您可以为所有变量使用 SSM 参数存储,然后在状态机任务定义中也提及所有路径。
第一个选项需要一些自定义实现,但可以让您免于手动配置。
我按照这个例子,环境变量合并得很好:
https://cloudonaut.io/resilient-task-scheduling-with-ecs-fargate-cron-scheduled-task/
我还在容器定义中使用 EnvironmentFiles 参数在 s3 存储桶中定义变量。
为您的环境变量使用 s3 存储桶可能是您的另一个选择 3。