使用 CloudFormation Mapping 作为自定义资源 lambda 的环境变量
Use CloudFormation Mapping as environment variable for custom resource lambda
我在 CloudFormation 模板中有一个映射,假设它是:
"Mappings" : {
"RegionMap" : {
"us-east-1" : { "Name" : "Aaaa" },
"ap-northeast-1" : { "Name" : "Bbbb" }
}
}
现在我想将此映射作为环境变量传递给此模板中的 lambda:
"Environment": {
"Variables": {
"regions": {
"Ref": "RegionMap"
}
}
}
但这给了我错误:
Template contains errors.: Template format error: Unresolved resource
dependencies [RegionMap] in the Resources block of the template
有什么办法让它起作用吗?
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" }
}
}
}
我在 CloudFormation 模板中有一个映射,假设它是:
"Mappings" : {
"RegionMap" : {
"us-east-1" : { "Name" : "Aaaa" },
"ap-northeast-1" : { "Name" : "Bbbb" }
}
}
现在我想将此映射作为环境变量传递给此模板中的 lambda:
"Environment": {
"Variables": {
"regions": {
"Ref": "RegionMap"
}
}
}
但这给了我错误:
Template contains errors.: Template format error: Unresolved resource dependencies [RegionMap] in the Resources block of the template
有什么办法让它起作用吗?
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" }
}
}
}