Установка пакетов с помощью apt-get в файле CloudFormation
У меня есть следующий скрипт CloudFormation. Стек создается, запускается экземпляр Ec2, и я могу войти по SSH, но он не устанавливает пакеты.
Я не уверен, где это терпит неудачу. Я использую Ubuntu. Я не могу найти, где cfn-init установлен на моем экземпляре? Или он установлен только для Amazon Linux AMI?
Как мне решить эту проблему?
{
"Parameters" : {
"ShinyKey": {
"Description": "Key pair for instance.",
"Type": "AWS::EC2::KeyPair::KeyName"
}
},
"Resources": {
"Ec2Instance" : {
"Metadata": {
"AWS::CloudFormation::Init": {
"config": {
"packages": {
"apt": {
"r-base-dev": [],
"libcurl4-openssl-dev": [],
"git": []
}
}
}
}
},
"Type" : "AWS::EC2::Instance",
"Properties": {
"ImageId": "ami-9eaa1cf6",
"InstanceType": "t2.micro",
"KeyName": {"Ref": "ShinyKey"},
"SecurityGroups": [{"Ref": "InstanceSecurityGroup"}],
"Tags": [{
"Key": "Name",
"Value": "R-Shiny-Server"
}],
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash\n",
"/usr/local/bin/cfn-init --region ",
{
"Ref": "AWS::Region"
},
" -s ",
{
"Ref": "AWS::StackName"
},
" -r Ec2Instance\n"
]
]
}
}
}
},
"InstanceSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription" : "Enable SSH access via port 22, and ports 3838 and 80 for Shiny",
"SecurityGroupIngress" : [
{ "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" },
{ "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0" },
{ "IpProtocol" : "tcp", "FromPort" : "3838", "ToPort" : "3838", "CidrIp" : "0.0.0.0/0" }
]
}
}
}
}
2 ответа
Проблема с шаблоном выше в том, что cfn-init
не установлен в Ubuntu AMI, поэтому вызов cfn-init
в вашем скрипте user-data вернет "команда не найдена" и ничего не сделает.
Утилиты cfn-helper автоматически устанавливаются только в последней версии Amazon Linux AMI, как указано в документации. Для Ubuntu вам нужно установить их вручную, что можно сделать, добавив строку в существующий скрипт пользовательских данных, после "#!/bin/bash\n",
:
"apt-get update && apt-get install pip && pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
После этого звоните /usr/local/bin/cfn-init
в следующей строке должен работать правильно.
Вам необходимо включить атрибут Cloudformation Init в свойство Metadata экземпляра. Сценарий cfn-init использует эти метаданные, чтобы определить, какие действия следует предпринять при загрузке.
В вашем примере кода, похоже, вы даже не пытаетесь установить какие-либо пакеты, поэтому я не уверен, какой пакет вы ожидаете представить.