为什么 aws 云编队不安装我指定的软件包?

bat*_*man 14 ubuntu tomcat amazon-web-services amazon-cloudformation

我对 AWS 服务很陌生。我正在尝试使用 AWS 云格式并创建了一个模板。该模板没有错误,我可以使用它创建机器。

但是我在模板中添加了一些配置,以便在启动期间安装 tomcat、git 和其他东西。但这不会发生在我身上。

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

"Resources": {
    "Tomcat": {
        "Type": "AWS::EC2::Instance",
        "Metadata": {
            "AWS::CloudFormation::Init": {
                "config": {
                    "packages": {
                        "apt": {
                            "tomcat6": [],
                            "git": [],
                        }
                    }
                }
            }
        },
Run Code Online (Sandbox Code Playgroud)

但是当我登录机器时既tomcat没有git也没有安装!

提前致谢。

dia*_*0ne 23

我相信您的问题是关于 cloud-init 与 cfn-init 不同的混淆。

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

  • cfn-init是AWS 为Amazon Linux创建的名为CloudFormation 帮助程序脚本的不同工具集的一部分,它可以读取您的 CloudFormation 模板中命名的附加部分。Metadata

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

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

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


And*_*anu 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"
                        ]]
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

UserData 属性采用 Base64 编码,允许您指定应在实例启动时运行的脚本。在这里,您可以调用 cfn-init,它将读取 CloudFormation::Init 元数据并设置其中指定的所有内容。

此外,在创建 CF 堆栈时,您可能希望进入第二页上的高级设置(在提供参数之后)并确保错误回滚设置为“否”。这样,如果 cfn-init 脚本因任何原因失败,您可以通过 ssh 连接到实例并检查 /var/log/cfn-init.log 文件以获取更多信息。