AWS Cloudformation:ConfigSets、UserData、Cloud-Init 之间的执行顺序

问题描述

我创建了一个模板,在其中创建了 EC2 实例,并使用 cfn-init 来处理配置集,并且在实例的 Userdata 部分,我编写了一些要由 cloud-init 执行的命令和一些要执行的命令没有云初始化。

我不确定哪些命令按哪个顺序运行? 我的意思是,命令的执行顺序是什么?例如:

  1. 配置集中的命令
  2. 用户数据的 cloud-init 部分中的命令
  3. 用户数据中的命令

我的部分代码如下:

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