如何使用!FindInMap in!Sub | userdata部分

Ram*_*hna 4 amazon-web-services aws-cloudformation

目前我正在将CFT从JSON转换为Yaml.一切正常,直到Userdata部分.我很难在userdata部分使用任何函数,如!Ref或!FindInMap.

用户数据:

Fn::Base64: !Sub |
        #!/bin/bash -v
        /command {Fn::FindInMap: [ "url", Ref: AWS::Region, Ref: EnvironmentType ] } 
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ves 11

我一直在玩这个游戏和玩游戏.虽然文档说Fn::FindInMap支持Fn::Sub,但没有使用的例子,我尝试了各种引号和冒号的组合但没有成功,但我似乎终于使用映射找到了功能性解决方案.以下应该有效:

Fn::Base64: !Sub
  - |+
    #!/bin/bash -v
    /command ${Url}
  - Url:
      Fn::FindInMap:
        - UrlMap
        - !Ref AWS::Region
        - !Ref EnvironmentType
Run Code Online (Sandbox Code Playgroud)

arg0开头的管道告诉YAML保留换行符,加号告诉它以后保留换行符.Arg1告诉它Fn::FindInMap用arg0中的Url 替换结果.

以下较短版本也应该有效:

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

但你应该测试一下.注意逗号,引号和reversion到Ref:s而不是!Refs.这可能告诉我们一些文件是如何被预处理的,但我不确定那是什么.

我确信这个解决方案对于经验丰富的YAMLers来说是显而易见的,但是当我将所有这些YAMLy优点添加到CloudFormation时,我才开始关注JSON.