amazon-web-services - AWS Cloudformation:ConfigSets、UserData、Cloud-Init 之间的执行顺序
问题描述
我创建了一个模板,在其中创建了 EC2 实例,并使用 cfn-init 来处理配置集,在实例的 Userdata 部分,我编写了一些由 cloud-init 执行的命令和一些在没有 cloud 的情况下执行的命令-在里面。
我不确定哪些命令按哪个顺序运行?我的意思是,命令的执行顺序是什么?例如:
- 配置集中的命令
- userdata 的 cloud-init 部分中的命令
- 用户数据中的命令
我的部分代码如下:
UserData:
Fn::If:
- DatadogAgentEnabled
-
Fn::Base64: !Sub |
#!/bin/bash -xe
yum update -y
yum update -y aws-cfn-bootstrap
/opt/aws/bin/cfn-init --stack ${AWS::StackName} --resource GhostServer --configsets prepare_instance_with_datadog --region ${AWS::Region}
/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource GhostServer --region ${AWS::Region}
#cloud-config <----cloud-init section inside the Userdata
runcmd:
- [ sh, -c, "sed 's/api_key:.*/api_key: {DatadogAPIKey}/' /etc/datadog-agent/datadog.yaml.example > /etc/datadog-agent/datadog.yaml" ]
- systemctl restart datadog-agent
解决方案
来自 AWS 文档
UserData :要对实例可用的用户数据。有关更多信息,请参阅启动时在 Linux 实例上运行命令 (Linux) 和添加用户数据 (Windows)。如果您使用的是命令行工具,则会为您执行 base64 编码,您可以从文件中加载文本。否则,您必须提供 base64 编码的文本。用户数据限制为 16 KB。
所以基本上我们定义UserData
在我们的 EC2 实例启动时执行一些命令。
参考:https ://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html
要回答您的问题,首先UserData
将执行所有命令,并且本节中指定的所有命令将按顺序执行,因此在您的示例中,您首先调用 cfn 帮助程序脚本,然后调用 cloud init,因此将首先应用配置集,然后调用 cloud init 命令.
在该UserData
部分中,我们正在调用 cfn 帮助程序脚本,该脚本读取 cloudformation 模板元数据并执行configsets
下定义的所有AWS::CloudFormation::Init:
从 AWS 文档:
cfn-init 帮助程序脚本从 AWS::CloudFormation::Init 键读取模板元数据并采取相应措施:
从 AWS CloudFormation 获取和解析元数据
安装包
将文件写入磁盘
启用/禁用和启动/停止服务
参考:https ://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html
推荐阅读
- python - 使用 [-1] 获取列的最后一行?
- hadoop - 如何将 YARN 应用程序日志保存在本地文件系统而不是 HDFS 中?
- python - 如何在 Python Dataframe 中选择具有基于使用列的函数的条件的行
- android - 多次调用observe()
- python - Python JSON TypeError:列表索引必须是整数或切片,而不是str
- jquery - 我无法使用 jquery、node、js 和 mysql 数据库在输入文本框的下拉列表中获取自动完成功能的值列表
- java - Apache POI Word 获取表中每页的最后一行索引
- r - 如何从 r 中的大图像文件夹中采样一小组图像以训练模型?
- python - 使用 TCPS 连接 - ora-28759:无法打开文件
- javascript - 将事件发射到外部组件文件夹中?我已经做了一些事情,但它没有听发射事件“功能”?