Я пытаюсь изменить шаблон стека CloudFormation кластера ECS.
Для начала я хочу просто скопировать той же конфигурации.
Исходный стек CloudFormation был создан ECS с помощью команды ecs-cli
:
ecs-cli configure --cluster test-cluster --region eu-central-1 --default-launch-type EC2 --config-name test-cluster-config
ecs-cli up --keypair Test --capability-iam --vpc $VPC --subnets $SUBNET_ID --security-group $SECURITY_GROUP_ID --size 1 --instance-type t2.micro --cluster-config test-cluster-config --force
Команды выше выполняются без проблем и настраивают кластер. Я успешно воссоздал этот кластер несколько раз и развернул на нем задачи ECS.
Однако , когда я пытаюсь изменить шаблон для стека без внесения каких-либо изменений в шаблон , операция обновления завершается ошибкой через некоторое время. Команды, которые я использую для обновления шаблона, следующие:
CFTEMP=$(mktemp ./jqXXXX.json)
aws cloudformation get-template --stack-name amazon-ecs-cli-setup-test-cluster | jq .TemplateBody | xargs -0 printf | tail -c +2 | head -c -3 > $CFTEMP
aws cloudformation update-stack --stack-name amazon-ecs-cli-setup-test-cluster --capabilities CAPABILITY_IAM --template-body "file://$CFTEMP"
Ссылка на содержимое $ CFTEMP (в пастбине) - https://pastebin.com/SxW0aJwa
Краткое описание кода выше (для людей, не владеющих Bash) следующее: создайте временный файл в текущей папке и сохраните имя в CFTEMP; получить шаблон AWS CF, извлечь TemplateBody из JSON (используя замечательный инструмент jq), преобразовать экранированные символы в теле в их действительные значения (например, \ n в новую строку), удалить 2 строки сверху и 3 строки снизу (что приводит к «разворачиванию» JSON) и сохранению вывода в $ CFTEMP; наконец, обновите шаблон стека данными из файла $ CFTEMP.
Для проверки шаблона я также выполняю следующий вызов validate-template
:
aws cloudformation validate-template --template-body "file://$CFTEMP"
Результаты команды validate-template: здесь (снова вставка), но суть - насколько я понимаю, ошибок нет, для этого шаблона требуется возможность IAM, и я предоставляю ее явно с --capabilities CAPABILITY_IAM
в команде update-stack
.
Теперь, наконец, то, что я ожидаю , произойдет после того, как стек обновлений будет обновлен. Вместо этого команда возвращает успех, однако спустя минуту журналы CloudFormation сообщают, что статусом стека является UPDATE_ROLLBACK_COMPLETE. Журналы заполнены состояниями CREATE_IN_PROGRESS, CREATE_COMPLETE, UPDATE_IN_PROGRESS и аналогичными, однако первой ошибкой является следующее загадочное сообщение:
1 validation error detected: Value '' at 'imageId' failed to satisfy constraint: Member must have length greater than or equal to 1 (Service: AmazonAutoScaling; Status Code: 400; Error Code: ValidationError; Request ID: <REDACTED>)
Более длинный список событий журнала можно увидеть
здесь (ссылка на Imgur).
Просто для записи, то же самое происходит, когда я пытаюсь выполнить обновление с помощью опции «Просмотр / редактирование в конструкторе шаблонов» в веб-интерфейсе AWS.
Вопрос : Как обновить шаблон стека CF из CLI? Я хочу добавить одну команду к части UserData шаблона, но сейчас я не могу даже обновить с помощью буквально того же шаблона.
Я могу предоставить дополнительную информацию, такую как полные журналы процесса обновления шаблона, а также полный вывод всех выполненных команд.