2017-10-13 124 views
0

環境變量我在CloudFormation模板中的映射,讓我們說它是:使用CloudFormation映射爲自定義資源拉姆達

"Mappings" : { 
    "RegionMap" : { 
     "us-east-1" : { "Name" : "Aaaa" }, 
     "ap-northeast-1" : { "Name" : "Bbbb" } 
    } 
} 

現在我想這個映射爲一個環境變量傳遞給在該拉姆達模板:

"Environment": { 
    "Variables": { 
      "regions": { 
       "Ref": "RegionMap" 
      } 
    } 
    } 

但是,這給我的錯誤:

Template contains errors.: Template format error: Unresolved resource dependencies [RegionMap] in the Resources block of the template

有什麼辦法讓它工作?

+0

是否要將完整映射傳遞給Lambda函數或只有一個AMI? –

+0

完整的映射。這種映射的結構只是一個與其實際內容無關的例子。 – Andremoniy

回答

2

CloudFormation映射部分數據僅意味着使用固有函數Fn::FindInMap進行提取。這意味着您將無法將整個映射對象作爲環境變量發送。除此之外,不管環境如何,環境變量總是字符串。 CloudFormation將不得不序列化JSON或YAML或者其他格式此對象,這可能是爲什麼它不會讓你這麼做。

話雖這麼說,你可以這樣做你自己,你可以複製的映射,並將其轉換爲一個JSON字符串(與轉義引號,等等),並通過該值作爲一個環境變量。然後在您的Lambda代碼中,您可以將其轉換回對象。

如果你的目的是爲了創造一個Custom Resource你的lambda表達式,那麼你可以通過整個JSON對象作爲參數傳遞給資源。例如:

"AMIInfo": { 
    "Type": "Custom::AMIInfo", 
    "Properties": { 
    "ServiceToken": { "Fn::GetAtt" : ["AMIInfoFunction", "Arn"] }, 
    "RegionMap" : { 
     "us-east-1" : { "Name" : "Aaaa" }, 
     "ap-northeast-1" : { "Name" : "Bbbb" } 
    } 
    } 
} 
+0

有趣。但是如果我想在一個模板中的幾個不同的lambda上使用這張地圖? – Andremoniy

+1

如果地圖是靜態的,你可以考慮很難在你的Lambda表達式對其進行編碼。另一個解決方案(讀取黑客)將使用CloudFormation參數(用戶輸入)並將該地圖作爲字符串傳遞,然後您可以在每個Lambda函數定義中「引用」它。您甚至可以將所需值設置爲該參數的「默認值」。最後的解決方案,如果你真的關心的是代碼重用,你可以使用像https://github.com/cloudtools/troposphere這樣的工具,併爲每個Lambda定義使用相同的地圖動態生成模板。 –

+0

有關將地圖作爲參數的默認值傳遞的想法非常好。對於這個特定的想法+1並接受:)謝謝! – Andremoniy