这是新的《AWS CloudFormation 模板参考指南》。请更新您的书签和链接。有关开始使用 CloudFormation 的帮助,请参阅《AWS CloudFormation 用户指南》https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html。
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:AWSInstanceType2Arch 和 AWSRegionArch2AMI。此外还包括一个允许在 t3.micro 和 t4g.nano 之间进行选择的 InstanceType 参数。默认为 t3.micro,但可以在创建堆栈期间覆盖。
Fn::FindInMap 首先根据选定的实例类型确定架构(HVM64 或 ARM64),然后在当前 AWS 区域 查找该架构的正确 AMI ID。
注意
这些示例中显示的 AMI ID 是演示用的占位符。应尽量考虑使用 AWS Systems Manager 参数的动态引用,作为 Mappings 部分的替代方案。要避免每次要使用的 AMI 发生更改时都使用新 ID 来更新所有模板,请在创建或更新堆栈时使用 AWS Systems Manager 参数来检索最新 AMI ID。常用 AMI 的最新版本也可作为 Systems Manager 中的公有参数提供。有关更多信息,请参阅使用动态引用获取存储在其他服务中的值。
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "InstanceType": { "Description": "The EC2 instance type", "Type": "String", "AllowedValues": [ "t3.micro", "t4g.nano" ], "Default": "t3.micro" } }, "Mappings": { "AWSInstanceType2Arch": { "t3.micro": { "Arch": "HVM64" }, "t4g.nano": { "Arch": "ARM64" } }, "AWSRegionArch2AMI": { "us-east-1" : { "HVM64" : "ami-12345678901234567", "ARM64" : "ami-23456789012345678" }, "us-west-1" : { "HVM64" : "ami-34567890123456789", "ARM64" : "ami-45678901234567890" }, "eu-west-1" : { "HVM64" : "ami-56789012345678901", "ARM64" : "ami-67890123456789012" }, "ap-southeast-1" : { "HVM64" : "ami-78901234567890123", "ARM64" : "ami-89012345678901234" }, "ap-northeast-1" : { "HVM64" : "ami-90123456789012345", "ARM64" : "ami-01234567890123456" } } }, "Resources" : { "MyEC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "InstanceType" : { "Ref": "InstanceType" }, "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ]}] } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Parameters: InstanceType: Description: The EC2 instance type Type: String AllowedValues: - t3.micro - t4g.nano Default: t3.micro Mappings: AWSInstanceType2Arch: t3.micro: Arch: HVM64 t4g.nano: Arch: ARM64 AWSRegionArch2AMI: us-east-1: HVM64:ami-12345678901234567ARM64:ami-23456789012345678us-west-1: HVM64:ami-34567890123456789ARM64:ami-45678901234567890eu-west-1: HVM64:ami-56789012345678901ARM64:ami-67890123456789012ap-southeast-1: HVM64:ami-78901234567890123ARM64:ami-89012345678901234ap-northeast-1: HVM64:ami-90123456789012345ARM64:ami-01234567890123456Resources: myEC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: !Ref InstanceType ImageId: Fn::FindInMap: - AWSRegionArch2AMI - Ref: AWS::Region - Fn::FindInMap: - AWSInstanceType2Arch - Ref: InstanceType - Arch
将 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
{ "AWSTemplateFormatVersion": "2010-09-09", "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": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}", "InstanceType": "t2.micro", "SecurityGroupIds":{ "Fn::Split":[ ",", { "Fn::FindInMap":[ "SecurityGroups", { "Ref":"EnvironmentType" }, "SecurityGroupIds" ] } ] } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Parameters: EnvironmentType: Description: The environment type (Dev or Prod) Type: String Default: Dev AllowedValues: - Dev - Prod Mappings: SecurityGroups: Dev: SecurityGroupIds:sg-12345678Prod: SecurityGroupIds:sg-abcdef01,sg-ghijkl23Resources: Ec2Instance: Type: AWS::EC2::Instance Properties: ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}' 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 函数的模板时,这些相关主题可能对您有所帮助。
-
《AWS CloudFormation 用户指南》中的 CloudFormation 模板 Mappings 语法