1

我有一个 CloudFormation 堆栈,如下所示,

  "Metadata" : {
            "AWS::CloudFormation::Init" : {
                "config" : {

                        "/home/ec2-user/create_db_user.sh" : {
                            "source" :                             

   "http://s3.amazonaws.com/devops/create_db_user.sh",
                            "mode" : "000755",
                            "owner" : "ec2-user"
                        }
                    }
 ...

在我需要将此初始化脚本输出设置到 cloudformation 堆栈之后,我需要在 EC2 实例启动时运行此命令。

我怎么能这样。

4

3 回答 3

8

派对有点晚了,但除了之前的答案......

AWS::CloudFormation::Init无法通过 Cloudformation 访问 at EC2 实例创建的输出。

但是,在已启动的 EC2 实例上,您会发现AWS::CloudFormation::Init(又名cfn-init)和用户数据(cloud-init)的日志。

在 Amazon Linux 上,其结构如下:

  • /var/log/cfn-init-cmd.log:cfn-init 和带有时间戳的命令输出
  • /var/log/cfn-init.log:cfn-init 和命令输出
  • /var/log/cloud-init.log:与运行用户数据中的命令有关的云初始化日志
  • /var/log/cloud-init-output.log:用户数据命令本身的输出

访问这些日志的最简单方法是将日志流式传输到 Cloudwatch Logs,这将使您能够按时间和内容搜索和过滤日志。还可以考虑使用 Cloudwatch Insights 进行搜索和过滤——它具有更全面、更易于理解的搜索、过滤甚至简单可视化(图表)语法。

鉴于您已经在使用 cfn-init,您可以在此处找到有关如何安装新的 Cloudwatch 代理(不是 Cloudwatch 日志代理!)的信息。使用 Cloudwatch 代理的好处是它还可以将自定义指标流式传输到 Cloudwatch 指标(例如内存使用情况、应用程序指标、数据库指标等)。

对于已经运行的 EC2 实例,请考虑查看cfn-hup 此处

另一种方法是使用 SSM(系统管理器)按照此处的说明将代理推送到已运行的实例上。

于 2019-06-08T11:12:09.870 回答
3

在对您的问题的评论中,有一些有效的观点可以促使您找到正确的解决方案。通常,您尝试做的事情是不可能的-没有AWS::CloudFormation::Init资源输出。它们不会在堆栈创建时进行评估,只是由 EC2 实例在其启动时存储和处理,但这不是 CloudFormation 堆栈运行的时间(可能是,但并非总是如此 - 以 Auto Scaling 组为例)。

于 2019-04-09T07:22:56.050 回答
0

根据文档 - 输出的值可以包括文字、参数引用、伪参数、映射值或内在函数。

鉴于此,AWS::CloudFormation::Init它是 CloudFromation 元数据特定类型,但不是文字、参数、伪参数、映射值或内在函数。

因此,您要实现的目标似乎是 CloudFormation 输出限制:(

@m-jensen答案列出了许多合适的解决方法。

于 2020-03-04T14:52:34.100 回答