使用参数从 AWS::Events::Rule 开始 TaskDefinition

Start TaskDefinition from AWS::Events::Rule with parameter

我们有一个 TaskDefinition 类型的 FARGATE,它在执行 Kotlin 应用程序的 ECS 中启动一个 Docker 容器。当应用程序终止容器时,相关任务将被终止。

TaskDefinitionScheduledTask 启动,该 TaskDefinition 作为目标:

  TaskSchedule:
    Type: AWS::Events::Rule
    Properties:
      Description: "My amazing rule"
      ScheduleExpression: "cron(0 12 1 2 ? *)"
      State: "ENABLED"
      Targets:
        - Arn:
            'Fn::ImportValue': !Sub "${ApplicationName}-cluster"
          Id: !Sub "${ApplicationName}-${EnvironmentName}-task-id"
          RoleArn: !GetAtt TaskSchedulerRole.Arn
          EcsParameters:
            LaunchType: "FARGATE"
            TaskCount: 1
            TaskDefinitionArn: !Ref TaskDefinition

现在,我们需要有两个不同的 ScheduledTask,它们将使用不同的参数启动应用程序。 该参数必须用作环境变量。

这样做的简单方法是有两个任务定义,每个都有自己的环境变量,例如:

Environment:
   - Name: VARIABLE
     Value: "value"

和两个单独的 AWS::Events::Rule 规则,每个规则调用其任务定义:

Rule 1 -> TaskDefinition1 (with variable 1) -> start application with VARIABLE_1
Rule 2 -> TaskDefinition2 (with variable 2) -> start application with VARIABLE_2

考虑到任务定义会完全重复,唯一的区别是环境变量,难道没有办法在规则中定义一个参数,然后将其传递给任务定义吗? 我可以看到有一个 Input 属性 可以在规则的 Target 部分指定,这似乎是一个有效的 json 字符串,但我想不通了解在任务定义方面应该如何使用它。

谢谢!

我是这样解决问题的:

Input: !Sub '{ "containerOverrides": [{"name": "container-name", "environment": [{"name":"VARIABLE", "value": "override value"}]}]}'

这将覆盖容器内传递的环境变量的值。