使用CloudFormation映射为自定义资源拉姆达

使用CloudFormation映射为自定义资源拉姆达

问题描述:

环境变量我在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

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