Служба ECS-автоматизация развертывания с помощью нового образа Docker


Я хочу, чтобы автоматизировать развертывание мое приложение, имея свой ФОВ запустить услугу, основанную на новейших образов Docker. Из того, что я прочитал, способ развертывания новой версии образа выглядит следующим образом:

  1. Создайте новую редакцию задачи (после обновления образа в репозитории Docker).
  2. обновите службу и укажите новую редакцию.

Это, кажется, работает,но я хочу сделать это через CLI, чтобы я мог написать сценарий. #2 кажется достаточно простым для выполнения через AWS CLI с update-service, но я не вижу способа сделать #1 без указания всей задачи JSON снова, как с register-task-definition (мой JSON будет включать учетные данные в переменные среды, поэтому я хочу, чтобы это было как можно меньше мест).

Так ли я должен автоматизировать развертывание обновлений службы ECS? И если да, то есть ли "хороший" способ заставить определение задачи запустить новую ревизию (т. е. без дублирования всего)?

2 17

2 ответа:

Да, это правильный подход.

И нет, с текущим 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. Одним из сервисов AWS SDK, которые дали бы лучше спокойствие.

Ответ, предоставленный Мэттом Каллананом, не сработал для меня: я получил ошибку в этой части:

--container-definitions "'$(echo $NEW_CONTAINER_DEFS)'"

Результат: ошибка синтаксического анализа параметра '-- container-definitions': Expected:'=', received: "' for input:

'{ окружающая среда: [ { и т. д....

Что я сделал, чтобы решить эту проблему, было:

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 и volumes из исходного документа json, потому что мое containerDefinition использует эти тома (так что это не нужно, если вы не используйте объемы).