2016-11-09 75 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。