附加/附加到传递给cloudformation的用户数据?
Posted
技术标签:
【中文标题】附加/附加到传递给cloudformation的用户数据?【英文标题】:appending/prepending to userdata passed to cloudformation? 【发布时间】: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 编码。 我很感激对此的任何见解,或者我如何完成我所描述的。
【问题讨论】:
【参考方案1】:如果我理解,您传递的用户数据已经过 base64 编码。我认为您的设置不正确。 userdata 参数的值不应预先编码。它应该是纯文本。 Cloudformation 进行编码。它需要被编码为交付给 EC2 实例,而不是在配置中。您应该加入纯文本。
否则,请从脚本中删除 Fn::Base64 块。那可能会解决它。虽然这只是一个直接的猜测。
【讨论】:
我很确定这包含一个不错的答案。但是您可能希望突出显示回答部分并将其余部分移至评论中(即使没有评论权限,您也可以在自己的帖子中执行此操作)。【参考方案2】:我通常会看到:
"UserData":
"Fn::Base64":
"Fn::Join": [
"",
[
尽量保持base64转换为最外层,内层脚本不被编码。
【讨论】:
谢谢约翰。通过参数传入 cloudformation 的用户数据已经 base64 编码。我不知道有一种方法可以传递尚未经过 base64 编码的数据。我发布的第一个代码块显示可以将单独的 base64 参数组装到一个 userdata 脚本中。这行得通。与后面的代码块的区别 - 以及我遇到问题的地方 - 是连接在 cloudformation 模板中生成的 base64 编码字符串块不起作用。 约翰,我不确定这是否是一个答案。您能否改写一下以使回答部分更明显?如果它是一个答案,它还可以使用一些额外的解释。以上是关于附加/附加到传递给cloudformation的用户数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CloudFormation 模板中将预上传的 SSL 证书附加到 ELB?
如何使用 Cloudformation 将 lambda 函数附加到现有 API 网关
AWS:使用 cloudformation 模板将 WAF 附加到 api 网关
如何通过 Cloudformation 将弹性 IP 附加到 Nat 网关