Установка пакетов с помощью 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 использует эти метаданные, чтобы определить, какие действия следует предпринять при загрузке.

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

Другие вопросы по тегам