Fn::Sub 在文字块中使用 Mapping 来指定用户数据脚本

use*_*385 2 amazon-web-services aws-cloudformation

好的,请阅读有关内部函数 Fn::Sub 的文档。我可以使用文字块来指定用户数据脚本。

UserData:
    "Fn::Base64":
    !Sub |
        #!/bin/bash -xe
        yum update -y aws-cfn-bootstrap
        /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}
        /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
Run Code Online (Sandbox Code Playgroud)

我可以使用映射将 ${Domain} 变量替换为 Ref 函数的结果值。

Name: !Sub
    - www.${Domain}
    - { Domain: !Ref RootDomainName }
Run Code Online (Sandbox Code Playgroud)

但是如果我需要在文字块内使用映射替代怎么办?例如:

"Fn::Base64": !Sub |
    <powershell>
        Write-host "My Domain is www.${Domain},{ Domain: !Ref RootDomainName }"
    </powershell>
Run Code Online (Sandbox Code Playgroud)

这个例子不起作用,而且我还没有找到可行的方法。有任何想法吗?第一个示例使用户数据脚本更容易编写并且看起来更干净,但是如果无法使用 !Ref 或 !Findinmap ,它的实用性就会大大降低。

有人有什么想法吗?

小智 6

由于我通过Google到达此页面,然后通过这里不同的措辞找到了解决方案(字面意思): How to use !FindInMap in !Sub | 用户数据部分

我添加它只是为了避免其他人进行一些沮丧的搜索。

本质上,您必须使用第二种语法编写示例,但更详细一些:

Fn::Base64:
  Fn::Sub:
    - |+
      <powershell>
        Write-host "My Domain is www.${Domain}"
      </powershell>
    - Domain:
        Fn::Ref: RootDomainName
Run Code Online (Sandbox Code Playgroud)

您也许可以稍微缩短它,但正如原始海报所说,请注意您的逗号、引用和简短形式的使用。

PS:如果第一个解决方案已经达到你的目的,你应该这样标记它。