为什么 aws cloud formed 没有安装我指定的包?

为什么 aws cloud formed 没有安装我指定的包?

我对 AWS 服务还很陌生。我正在尝试使用 AWS 云形成,并创建了一个模板。该模板没有错误,我能够使用它来创建机器。

但我在模板中添加了一些配置,以便在启动时安装 tomcat、git 和其他东西。但这并没有发生在我身上。

下面是我用于安装 tomcat 的部分代码:

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

可是我登录机器的时候又tomcat没有git安装!

提前致谢。

答案1

我认为您遇到的问题是,cloud-init 与 cfn-init 不同。

  • 云初始化是作为 Ubuntu AWS AMI 的一部分推出的工具,用于解释实例元数据的 EC2 用户数据组件。Amazon Linux 也采用了此工具并将其内置到其 AMI 中。

  • cfn 初始化是另一个工具集的一部分,称为CloudFormation 帮助程序脚本由 AWS 创建亚马逊 Linux可以读取MetadataCloudFormation 模板中命名的附加部分。

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

然而,AWS 确实分发包您可以使用它来读取 CloudFormation 元数据。具体来说,请查看此模板有关如何使用 cloud-init 用户数据脚本安装 python-setuptools,请下载 CloudFormation Helper 脚本,使用 easy_install 安装它们,然后调用 cfn-init。

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

答案2

您需要调用 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 Stack 时,您可能需要进入第二页的高级设置(在提供参数之后),并确保将“出错时回滚”设置为“否”。这样,如果 cfn-init 脚本因任何原因失败,您可以 ssh 到实例并检查 /var/log/cfn-init.log 文件以获取更多信息。

答案3

以上答案是正确的。但您还应确保已成功安装 CloudFormation 帮助程序脚本。请按照http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-helper-scripts-reference.html了解安装详情。

答案4

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

相关内容