AWS CloudFormation用户数据传递

时间:2017-10-03 16:19:52

标签: amazon-web-services amazon-cloudformation

如何将参数输入数据传递给AWS cloudformation中的userdata。 示例:我有一个参数EnvType,我将通过" qa"作为运行CFT时此参数的输入。我想要这个参数值" qa"要读取并传递给userdata,以便我可以将它写入实例磁盘。

Parameters: {
    "EnvType": {
        "Description": "Environment type",
        "Type": "String",
        "AllowedValues": [
            "prod",
            "qa"
        ]
    }

我尝试在用户数据中使用它:

export STACK_TYPE='",
{
"Ref": "EnvType"
},
"'\n",
"echo \"$STACK_TYPE\" > stacktypes\n

我希望将此EnvType输入附加到实例中名为stacktypes的文件中。

2 个答案:

答案 0 :(得分:1)

您必须使用Fn::Join来实际"加入"用户数据字符串包含来自CloudFormation的其他内在函数的结果(例如Ref)。以下是它如何完成的例子:

...  
  "MyInstance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "UserData": {
        "Fn::Base64": {
          "Fn::Join": [
            "",
            [
              "#cloud-config\n\nrepo_upgrade: all\n\n\nwrite_files:\n- path: /root/init.sh\n  owner: root:root\n  permissions: '0755'\n  content: |\n    #!/bin/bash\n\n    EC2_INSTANCE_ID=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`\n    aws cloudformation signal-resource --stack-name ",
              {
                "Ref": "AWS::StackName"
              },
              " --status SUCCESS --logical-resource-id AutoScalingGroup --unique-id $EC2_INSTANCE_ID --region ",
              {
                "Ref": "AWS::Region"
              }
            ]
          ]
        }
      }
      ...
    }
  }
...

这可能是一项繁琐的工作,我们在内部开发了一个工具来处理UserData的生成,但我知道有一些开源工具可以提供帮助(例如:https://github.com/cloudtools/troposphere)。

答案 1 :(得分:1)

您可以将stack参数传递/附加到实例中的文件中。 如果您有这样的参数,

Parameters: {
"EnvType": {
    ...
}

您可以尝试将以下UserData添加到您的实例属性中。

   "Properties": {
      ...
      "UserData": {
        "Fn::Base64": {
          "Fn::Join": [
            "",
            [
              "#!/bin/bash -xe\",
              "echo ",
              {
                "Ref": "EnvType"
              },
              " >> /path/yourfile\n"
            ]
          ]
        }
      }
    }

这会将EnvType参数附加到您实例中的文件/path/yourfile