Aws-cli: aws ecs - 如何更新任务定义

创建于 2017-12-29  ·  18评论  ·  资料来源: aws/aws-cli

有没有办法向 ECS 任务定义添加新修订?

就我而言,我想使用命令行更新我的 CD 管道中的容器 URL。 要么缺少文档如何执行此操作,要么当前只能使用管理控制台?

请参阅https://github.com/aws/amazon-ecs-cli/issues/91 (但我没有使用 docker compose)

guidance

最有用的评论

谢谢@m-radzikowski 我稍微修改了你的解决方案,所以当使用 git hash 作为图像标签而不是“最新”时它也有效。 需要一些环境变量才能工作
``

!/bin/bash

获取当前任务定义的脚本,并在此基础上向旧模板添加新的 ecr 图像地址并删除不需要的属性,然后我们发送新的任务定义,从输出和更新服务中获取新的修订号

设置 -e
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "$AWS_DEFAULT_REGION")
NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibility)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(echo $NEW_TASK_INFO | jq '.taskDefinition.revision')
aws ecs 更新服务 --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```

所有18条评论

嗯,我不确定。 一般来说,与使用相关的问题的最佳位置是堆栈溢出,如我们的README 中所述

不过查看文档,似乎只使用register-task-definition会创建一个新修订。 从https://docs.aws.amazon.com/cli/latest/reference/ecs/register-task-definition.html#output

          revision -> (integer)
              The revision of the task in a particular family. The revision is
              a version number of a task definition in a family. When you reg-
              ister  a task definition for the first time, the revision is 1 ;
              each time you register a new revision of a  task  definition  in
              the  same  family,  the  revision  value always increases by one
              (even if you have deregistered previous revisions in  this  fam-
              ily).

我会先试一试。

谢谢,抱歉打扰了。 我期待它是一个与update-service等其他命令一致的单独命令

你好@Extrawurst我有同样的问题。 我想知道你是否找到了解决方案。

@menocomp@jamesls答案。 只需使用register-task-definition ,如果该系列已经存在,它将创建一个新版本

register-task-definition不是一个令人满意的方式来完成一个简单的修订号。

register-task-definition需要任务定义参数或 JSON 作为输入。 从describe-task-definition会添加一个额外的字典层 _and_ 字段,这些字段对于register-task-definition使用无效。

压平顶级字典后:

$ aws ecs register-task-definition --family name --cli-input-json file:///tmp/task-definition.json

Parameter validation failed:
Unknown parameter in input: "taskDefinitionArn", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "revision", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "status", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "requiresAttributes", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration
Unknown parameter in input: "compatibilities", must be one of: family, taskRoleArn, executionRoleArn, networkMode, containerDefinitions, volumes, placementConstraints, requiresCompatibilities, cpu, memory, tags, pidMode, ipcMode, proxyConfiguration

我认为这应该作为功能请求重新打开。 目前,CI/CD 所需的用于 ECS 任务更新的 CLI 并不简单,需要额外的技巧。

网络上最常见的流程是调用describe-task-definition ,从中获取容器定义,更改image参数并使用register-task-definition --family $FAMILY --container-definitions $UPDATED_DEFINITION将其推回。

使用 Fargate 我遇到了这个流程的问题 - 任务无法使用相同的 JSON 进行更新,它需要额外的参数,而且我基本上不得不将describe-task JSON 中的所有顶级值作为register-task-definition参数(如 cpu、内存等)。

所以对我来说更好的解决方案是使用 JSON 作为任务的完整输入,但它有 @shatil 提到的自己的问题。 最后我以这样的脚本结束:

TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "us-east-1")
NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$NEW_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibilities)')
aws ecs register-task-definition --region "us-east-1" --cli-input-json "$NEW_TASK_DEFINTIION"

谢谢@m-radzikowski 我稍微修改了你的解决方案,所以当使用 git hash 作为图像标签而不是“最新”时它也有效。 需要一些环境变量才能工作
``

!/bin/bash

获取当前任务定义的脚本,并在此基础上向旧模板添加新的 ecr 图像地址并删除不需要的属性,然后我们发送新的任务定义,从输出和更新服务中获取新的修订号

设置 -e
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_REPO_NAME}:${CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_FAMILY" --region "$AWS_DEFAULT_REGION")
NEW_TASK_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$ECR_IMAGE" '.taskDefinition | .containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.compatibility)')
NEW_TASK_INFO=$(aws ecs register-task-definition --region "$AWS_DEFAULT_REGION" --cli-input-json "$NEW_TASK_DEFINTIION")
NEW_REVISION=$(echo $NEW_TASK_INFO | jq '.taskDefinition.revision')
aws ecs 更新服务 --cluster ${ECS_CLUSTER} --service ${SERVICE_NAME} --task-definition ${TASK_FAMILY}:${NEW_REVISION}```

这是什么状态? 我们如何创建任务定义修订版? 我认为会有类似的东西:

aws ecs update-task-definition --task-definition "$task_fam" --revision "ecr/name:tag"

所以是的,我正在寻找:

_ aws ecs 更新任务定义_

我使用aws ecs help进行了检查,但没有这样的实用程序:


Screen Shot 2019-08-13 at 10 31 13 AM


我创建了这张票: https :

aws-cli 支持,如果你不喜欢我们讨论就不要使用github,对不起,这仍然有效,应该重新打开

您可能不需要jq

aws describe-task-definition --task-definition myapp \
     --query 'taskDefinition.{containerDefinitions:containerDefinitions}' \
     > /tmp/task-definitions.json 

Fargate 用户可能需要像这样的长命令:

aws ecs register-task-definition \
    --family myapp \
    --cli-input-json file:///tmp/task.json \
    --requires-compatibilities FARGATE \
    --network-mode awsvpc \
    --cpu 1024 --memory 2048 \
    --task-role-arn <arn> --execution-role-arn <arn>

作为 fargate 用户,我发现了一个用于 ecs cli 和 --tags 的黑客。

无论您在版本号中输入什么,它都会将修订版设置为下一个。

ecs-cli compose --project-name PROJECT-NAME --file DOCKER_COMPOSE_FILE --ecs-params ECS_PARAMS_FILE --region REGION create --launch-type FARGATE --tags 'TaskDefinition=TASK:VERSION_NUMBER'

我已切换到 Fargate CLI。 它会自动更新合适的任务定义。

https://github.com/awslabs/fargatecli

我已切换到 Fargate CLI。 它会自动更新合适的任务定义。

https://github.com/awslabs/fargatecli

感谢分享 - 没看过。 期待检查出来。

如果您定义了卷,fargatecli 将不起作用

您可能不需要jq

aws describe-task-definition --task-definition myapp \
     --query 'taskDefinition.{containerDefinitions:containerDefinitions}' \
     > /tmp/task-definitions.json 

Fargate 用户可能需要像这样的长命令:

aws ecs register-task-definition \
    --family myapp \
    --cli-input-json file:///tmp/task.json \
    --requires-compatibilities FARGATE \
    --network-mode awsvpc \
    --cpu 1024 --memory 2048 \
    --task-role-arn <arn> --execution-role-arn <arn>

这是一个不需要 JQ 的完整版本:

NEW_TASK_DEFINTION=\$(aws ecs describe-task-definition --task-definition {task def} 
      --query '{  containerDefinitions: taskDefinition.containerDefinitions,
                  family: taskDefinition.family,
                  taskRoleArn: taskDefinition.taskRoleArn,
                  executionRoleArn: taskDefinition.executionRoleArn,
                  networkMode: taskDefinition.networkMode,
                  volumes: taskDefinition.volumes,
                  placementConstraints: taskDefinition.placementConstraints,
                  requiresCompatibilities: taskDefinition.requiresCompatibilities,
                  cpu: taskDefinition.cpu,
                  memory: taskDefinition.memory}')

aws ecs register-task-definition --cli-input-json "$NEW_TASK_DEFINTION"

添加到@sashokbg的答案中, register-task-definition 抱怨它需要 cpu 和 memory 值的字符串。 --query 命令使用 JMESPath 语法,它支持 to_string($arg) 类型转换,因此只需将这两个包装在 to_string() 中

如果您只想更新您的 ECS 集群以使用最新的镜像(带有“latest”的标签),这应该足够了:

aws ecs update-service --cluster your-cluster-name --service your-service-name --force-new-deployment

--force-new-deployment参数可以解决问题。

@oalagtash感谢您提供信息。 我会试试看。

此页面是否有帮助?
0 / 5 - 0 等级