【发布时间】:2018-11-17 06:42:04
【问题描述】:
我有一些当前由独立 EC2 实例使用的用户数据脚本。 我希望能够将这些与 cloudformation 一起使用,并包括对“cfn-”帮助脚本的调用,以向 cloudformation 堆栈发出进度信号。 本质上,我希望能够在 userdata 脚本中添加一些数据,并在其中添加一些数据。 为此,我计划采用现有脚本并使用 sed 删除前导 shebang/script 行,并将稍作修改的脚本作为参数传递给 cloudformation。在作为参数传递之前,此脚本需要进行 base64 编码。我 base64 编码,然后根据 4096 字节大小(参数大小限制)进行拆分。我的 cloudformation 模板有 4 个“userdata”参数字段,我可以将数据传入其中。 这目前适用于现有脚本:
"UserData" : { "Fn::Join" : [ "", [ { "Ref" : "UserData" }, { "Ref" : "UserData2" }, { "Ref" : "UserData3" }, { "Ref" : "UserData4" }]]},
注意:这里我不必使用 base64 内部函数,因为各个参数已经经过 base64 编码。
我一直在尝试这个,但我收到了一个错误(显示在下面):
"UserData" : {
"Fn::Join": [
"", [
{ "Fn::Base64":
{ "Fn::Join": [
"", [
"#!/bin/bash\n",
{"Fn::Join": ["", ["AWS_REGION=",{ "Ref" : "AWS::Region" },"\n"]]},
{"Fn::Join": ["", ["STACKNAME=",{ "Ref" : "AWS::StackName" },"\n"]]},
"LAUNCHCONFIG=LaunchConfig\n",
"# # Signalling cloudformation\n",
{"Fn::Join": ["", ["/opt/aws/bin/cfn-init -v --stack ",{ "Ref" : "AWS::StackName" }," --resource LaunchConfig --region ",{ "Ref" : "AWS::Region" },"\n"]]},
]
]}
},
{ "Ref" : "UserData" },
{ "Ref" : "UserData2" },
{ "Ref" : "UserData3" },
{ "Ref" : "UserData4" },
{ "Fn::Base64":
{ "Fn::Join": [
"", [
{"Fn::Join": ["", ["/opt/aws/bin/cfn-signal -e $? --stack ",{ "Ref" : "AWS::StackName" }," --resource AutoScalingGroup --region ",{ "Ref" : "AWS::Region" },"\n"]]},
]
]}
}
]
]
},
收到的错误是:
UserData does not appear to be base64 encoded (Service: AmazonAutoScaling; Status Code: 400; Error Code: ValidationError
我想避免需要提前知道适当参数的情况 - 从而生成一个新的用户数据脚本,包括可以作为参数传递的详细信息 - 因为我想避免生成自定义用户数据文件专门用于 cloudformation。
我已经为四个“userdata”参数传入了空值,因此连接中的前导和尾随元素似乎没有经过 base64 编码。 我很感激对此的任何见解,或者我如何完成我所描述的。
【问题讨论】:
标签: amazon-web-services amazon-cloudformation