如何在AWS CloudFormation模板的Mappings段创建并使用三级映射
CloudFormation三级映射查询实现方案
方案1:嵌套Fn::FindInMap + Fn::Get(无需调整原映射结构)
你可以先调用Fn::FindInMap查询前两级维度得到第三级的映射对象,再用Fn::Get取出对应第三维度的值,写法如下:
# 示例参数定义 Parameters: CellName: Type: String AllowedValues: [cell1, cell2] Domain: Type: String AllowedValues: [beta, prod] Realm: Type: String AllowedValues: [us-east-1, us-west-2, eu-west-1] # 原有三级映射结构无需修改 Mappings: ElastiCacheNodeTypeMapping: cell1: beta: us-east-1: cache.m6g.large us-west-2: cache.m6g.large eu-west-1: cache.m6g.2xlarge prod: us-east-1: cache.r6g.24xlarge cell2: beta: us-east-1: cache.m6g.large us-west-2: cache.m6g.large eu-west-1: cache.m6g.large prod: us-east-1: cache.r6g.24xlarge Resources: MyElastiCacheCluster: Type: AWS::ElastiCache::CacheCluster Properties: # 三级映射查询写法 CacheNodeType: !Get - !FindInMap [ElastiCacheNodeTypeMapping, !Ref CellName, !Ref Domain] - !Ref Realm # 其他属性省略
方案1优缺点
- 优点:原映射结构无需改动,层级清晰易维护
- 缺点:依赖
Fn::Get函数,仅兼容2019-09-09及之后版本的CloudFormation模板格式版本
方案2:扁平化映射为两级结构(兼容性最好)
你可以把前两个维度的key拼接为单个顶级key,将映射调整为原生支持的两级结构,直接用Fn::FindInMap查询即可:
# 调整后的两级映射结构 Mappings: ElastiCacheNodeTypeMapping: cell1#beta: us-east-1: cache.m6g.large us-west-2: cache.m6g.large eu-west-1: cache.m6g.2xlarge cell1#prod: us-east-1: cache.r6g.24xlarge cell2#beta: us-east-1: cache.m6g.large us-west-2: cache.m6g.large eu-west-1: cache.m6g.large cell2#prod: us-east-1: cache.r6g.24xlarge # 查询写法 CacheNodeType: !FindInMap - ElastiCacheNodeTypeMapping - !Sub "${CellName}#${Domain}" - !Ref Realm
方案2优缺点
- 优点:仅使用
Fn::FindInMap和Fn::Sub原生函数,兼容所有CloudFormation模板版本,报错排查更简单 - 缺点:需要调整原有映射结构,拼接的key可读性稍差
内容的提问来源于stack exchange,提问作者Rohit Lakhotia
相关产品推荐
相关产品推荐

