使用CloudFormation Mapping作为自定义资源lambda的环境变量

时间:2017-10-13 13:47:42

标签: amazon-web-services aws-lambda amazon-cloudformation

我在CloudFormation模板中有一个映射,让我们说它是:

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

现在我想将此映射作为环境变量传递给此模板中的lambda:

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

但这给了我错误:

  

模板包含错误:模板格式错误:未解析的资源   依赖关系[RegionMap]在模板的Resources块中

有什么方法可以让它发挥作用吗?

1 个答案:

答案 0 :(得分:3)

CloudFormation 映射部分数据仅用于使用内部函数Fn::FindInMap提取。这意味着您无法将整个映射对象作为环境变量发送。此外,无论上下文如何,环境变量始终是字符串。 CloudFormation必须以json或yaml或其他格式序列化这个对象,这可能就是为什么它不会让你这么做。

话虽这么说,你可以自己做,你可以复制映射并将其转换为json字符串(带有转义引号等),并将值作为环境变量传递。然后在Lambda代码中,您可以将其转换回对象。

如果您打算使用Lambda函数创建Custom Resource,则可以将整个JSON对象作为参数传递给资源。例如:

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