Есть ли способ добавить новую версию в определение задачи ECS?
В моем случае я хочу обновить 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
добавляет дополнительный слой словаря _и_ поля, которые недопустимы для использования с 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
Я думаю, что это следует снова открыть как запрос функции. В настоящее время интерфейс командной строки для обновления задач ECS, необходимый для CI / CD, не прост и требует дополнительных приемов.
Чаще всего в Интернете можно найти поток describe-task-definition
, получить от него определение контейнера, изменить параметр image
и вернуть его с помощью register-task-definition --family $FAMILY --container-definitions $UPDATED_DEFINITION
.
Используя Fargate, я столкнулся с проблемой с этим потоком - задача не могла быть обновлена с помощью того же JSON, для этого требовались дополнительные параметры, и мне в основном пришлось поместить все значения верхнего уровня из describe-task
JSON как register-task-definition
параметры (например, процессор, память и т. д.).
Поэтому лучшим решением для меня было использовать 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 в качестве тега изображения вместо "latest". Однако для работы требуются некоторые переменные среды.
`` ''
set -e
ECR_IMAGE = "$ {AWS_ACCOUNT_ID} .dkr.ecr. $ {AWS_DEFAULT_REGION} .amazonaws.com / $ {IMAGE_REPO_NAME}: $ {CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION = $ (aws ecs description-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 (.status) del (.requiresAttributes) | del (.compatibilities) ')
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 update-service --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://github.com/aws/aws-cli/issues/4401
поддержка 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 жалуется, что ему нужны строки для значений процессора и памяти. Команда --query использует синтаксис JMESPath, который поддерживает приведение типов to_string ($ arg), поэтому просто заключите эти два в to_string ()
Если вы просто хотите обновить свой кластер ECS, чтобы использовать последний образ (тег с «последним»), этого должно быть достаточно:
aws ecs update-service --cluster your-cluster-name --service your-service-name --force-new-deployment
Параметр --force-new-deployment
делает свое дело.
@oalagtash Спасибо за информацию. Я попытаюсь.
Самый полезный комментарий
Спасибо @ m-radzikowski. Я немного изменил ваше решение, чтобы оно также работало при использовании git hash в качестве тега изображения вместо "latest". Однако для работы требуются некоторые переменные среды.
`` ''
! / bin / bash
Скрипт для получения текущего определения задачи и на основе этого добавления нового адреса изображения ecr в старый шаблон и удаления атрибутов, которые не нужны, затем мы отправляем новое определение задачи, получаем новый номер версии из вывода и обновляем службу
set -e
ECR_IMAGE = "$ {AWS_ACCOUNT_ID} .dkr.ecr. $ {AWS_DEFAULT_REGION} .amazonaws.com / $ {IMAGE_REPO_NAME}: $ {CODEBUILD_RESOLVED_SOURCE_VERSION}"
TASK_DEFINITION = $ (aws ecs description-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 (.status) del (.requiresAttributes) | del (.compatibilities) ')
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 update-service --cluster $ {ECS_CLUSTER} --service $ {SERVICE_NAME} --task-definition $ {TASK_FAMILY}: $ {NEW_REVISION} `` `