ECS Service - автоматизация развертывания с использованием нового изображения Docker
Я хочу автоматизировать развертывание моего приложения, запустив мою службу ECS с последним изображением Docker. Из того, что я прочитал, способ развертывания новой версии изображения выглядит следующим образом:
- Создайте новую ревизию задачи (после обновления изображения в репозитории Docker).
- Обновите службу и укажите новую версию.
Это похоже на работу, но я хочу сделать это через CLI, чтобы я мог script его. # 2, кажется, достаточно легко сделать через AWS CLI с update-service
, но я не вижу способа сделать # 1, не указав всю задачу JSON снова, как с помощью register-task-definition
(мой JSON будет включать учетные данные в среде переменные, поэтому я хочу иметь это как можно меньше мест).
Является ли это тем, как мне следует автоматизировать развертывание моих обновлений службы ECS? И если это так, есть ли "хороший" способ, чтобы определение задачи запускало новую ревизию (т.е. Без дублирования всего)?
Ответы
Ответ 1
Да, это правильный подход.
И нет, с текущим API вы не можете зарегистрировать новую версию существующего определения задачи, не дублируя ее.
Если вы не использовали CLI для генерации первоначального определения задачи (или не хотите повторно использовать исходные команды, которые сгенерировали его), вы можете попробовать что-то вроде следующего через CLI:
OLD_TASK_DEF=$(aws ecs describe-task-definition --task-definition <task_family_name>)
NEW_CONTAINER_DEFS=$(echo $OLD_TASK_DEF | jq '.taskDefinition.containerDefinitions' | jq '.[0].image="<new_image_name>"')
aws ecs register-task-definition --family <task_family_name> --container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"
Не 100% безопасно, поскольку последний аргумент команды --container-defintions
(который включает в себя записи "environment"
) будет по-прежнему отображаться через процессы, такие как ps
. Один из SDK AWS обеспечит лучшее спокойствие.
Ответ 2
Ответ, предоставленный Мэттом Каллананом, не помог мне: я получил ошибку в этой части:
--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"
Результат: Параметр анализа ошибок '--container-definition': Ожидаемый: '=', полученный: '' 'для ввода:
'{environment: [{etc и т.д.)
Что я сделал, чтобы решить эту проблему:
TASK_FAMILY=<task familiy name>
DOCKER_IMAGE=<new_image_name>
LATEST_TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition ${TASK_FAMILY})
echo $LATEST_TASK_DEFINITION \
| jq '{containerDefinitions: .taskDefinition.containerDefinitions, volumes: .taskDefinition.volumes}' \
| jq '.containerDefinitions[0].image='\"${DOCKER_IMAGE}\" \
> /tmp/tmp.json
aws ecs register-task-definition --family ${TASK_FAMILY} --cli-input-json file:///tmp/tmp.json
Я беру оба элемента containerDefinitions и томов из исходного json-документа, потому что мой containerDefinition использует эти тома (поэтому не нужно, если вы не используете тома).