我在编译模板时遇到了很奇怪的问题,我在Fn::Sub
中引用了一个字符串参数,而docs明确表示可以在{{{}}内部使用Ref
函数。 1}}。这是一块模板:
Fn::Sub
这是我得到的错误:
模板错误:一个或多个Fn :: Sub内部函数没有指定 预期的论点。将字符串指定为第一个参数,并指定 可选的第二个参数,用于指定要替换的值的映射 字符串
当我使用完整符号:"Resources": {
"LaunchConfiguration": {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Properties" : {
"UserData": { "Fn::Base64": { "Fn::Sub": { "Ref": "UserDataParam" } } },
时,我得到完全相同的错误。有没有人有同样的问题?是否可以在使用参数时避免它?
答案 0 :(得分:1)
您无法在Fn :: Sub函数调用中直接使用Ref。要实现值映射,首先必须将Ref值分配给局部变量,并在Fn :: Sub字符串中使用该值。
"UserData": {
"Fn::Base64": {
"Fn::Sub": [
"${variable}",
{
"variable": {
"Ref": "myS3Bucket"
}
}]
}
}
答案 1 :(得分:1)
或者,可以直接替换而不使用单独的变量:
"UserData": {
"Fn::Base64": {
"Fn::Sub": "${myS3Bucket}"
}
}
关键是使用Fn::Sub
而不使用通常的方括号,如https://forums.aws.amazon.com/message.jspa?messageID=745085#745085
答案 2 :(得分:0)
您误读了文档。尽管文档确实说您可以使用Ref
函数,但是只有在第二个(可选)参数(键值映射)中可以使用它。
文档中给出的示例为:
{"Fn::Sub": ["www.${Domain}", {"Domain": {"Ref": "RootDomainName"}}]}
但是,如果需要替换为第一个参数,则必须使用美元符号。
要实现您想要的目标,应将代码重写为:
{"Fn::Sub": "${UserDataParam}"}
或在上下文中:
"UserData": {"Fn::Base64": {"Fn::Sub": "${UserDataParam}"}}
答案 3 :(得分:0)
如果您在元数据中编写 bash 脚本并遇到此错误,则示例代码中的选项 1 和 2 有效,但选项 3 无效,因为 "- |" 告诉子内在函数期待另一个 "- |" 如选项 1 所示,它应该提供值的映射(例如 - {某种映射} ) 来替换 {blablabla} 中的字符串。找不到第二个映射时,抛出错误。
Metadata:
AWS::CloudFormation::Init:
files:
##### use
'/dir/subdir':
content: !Sub
- |
{blablabla}
- {A mapping of some sort}
###### or
'/dir2/subdir2':
content: !Sub |
{blablabla}
##### But don't mix like so
'/dir3/subdir3':
content: !Sub
- |
{blablabla}