如何将参数输入数据传递给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的文件中。
答案 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
。