Fn::FindInMap - AWS CloudFormation

这是新的《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::FindInMapAWSInstanceType2ArchAWSRegionArch2AMI。此外还包括一个允许在 t3.microt4g.nano 之间进行选择的 InstanceType 参数。默认为 t3.micro,但可以在创建堆栈期间覆盖。

Fn::FindInMap 首先根据选定的实例类型确定架构(HVM64ARM64),然后在当前 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-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

将 Fn::FindInMap 用于环境特定的配置

下面的示例演示了如何在具有包含单一映射 SecurityGroupsMappings 部分的模板中使用 Fn::FindInMap。它还包含一个 EnvironmentType 参数,让您能够指定环境是 Dev 还是 Prod。该参数默认为 Dev,但可以在创建堆栈期间覆盖。

Fn::FindInMap 会根据 EnvironmentType 参数返回相应的 SecurityGroupIds。然后 Fn::Split 会将以逗号分隔的安全组 ID 字符串拆分成一个列表,后者是 SecurityGroupIds 预期的格式。

如果您在部署此堆栈时将 EnvironmentType 设置为 Dev,则 EC2InstanceSecurityGroupIds 将为 sg-12345678。如果将 EnvironmentType 设置为 Prod,则将使用 sg-abcdef01sg-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-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 ]

支持的函数

您可以在 Fn::FindInMap 函数中使用以下函数:

  • Fn::FindInMap

  • Ref

相关资源

要使用其他内置函数或 Fn::FindInMap 函数中的默认值,您必须在模板中声明 AWS::LanguageExtensions 转换。有关更多信息,请参阅 Fn::FindInMap enhancements

在开发使用 Fn::FindInMap 函数的模板时,这些相关主题可能对您有所帮助。