问题描述
我创建了一个模板,在其中创建了 EC2 实例,并使用 cfn-init 来处理配置集,并且在实例的 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 文档
用户数据: 可供实例使用的用户数据。更多 信息,请参阅启动时在 Linux 实例上运行命令 (Linux) 和添加用户数据 (Windows)。如果您正在使用命令 线工具,base64-encoding为你执行,你可以加载 文件中的文本。否则,您必须提供 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