有没有办法向 ECS 任务定义添加新修订?
就我而言,我想使用命令行更新我的 CD 管道中的容器 URL。 要么缺少文档如何执行此操作,要么当前只能使用管理控制台?
请参阅https://github.com/aws/amazon-ecs-cli/issues/91 (但我没有使用 docker compose)
嗯,我不确定。 一般来说,与使用相关的问题的最佳位置是堆栈溢出,如我们的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 作为图像标签而不是“最新”时它也有效。 需要一些环境变量才能工作
``
设置 -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
进行了检查,但没有这样的实用程序:
我创建了这张票: 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。 它会自动更新合适的任务定义。
我已切换到 Fargate CLI。 它会自动更新合适的任务定义。
感谢分享 - 没看过。 期待检查出来。
如果您定义了卷,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感谢您提供信息。 我会试试看。
最有用的评论
谢谢@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}```