【问题标题】:After updating Fargate TaskDefinition, CloudWatch events that trigger tasks fail because of inactive task definitions更新 Fargate TaskDefinition 后,触发任务的 CloudWatch 事件因任务定义不活动而失败
【发布时间】:2019-05-11 16:37:25
【问题描述】:

我在 ECS 中定义了一系列按循环计划运行的任务。我最近做了一个小改动来更新我在 Terraform 中的任务定义以更改我的容器的默认环境变量(从 DEBUGPRODUCTION):

        "environment": [
              {"name": "ENVIRONMENT", "value": "PRODUCTION"}
              ]

我使用 Fargate 的 Scheduled Tasks 功能运行此任务,并将其设置为每 4 小时一次。但是,在更新我的任务定义后,我开始看到 CloudWatch 没有触发这些任务,因为我的最后一个容器日志是几天前的。

我使用 CloudTrail 深入研究了该问题,并注意到 RunTask 事件条目的一个特定部分:

"eventTime": "2018-12-10T17:26:46Z",
"eventSource": "ecs.amazonaws.com",
"eventName": "RunTask",
"awsRegion": "us-east-1",
"sourceIPAddress": "events.amazonaws.com",
"userAgent": "events.amazonaws.com",
"errorCode": "InvalidParameterException",
"errorMessage": "TaskDefinition is inactive",

在日志的下方,我注意到 ECS 尝试运行的任务定义是

 "taskDefinition": "arn:aws:ecs:us-east-1:XXXXX:task-
definition/important-task-name:2",

但是,在我的 ECS 任务定义中,important-task-name 的最新版本是 3。所以看起来事件没有触发,因为我正在使用我的任务定义的“非活动”版本。

我有什么方法可以在 AWS Fargate 中安排任务,而无需手动通过控制台并停止/重新启动/更新每个集群的计划更新?有没有办法简单地要求 CloudWatch 提取最新的活动任务定义?

【问题讨论】:

  • 你找到解决办法了吗?
  • @MatheusIanzer 不,我没有

标签: amazon-web-services amazon-ecs


【解决方案1】:

您可以使用 CloudWatch 事件规则来控制计划任务,并且每当您更新任务定义时,您也可以更新您的规则。假设您有两个文件:

myRule.json

{
  "Name": "run-every-minute",
  "ScheduleExpression": "cron(0/1 * * * ? *)",
  "State": "ENABLED",
  "Description": "a task that will run every minute",
  "RoleArn": "arn:aws:iam::${IAM_NUMBER}:role/ecsEventsRole",
  "EventBusName": "default"
}

myTargets.json

{
  "Rule": "run-every-minute",
  "Targets": [
      {
          "Id": "scheduled-task-example",
          "Arn": "arn:aws:ecs:${REGION}:${IAM_NUMBER}:cluster/mycluster",
          "RoleArn": "arn:aws:iam::${IAM_NUMBER}:role/ecsEventsRole",
          "Input": "{\"containerOverrides\":[{\"name\":\"myTask\",\"environment\":[{\"name\":\"ENVIRONMENT\",\"value\":\"production\"},{\"name\":\"foo\",\"value\":\"bar\"}]}]}",
          "EcsParameters": {
            "TaskDefinitionArn": "arn:aws:ecs:${REGION}:${IAM_NUMBER}:task-definition/myTaskDefinition",
            "TaskCount": 1,
            "LaunchType": "FARGATE",
            "NetworkConfiguration": {
                "awsvpcConfiguration": {
                    "Subnets": [
                        "subnet-xyz1",
                        "subnet-xyz2",
                    ],
                    "SecurityGroups": [
                        "sg-xyz"
                    ],
                    "AssignPublicIp": "ENABLED"
                }
            },
            "PlatformVersion": "LATEST"
          }
      }
  ]
}

现在,每当 myTaskDefinition 有新版本时,您都可以更新您的规则,例如:

aws events put-rule --cli-input-json file://myRule.json --region $REGION
aws events put-targets --cli-input-json file://myTargets.json --region $REGION
echo 'done'

当然,用您的凭据替换 IAM_NUMBER 和 REGION,

【讨论】:

    【解决方案2】:

    【讨论】:

    • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
    猜你喜欢
    • 2020-08-07
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多