Aws-cli: aws ecs - как обновить определение задачи

Созданный на 29 дек. 2017  ·  18Комментарии  ·  Источник: aws/aws-cli

Есть ли способ добавить новую версию в определение задачи ECS?

В моем случае я хочу обновить URL-адрес контейнера в моем конвейере компакт-диска с помощью командной строки. Либо отсутствует документация, как это сделать, либо это возможно только в настоящее время с помощью консоли управления?

см. https://github.com/aws/amazon-ecs-cli/issues/91 (но я не использую docker compose)

guidance

Самый полезный комментарий

Спасибо @ 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} `` `

Все 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 добавляет дополнительный слой словаря _и_ поля, которые недопустимы для использования с 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". Однако для работы требуются некоторые переменные среды.
`` ''

! / 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} `` `

Какой статус по этому поводу? как мы можем создать ревизию определения задачи? Думаю, будет что-то вроде:

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://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. Он автоматически обновляет подходящее определение задачи.

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 жалуется, что ему нужны строки для значений процессора и памяти. Команда --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 Спасибо за информацию. Я попытаюсь.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги