在 CloudFormation 文件中使用 apt-get 安装包

Installing packages using apt-get in CloudFormation file

我有以下 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" }
            ]
        }
    }
}

}

您需要在实例的元数据 属性 中包含 Cloudformation Init attribute。 cfn-init 脚本使用此元数据来确定引导时应采取的操作。

虽然在您的示例代码中,您似乎甚至没有尝试安装任何包,所以我不确定您希望出现什么包。

上面模板的问题是 cfn-init 没有安装在 Ubuntu AMI 中,因此在您的用户数据脚本中调用 cfn-init 将 return "command not found"什么也不做。

cfn-helper 实用程序仅自动安装在最新的 Amazon Linux AMI 中,如 documentation 中所述。对于 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 的调用应该 运行 正确。