Cloudformation Init 的 Cloudformation 输出

4

我有一个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"
                        }
                    }
 ...

我需要在EC2实例启动后运行此命令,然后将此init脚本输出设置到cloudformation堆栈中。如何实现?"最初的回答"

你说的“在CloudFormation中输出”是什么意思?你想知道它是否成功,还是想看到stdout的输出? - kichik
您是否正在寻找使用CloudFormation模板部署用户数据的方法?https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html - shantanuo
@kichik 我想在AWS CloudFormation控制台中查看标准输出(stdout)的堆栈输出(stack outputs)。 - ColossusMark1
我们需要输出多大的结果? - kichik
我正在运行一个脚本来创建随机的用户名和密码,我需要展示它的输出。 - ColossusMark1
也许如果您告诉我们用例,我们可以提供帮助。尝试在EC2中获取脚本的输出并传递给CloudFormation,为什么不尝试使用AWS Secrets Manager来管理数据库用户和密码?此外,您还可以创建一个Lambda函数来生成随机的用户和密码,并将它们存储在AWS Secrets Manager中,然后通过响应数据将所需数据传回CloudFormation。 - dheeraj tripathi
3个回答

10
有点晚了,但除了之前的答案之外...
在EC2实例创建时,AWS::CloudFormation::Init 的输出无法通过 Cloudformation 访问。
但是,在已启动的 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 Agent(而不是Cloudwatch Logs Agent!)的信息。使用Cloudwatch Agent的好处是它还可以将自定义指标流式传输到Cloudwatch Metrics(例如内存使用情况、应用程序指标、数据库指标等)。

对于已运行的EC2实例,请考虑查看这里的cfn-hup。

另一种选择是按照这里的说明使用SSM(系统管理器)将代理推送到已运行的实例上。


3

在您的问题评论中,有一些有效的观点可以推动您朝着正确的解决方案前进。总体来说,您尝试做的事情是不可能的 - 没有 AWS::CloudFormation::Init 资源的输出。它们在堆栈创建时间不会被评估,只是在 EC2 实例启动时存储和处理,但这并不是 CloudFormation 堆栈运行的时间(也可能是,但并不总是-以自动缩放组为例)。


0
根据this文档 - 输出的值可以包括文字、参数引用、伪参数、映射值或内在函数。
鉴于此,AWS::CloudFormation::Init是CloudFromation元数据特定类型,但不是文字、参数、伪参数、映射值或内在函数。
因此,您试图实现的似乎是作为CloudFormation输出限制的 :(

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接