【问题标题】:Running multiple ECS tasks based on same task definition but with different environment variables基于相同的任务定义但使用不同的环境变量运行多个 ECS 任务
【发布时间】:2019-10-04 20:39:46
【问题描述】:

我的任务是处理大量数据,因此数据被分批成许多部分。我已经为这类工作编写了任务定义,但现在我只知道如何通过为每个环境注册多个任务定义来手动设置它们。

每个任务都有自己的环境的示例BATCH_ID

  aws ecs register-task-definition --cli-input-json file://taskdef1.json  
  aws ecs run-task --cluster $cluster --task-definition process_data_1

  aws ecs register-task-definition --cli-input-json file://taskdef2.json  
  aws ecs run-task --cluster $cluster --task-definition process_data_2

如果有一些 .manifest 文件包含所有用于集群的任务 arn,那就更好了。

有没有办法以更优雅的方式运行多个具有不同环境参数的类似 ECS 任务,然后创建大量不同的 taskdefs 文件?

感谢您的帮助和建议

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-ecs


    【解决方案1】:

    您可以在使用--overrides 标志运行任务时覆盖环境变量。我经常用这个;您可以覆盖现有的环境变量(在任务定义中定义)或简单地添加一个新变量。 --overrides 仅接受 JSON(无速记语法);在你的情况下,它看起来像:

    {
      "containerOverrides": [
        {
          "name": "containerNameFromTaskDefinition",
          "environment": [
            {
              "name": "BATCH_ID",
              "value": "sampleBatchId"
            }
          ]
        }
      ]
    }
    

    和命令:

    aws ecs run-task --cluster $cluster --task-definition process_data_1 --overrides {"containerOverrides":[...]} 
    

    您当然可以使用--overrides 覆盖更多内容:https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html

    【讨论】:

    • 假设您运行 5 个任务定义实例,这将如何让 BATCH_ID 成为 0、1、2、3、4?
    • 这是个好问题,我以为会有一个ECS环境变量来解决这个问题,但我没有找到??‍♂️
    • 是否有任何选项可以通过 cli/json 使用普通环境变量(值)覆盖环境变量(值来自)ssm 参数?
    • @Mithun 如果上面的覆盖不起作用,我假设你不能 - 文档没有指定 secrets 是否优先于 environment
    【解决方案2】:

    我可能误解了这里的问题,但您能否将变量放入您的 cli 输入 .json 并在运行任务之前使用 sed 换出批处理 ID?当我需要换出环境变量时,我已经为应用程序部署完成了此操作。

    首先,将要替换的变量放入 taskdef 模板文件中(如 %BATCH_ID%)

    然后执行以下操作:(注意:Bash 脚本不在我的脑海中,可能需要修复)

    sed 's/%BATCH_ID%/$BATCH_ID' generic_taskdef.json > process_data_$BATCH_ID.json 
    aws ecs register-task-definition --cli-input-json file://process_data_$BATCH_ID.json
    aws ecs run-task --cluster $cluster --task-definition process_data_$BATCH_ID
    

    【讨论】:

    • 是的,我可以像你说的那样做。但无论如何,它会创建大量任务,因此必须通过 envs 或 register 任务。我想知道是否可以使用例如 ecs cli compose 或具有多个容器的任务定义(对于每个特定的环境)。我想自动执行此任务以仅使用 1 个按钮。这是(下)为每个环境执行不同任务的建议,但这似乎不是最简单的方法。也许我错了stackoverflow.com/questions/53145233/… 谢谢
    • 据我了解,链接的文章是“最佳实践”——单个 taskdef 中的多个容器应该仅限于 sidecar。如果你想让它成为“按钮”,你可能必须编写一个脚本来组装 taskdefs(我使用的方法或其他海报推荐的方法 --overrides),注册它们,并且可能完成后清理它们。
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2019-12-01
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多