Я использую стек AWS CloudFormation, который принимает некоторые параметры и запускает экземпляры EC2 вместе с другими ресурсами AWS. Параметры вводятся в пользовательские данные экземпляра EC2 и на основании этого динамически вносятся изменения в веб-приложение, находящееся в экземпляре EC2.

CFN Parameters

UserData: 
      Fn::Base64: 
        Fn::Join: 
          - ""
          - 
            - "#!/bin/bash \n"
            - "sh website-conf/website_mysql_config.sh "
            - " -c \""
            - 
              Ref: "CompanyName"

Как показано в примере выше, CompanyName является одним из многих параметров, передаваемых в сценарий пользовательских данных. Проблема в том, что при обновлении одного или нескольких параметров CloudFormation не обнаруживает это и вместо этого выдает эту ошибку.

CFN Error

Итак, чтобы обновить стек, мне нужно отредактировать стек и внести изменения в ASG, чтобы CloudFormation «увидела» изменения и выполнила обновление стека.

Есть ли способ заставить CFN обновлять стек при обновлении параметров?

11
captainblack 19 Окт 2017 в 09:52

3 ответа

Лучший ответ

Используйте команду AWS CLI Update-Stack. Если вы используете интерфейс командной строки AWS, вы можете вводить параметры в свой стек, поэтому любое изменение любого из параметров приводит к новому стеку. Я делаю это сам, чтобы вставить идентификатор коммита Git / версии в UserData, поэтому простая фиксация изменений в JSON / Yaml стека в Git позволит обновлять стек. Любое изменение в файле параметров позволит обновлять стек, даже просто комментарий. Я ссылаюсь на свой идентификатор коммита Git в UserData так же, как вы ссылаетесь на Ref: CompanyName, поэтому при изменении идентификатора коммита Git раздел userData обновляется при обновлении стека.

Обновить команду стека

aws cloudformation update-stack --stack-name MyStack --template-body file:///Users/Documents/Git/project/cloudformation/stack.json --parameters file:///Users/Documents/Git/project/cloudformation/parameters/stack-parameters.dev.json --capabilities CAPABILITY_IAM

< Сильный > Процесс

При таком подходе вы вносите изменения параметров в файл параметров json или yaml, а затем проверяете его в системе контроля версий. Теперь, если вы используете сервер сборки, вы можете обновить свой стек, проверив master и просто выполнив эту строку выше. Использование AWS CodeBuild упрощает эту задачу, поэтому вам не нужны дженкинсы.

5
Usman Mutawakil 20 Окт 2017 в 03:48

Ответ на вашу проблему уже дан ответ с этим состоянием, CloudFormation не будет обновлять стек, пока не произойдет изменение свойств ресурсов, уже созданных в стеке.

И для ответа на ваш вопрос, пожалуйста, проверьте объяснение ниже.

Есть способ заставить Cloudformation обновить стек, используя AWS::CloudFormation::Init. Используя cfn-init, каждый экземпляр может обновлять себя, когда обнаруживает изменение, внесенное AWS::CloudFormation::Init в метаданные.

Сначала мы должны понять концепцию, которая заключается в разнице между UserData и метаданными, по крайней мере, в случае AWS::CloudFormation::Init.

  • Userdata: будет вызываться только один раз, когда экземпляр запускается в первый раз (включая обновление, которое требует замены экземпляра). Таким образом, если вы обновите стек (не создавая новый), даже если вы измените значение параметра, он ничего не изменит, если вы вызовете параметр в UserData.
  • Metadata: может быть обновлено в любое время. Чтобы это работало, вы должны убедиться, что демон, обнаруживший измененные метаданные, работает (демон называется cfn-hup)

Если вы уже используете Metadata и AWS::CloudFormation::Init, данные обновляются не сразу. Насколько я знаю, вот условие, при котором данные будут изменены после изменения значения Metadata.

  • Перезагрузите экземпляр
  • Еще раз введите команду cfn-init со своим параметром
  • Ожидание около 15 минут, потому что демон, проверяющий изменение в Metadata, проверяет изменение один раз в 15 минут.
1
sin 21 Окт 2017 в 04:29

CloudFormation не будет обновлять стек, если не изменились свойства ресурсов , уже созданных в стеке.

Например: Предположим, у меня есть простой шаблон для создания базы данных, где мне нужно передать 2 параметра:

  1. дб имя
  2. область

Предположим, что я использую db-name, передавая его как значение DBInstanceIdentifier.

Также предположим, что я не использую входной параметр region для каких-либо целей при создании ресурсов (или его свойств) стека любым способом. Это скорее фиктивный параметр, который я сохраняю для удобства чтения.

Я передал (TEST-DB1, us-east-1) в качестве входных параметров в шаблон CloudFormation и успешно создал ресурсы.

< EM> Scenario-1: Теперь, если я обновлю стек ( все еще использую существующий шаблон ) и просто изменю входные параметры на (TEST-DB2, us-east-1). то есть: изменение только имени базы данных, а не региона. Затем CloudFormation обнаружит, что это обновление параметра приведет к изменению свойств работающих ресурсов стека, и вычислит и отобразит изменения в виде набора изменений.

< EM> Scenario-2: Предположим, я делаю другое обновление ( все еще использую существующий шаблон ) и просто изменяю входные параметры на (TEST-DB1, us-east-2). то есть: изменение только региона, а не имени db. Затем CloudFormation обнаружит, что это обновление параметра, в результате которого НЕТ изменений в свойствах запущенного (ых) ресурса (ов) стека, покажет Error creating change set.

< Сильный > < EM> Bottomline : Ваше изменение входного параметра должно привести к обновлению / замене любых ресурсов (или их атрибутов, таких как группы безопасности, порт и т. Д.) стека. Затем AWS CloudFormation отобразит их как Change Sets для вашего обзора. Кроме того, метод (обновление или замена), используемый AWS CloudFormation, зависит от того, какое свойство вы обновляете для данного типа ресурса.

Ваш параметр "CompanyName" не вносит никаких изменений в работающий ресурсы стека. Следовательно, он сообщает как Ошибка создания изменить набор . Вам необходимо использовать его для создания любых ресурсов / свойств ресурса стека. Затем CloudFormation обнаружит наборы изменений при их изменении. То же самое относится и к любым другим входным параметрам, которые вы используете.

9
Madhukar Mohanraju 19 Окт 2017 в 08:56