首页 > 解决方案 > AWS Cloudformation:ConfigSets、UserData、Cloud-Init 之间的执行顺序

问题描述

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

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

  1. 配置集中的命令
  2. userdata 的 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

标签: amazon-web-servicesamazon-ec2amazon-cloudformation

解决方案


来自 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


推荐阅读