【问题标题】:Use CloudFormation Mapping as environment variable for custom resource lambda使用 CloudFormation 映射作为自定义资源 lambda 的环境变量
【发布时间】:2018-03-25 16:21:14
【问题描述】:

我在 CloudFormation 模板中有一个映射,假设是:

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

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

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

但这给了我错误:

模板包含错误。:模板格式错误:未解析的资源 模板资源块中的依赖项[RegionMap]

有什么办法让它工作吗?

【问题讨论】:

  • 您想将完整的映射传递给 Lambda 函数还是只传递给其中一个 AMI?
  • 完成映射。此映射的结构只是一个示例,与其实际内容无关。

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


【解决方案1】:

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" }
    }
  }
}

【讨论】:

  • 有趣。但是,如果我想在一个模板中的几个不同的 lambda 中使用这个映射呢?
  • 如果地图是静态的,您可以考虑在您的 Lambda 中对其进行硬编码。另一种解决方案(阅读技巧)是使用 CloudFormation 参数(用户输入)并将映射作为字符串传递,然后您可以在每个 Lambda 函数定义中“引用”它。您甚至可以将所需值设置为该参数的“默认值”。最后一个解决方案,如果您真正关心的是代码重用,您可以使用像 github.com/cloudtools/troposphere 这样的工具并动态生成您的模板,同时为每个 Lambda 定义使用相同的映射。
  • 将 map 作为参数的默认值传递的想法非常好。对于这个特别的想法 +1 并接受:) 谢谢!
猜你喜欢
  • 2021-02-18
  • 2021-05-11
  • 1970-01-01
  • 2019-08-02
  • 2020-11-03
  • 2018-04-30
  • 2017-07-23
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多