使用Ref作为Fn :: Sub内部函数的第一个参数

时间:2017-06-14 14:00:49

标签: amazon-web-services amazon-cloudformation

我在编译模板时遇到了很奇怪的问题,我在Fn::Sub中引用了一个字符串参数,而docs明确表示可以在{{{}}内部使用Ref函数。 1}}。这是一块模板:

Fn::Sub

这是我得到的错误:

  

模板错误:一个或多个Fn :: Sub内部函数没有指定   预期的论点。将字符串指定为第一个参数,并指定   可选的第二个参数,用于指定要替换的值的映射   字符串

当我使用完整符号:"Resources": { "LaunchConfiguration": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Properties" : { "UserData": { "Fn::Base64": { "Fn::Sub": { "Ref": "UserDataParam" } } }, 时,我得到完全相同的错误。有没有人有同样的问题?是否可以在使用参数时避免它?

4 个答案:

答案 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}