Fn::FindInMap
内部函数 Fn::FindInMap
返回与 Mappings
部分声明的双层映射中的键对应的值。
声明
JSON
{ "Fn::FindInMap" : [ "
MapName
", "TopLevelKey
", "SecondLevelKey
"] }
YAML
完整函数名称的语法:
Fn::FindInMap: [
MapName
,TopLevelKey
,SecondLevelKey
]
短格式的语法:
!FindInMap [
MapName
,TopLevelKey
,SecondLevelKey
]
注意
您无法以简短形式嵌套两个函数的两个实例。
参数
- MapName
-
Mappings 部分中所声明映射的逻辑名称,包含密钥和值。
- TopLevelKey
-
顶层密钥名称。其值是一个键值对列表。
- SecondLevelKey
-
第二层密钥的名称,设置为分配给
TopLevelKey
的列表中的其中一个密钥。
返回值
分配给 SecondLevelKey
的值。
示例
以下示例说明如何使用 Fn::FindInMap
函数。
将区域特定的值与 Fn::FindInMap 一起使用
下面的示例显示了如何在具有以下特征的模板中使用 Fn::FindInMap
:具有包含单一映射 RegionMap
的 Mappings
部分,该映射将 AMI 与 AWS 地区关联起来。
-
该映射具有 5 个对应多个 AWS 区域的顶层密钥。
-
每个顶层密钥都分配有一个包含两个第二层密钥的列表,这两个密钥是
"HVM64"
和"HVMG2"
,与 AMI 的结构相对应。 -
每个第二层密钥都分配有一个适当的 AMI 名称。
该示例模板包含由 AWS::EC2::Instance
函数设置 ImageId
属性的 FindInMap
资源。
MapName
设置为所需的映射,在此示例中设置为 "RegionMap"
。TopLevelKey
设置为创建堆栈的区域,这是使用 "AWS::Region"
伪参数确定的。SecondLevelKey
设置为所需的架构,在此示例中为 "HVM64"
。
FindInMap
将返回分配给 FindInMap
的 AMI。对于 us-east-1 中的 HVM64 实例,FindInMap
将返回 "ami-0ff8a91507f77f867"
。
注意
考虑将 AWS Systems Manager 参数作为 Mappings
部分的备选。要避免每次要使用的 AMI 发生更改时都使用新 ID 来更新所有模板,请在创建或更新堆栈时使用 AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
参数类型来检索最新 AMI ID。常用 AMI 的最新版本也可作为 Systems Manager 中的公有参数提供。有关更多信息,请参阅 使用 CloudFormation 提供的参数类型引用现有的资源和 Systems Manager 参数。
JSON
{ ... "Mappings" : { "RegionMap" : { "us-east-1" : { "HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c" }, "us-west-1" : { "HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1" }, "eu-west-1" : { "HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435" }, "ap-southeast-1" : { "HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309" }, "ap-northeast-1" : { "HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d" } } }, "Resources" : { "myEC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "HVM64" ] }, "InstanceType" : "t2.micro" } } } }
YAML
Mappings: RegionMap: us-east-1: HVM64: "ami-0ff8a91507f77f867" HVMG2: "ami-0a584ac55a7631c0c" us-west-1: HVM64: "ami-0bdb828fd58c52235" HVMG2: "ami-066ee5fd4a9ef77f1" eu-west-1: HVM64: "ami-047bb4163c506cd98" HVMG2: "ami-0a7c483d527806435" ap-southeast-1: HVM64: "ami-08569b978cc4dfa10" HVMG2: "ami-0be9df32ae9f92309" ap-northeast-1: HVM64: "ami-06cd52961ce9f0d85" HVMG2: "ami-053cdd503598e4a9d" Resources: myEC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !FindInMap - RegionMap - !Ref 'AWS::Region' - HVM64 InstanceType: t2.micro
将 Fn::FindInMap 用于环境特定的配置
下面的示例演示了如何在具有包含单一映射 SecurityGroups
的 Mappings
部分的模板中使用 Fn::FindInMap
。它还包含一个 EnvironmentType
参数,让您能够指定环境是 Dev
还是 Prod
。该参数默认为 Dev
,但可以在创建堆栈期间覆盖。
Fn::FindInMap
会根据 EnvironmentType
参数返回相应的 SecurityGroupIds
。然后 Fn::Split
会将以逗号分隔的安全组 ID 字符串拆分成一个列表,后者是 SecurityGroupIds 预期的格式。
如果您在部署此堆栈时将 EnvironmentType
设置为 Dev
,则 EC2Instance
的 SecurityGroupIds
将为 sg-12345678
。如果将 EnvironmentType
设置为 Prod
,则将使用 sg-abcdef01
和 sg-ghijkl23
。
JSON
{ ... "Parameters":{ "EnvironmentType":{ "Description":"The environment type (Dev or Prod)", "Type":"String", "Default":"Dev", "AllowedValues":[ "Dev", "Prod" ] } }, "Mappings":{ "SecurityGroups":{ "Dev":{ "SecurityGroupIds":"sg-12345678" }, "Prod":{ "SecurityGroupIds":"sg-abcdef01,sg-ghijkl23" } } }, "Resources":{ "Ec2Instance":{ "Type":"AWS::EC2::Instance", "Properties":{ "ImageId": "ami-0a70b9d193ae8a799", "InstanceType": "t2.micro", "SecurityGroupIds":{ "Fn::Split":[ ",", { "Fn::FindInMap":[ "SecurityGroups", { "Ref":"EnvironmentType" }, "SecurityGroupIds" ] } ] } } } } }
YAML
Parameters: EnvironmentType: Description: The environment type (Dev or Prod) Type: String Default: Dev AllowedValues: - Dev - Prod Mappings: SecurityGroups: Dev: SecurityGroupIds: sg-12345678 Prod: SecurityGroupIds: sg-abcdef01,sg-ghijkl23 Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0a70b9d193ae8a799 InstanceType: t2.micro SecurityGroupIds: Fn::Split: - "," - Fn::FindInMap: [ SecurityGroups, !Ref EnvironmentType, SecurityGroupIds ]
支持的函数
您可以在 Fn::FindInMap
函数中使用以下函数:
-
Fn::FindInMap
-
Ref
相关资源
要使用其他内置函数或 Fn::FindInMap
函数中的默认值,您必须在模板中声明 AWS::LanguageExtensions
转换。有关更多信息,请参阅 Fn::FindInMap
enhancements。
在开发使用 Fn::FindInMap
函数的模板时,这些相关主题可能对您有所帮助。