为什么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

您是否尝试过删除“ git”:[]之后的“,”?这在语法上是不正确的。
Edwin

Answers:


23

我相信这里的问题是关于cloud-init与cfn-init不同的困惑。

  • cloud-init是作为Ubuntu AWS AMI的一部分启动的工具,该工具允许解释实例元数据的EC2用户数据组件。Amazon Linux也采用了此工具并将其内置到其AMI中。

  • cfn-init是由AWS为Amazon Linux创建的名为CloudFormation Helper脚本的其他工具集的一部分,该工具集可以读取CloudFormation模板中命名的其他部分。Metadata

因此,Ubuntu和Amazon Linux AMI都预先安装了cloud-init工具来访问用户数据,但是只有Amazon Linux 预先安装了CloudFormation Helper脚本,例如cfn-init来访问CloudFormation元数据。

但是,AWS确实分发了可用于读取CloudFormation元数据的软件包。具体来说,请查看此模板,以了解如何使用cloud-init用户数据脚本来安装python-setuptools,下载CloudFormation帮助程序脚本,使用easy_install安装它们,然后调用cfn-init。

注意:还有其他发行版或AMI可能支持cloud-init或cfn-init,但这里仅介绍一般情况。


12

您需要在实例的UserData属性内调用cfn-init(http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html):

{
    "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文件以获取更多信息。


我认为这个应该是公认的答案。
Erik van Brakel 2014年


-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",

4
我不明白...
Pierre.Vriens
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.