2016-11-09 27 views
3

目前我正在将CFT从JSON转换为Yaml。一切工作正常,直到用户数据部分。我有困难时间使用任何像!Ref或!FindInMap在userdata部分的功能。如何使用!FindInMap in!Sub | userdata部分

的UserData:

Fn::Base64: !Sub | 
     #!/bin/bash -v 
     /command {Fn::FindInMap: [ "url", Ref: AWS::Region, Ref: EnvironmentType ] } 

这将是非常有益的,如果任何人都可以共享代码的任何片段。

回答

7

我一直在玩这个游戏。虽然the documentation表示Fn::Sub支持Fn::FindInMap,但没有使用示例,我试过各种引用和冒号的组合,但都没有成功,但我终于看到使用映射的功能性解决方案。下面应该工作:

Fn::Base64: !Sub 
    - |+ 
    #!/bin/bash -v 
    /command ${Url} 
    - Url: 
     Fn::FindInMap: 
     - UrlMap 
     - !Ref AWS::Region 
     - !Ref EnvironmentType 

在arg0中开始管道告诉YAML保留换行符和加告诉它保持一个换行符之后。 Arg1告诉它将Fn::FindInMap的结果替换为arg0中的Url。

以下较短的版本也应该工作:

Fn::Base64: !Sub 
    - |+ 
    #!/bin/bash -v 
    /command ${Url} 
    - Url: 
     Fn::FindInMap: [UrlMap, Ref: "AWS::Region", Ref: EnvironmentType] 

但你应该测试。请注意逗号,引号,并将其还原为Ref: s,而不是!Ref s。这可能告诉我们关于文件如何被预处理的一些事情,但我不确定那是什么。

我确信这个解决方案对于经验丰富的YAMLers是显而易见的,但是当所有这些YAMLy善良都添加到CloudFormation后,我才刚刚开始了解JSON。