Почему формирование облака aws не устанавливает указанные мной пакеты?

14

Я очень плохо знаком с сервисами AWS. Я пытаюсь использовать облачные сервисы AWS и создал шаблон. Шаблон без ошибок, и я могу создавать машины, используя это.

Но я добавил некоторые конфигурации в шаблон, чтобы он устанавливал tomcat, git и другие вещи во время запуска. Но этого не происходит для меня.

Вот часть кода, которую я использовал для установки tomcat:

"Resources": {
    "Tomcat": {
        "Type": "AWS::EC2::Instance",
        "Metadata": {
            "AWS::CloudFormation::Init": {
                "config": {
                    "packages": {
                        "apt": {
                            "tomcat6": [],
                            "git": [],
                        }
                    }
                }
            }
        },

Но когда я захожу в машину ни то, tomcatни другое не gitустановлено!

Заранее спасибо.

Бэтмен
источник
Я предполагаю из ваших тегов, что это Ubuntu AMI?
Mattdm
Вы пытались удалить "," после "мерзавец": []? Это не синтаксически правильно.
Эдвин

Ответы:

23

Я полагаю, что ваша проблема здесь - путаница вокруг того, что cloud-init отличается от cfn-init.

  • cloud-init - это инструмент, который был запущен как часть AMI Ubuntu AWS, который позволяет интерпретировать компонент пользовательских данных EC2 метаданных экземпляра. Amazon Linux также приняла этот инструмент и встроила его в свой AMI.

  • cfn-init является частью другого набора инструментов под названием CloudFormation Helper Scripts, созданного AWS для Amazon Linux, который может читать дополнительный раздел, указанный Metadataв вашем шаблоне CloudFormation.

Итак, в Ubuntu и Amazon Linux AMI предустановлены инструменты cloud-init для доступа к пользовательским данным, но только в Amazon Linux предустановлены вспомогательные сценарии CloudFormation, например cfn-init для доступа к метаданным CloudFormation.

Однако AWS распространяет пакеты , которые можно использовать для чтения метаданных CloudFormation. В частности, посмотрите на этот шаблон, чтобы узнать, как использовать скрипт пользовательских данных cloud-init для установки python-setuptools, загрузить вспомогательные сценарии CloudFormation, установить их с помощью easy_install, а затем вызвать cfn-init.

Примечание. Существуют другие дистрибутивы или AMI, которые могут поддерживать cloud-init или cfn-init, но здесь я просто рассмотрю общие случаи.

dialt0ne
источник
12

Вам нужно вызвать cfn-init ( http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html ) внутри свойства UserData экземпляра:

{
    "Resources": {
        "Tomcat": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "config": {
                        "packages": {
                            "apt": {
                                "tomcat6": [],
                                "git": []
                            }
                        }
                    }
                }
            },
            "Properties": {
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": ["", [
                            "#!/bin/bash\n",
                            "/opt/aws/bin/cfn-init -s ", {
                                "Ref": "AWS::StackName"
                            },
                            "    -r Tomcat",
                            "    --region ", {
                                "Ref": "AWS::Region"
                            }, "\n"
                        ]]
                    }
                }
            }
        }
    }
}

Свойство UserData имеет кодировку Base64 и позволяет указать сценарий, который должен запускаться при запуске экземпляра. Здесь вы можете вызвать cfn-init, который прочитает метаданные CloudFormation :: Init и настроит все, что там указано.

Также при создании стека CF вам может потребоваться перейти к дополнительным настройкам на второй странице (после задания параметров) и убедиться, что для параметра Откат при ошибке установлено значение «Нет». Таким образом, если сценарий cfn-init завершается неудачей по какой-либо причине, вы можете подключиться к экземпляру ssh и проверить файл /var/log/cfn-init.log для получения дополнительной информации.

Андрей Фирбинтеану
источник
Я думаю, что этот должен быть принятым ответом.
Эрик ван Бракель
-3
    "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
      "#!/bin/bash\n",
      "export DEBIAN_FRONTEND=noninteractive\n",
      "apt-get update && apt-get upgrade -y\n",
      "apt-get -y install python-setuptools\n",
      "easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
      "/usr/local/bin/cfn-init --stack ", { "Ref":"AWS::StackName" }, " --resource <REPLACE_WITH_RESOURCENAME>", " --region ", { "Ref": "AWS::Region" }, "\n",
Nic
источник
4
Я не понимаю ...
Pierre.Vriens