CloudFormation 模板的 Mappings 部分语法参考 - Amazon CloudFormation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

CloudFormation 模板的 Mappings 部分语法参考

您可以借助可选的 Mappings 部分来创建键值对,从而可以根据特定条件或依赖项指定值。

Mappings 部分的一个常见应用场景是根据部署堆栈的 Amazon Web Services 区域来设置值。这可以通过使用 AWS::Region 伪参数来实现。AWS::Region 伪参数是 CloudFormation 用来解析到创建堆栈所在区域的值。在创建堆栈时,CloudFormation 解析了这些伪参数。

要检索映射中的值,您可以在模板的 Resources 部分中使用 Fn::FindInMap 内置函数。

语法

Mappings 部分使用以下语法:

JSON

"Mappings" : { "MappingLogicalName" : { "Key1" : { "Name" : "Value1" }, "Key2" : { "Name" : "Value2" }, "Key3" : { "Name" : "Value3" } } }

YAML

Mappings: MappingLogicalName: Key1: Name: Value1 Key2: Name: Value2 Key3: Name: Value3
  • MappingLogicalName 是映射的逻辑名称。

  • 在映射中,每个映射是一个键,后跟另一个映射。

  • 键必须是名称/值对映射,且在映射中必须唯一。

  • 名值对是一个标签,该值是用来映射的。您可以通过给值命名以将多组值映射到密钥中。

  • 映射中的键必须为文字字符串。

  • 值可以是 StringList 类型。

注意

不得在 Mappings 部分包含参数、伪参数或内部函数。

示例

基本映射

以下示例显示的是带映射 MappingsRegionMap 部分,该映射包含五个映射到含单字符串值的名称-值对的密钥。密钥为区域名称。每个名称值对都是该键所表示区域内的 T 系列中可用的一种实例类型。名称值对中有一个名称(示例中的 InstanceType)和一个值。

JSON

"Mappings" : { "RegionMap" : { "us-east-1" : {"InstanceType": "t2.micro"}, "us-west-1" : {"InstanceType": "t2.micro"}, "eu-west-1" : {"InstanceType": "t2.micro"}, "eu-north-1" : {"InstanceType": "t3.micro"}, "me-south-1" : {"InstanceType": "t3.micro"} } }

YAML

Mappings: RegionMap: us-east-1: InstanceType: t2.micro us-west-1: InstanceType: t2.micro eu-west-1: InstanceType: t2.micro eu-north-1: InstanceType: t3.micro me-south-1: InstanceType: t3.micro

带有多个值的映射

以下示例中的区域键映射到两组值:一组名为 MyAMI1,另一组为 MyAMI2

JSON

"AMIIDMap" : { "us-east-1" : {"MyAMI1" : "ami-0ff8a91507f77f867", "MyAMI2" : "ami-0a584ac55a7631c0c"}, "us-west-1" : {"MyAMI1" : "ami-0bdb828fd58c52235", "MyAMI2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"MyAMI1" : "ami-047bb4163c506cd98", "MyAMI2" : "ami-0a7c483d527806435"}, "ap-southeast-1" : {"MyAMI1" : "ami-08569b978cc4dfa10", "MyAMI2" : "ami-0be9df32ae9f92309"}, "ap-northeast-1" : {"MyAMI1" : "ami-06cd52961ce9f0d85", "MyAMI2" : "ami-053cdd503598e4a9d"} }

YAML

AMIIDMap: us-east-1: MyAMI1: ami-0ff8a91507f77f867 MyAMI2: ami-0a584ac55a7631c0c us-west-1: MyAMI1: ami-0bdb828fd58c52235 MyAMI2: ami-066ee5fd4a9ef77f1 eu-west-1: MyAMI1: ami-047bb4163c506cd98 MyAMI2: ami-0a7c483d527806435 ap-southeast-1: MyAMI1: ami-08569b978cc4dfa10 MyAMI2: ami-0be9df32ae9f92309 ap-northeast-1: MyAMI1: ami-06cd52961ce9f0d85 MyAMI2: ami-053cdd503598e4a9d

从映射返回值

您可以使用 Fn::FindInMap 函数根据指定的密钥返回命名的值。以下示例模板包含由 FindInMap 函数分配其 ImageId 属性的 Amazon EC2 资源。FindInMap 函数将键指定为创建堆栈的区域(使用 AWS::Region 伪参数),并将 MyAMI1 指定为要映射到的值的名称。有关伪参数的更多信息,请参阅伪参数参考

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "AMIIDMap" : { "us-east-1" : {"MyAMI1" : "ami-0ff8a91507f77f867", "MyAMI2" : "ami-0a584ac55a7631c0c"}, "us-west-1" : {"MyAMI1" : "ami-0bdb828fd58c52235", "MyAMI2" : "ami-066ee5fd4a9ef77f1"}, "eu-west-1" : {"MyAMI1" : "ami-047bb4163c506cd98", "MyAMI2" : "ami-0a7c483d527806435"}, "ap-northeast-1" : {"MyAMI1" : "ami-06cd52961ce9f0d85", "MyAMI2" : "ami-053cdd503598e4a9d"}, "ap-southeast-1" : {"MyAMI1" : "ami-08569b978cc4dfa10", "MyAMI2" : "ami-0be9df32ae9f92309"} } }, "Resources" : { "myEC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "AMIIDMap", { "Ref" : "AWS::Region" }, "MyAMI1" ]}, "InstanceType" : "t2.micro" } } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Mappings: AMIIDMap: us-east-1: MyAMI1: ami-0ff8a91507f77f867 MyAMI2: ami-0a584ac55a7631c0c us-west-1: MyAMI1: ami-0bdb828fd58c52235 MyAMI2: ami-066ee5fd4a9ef77f1 eu-west-1: MyAMI1: ami-047bb4163c506cd98 MyAMI2: ami-0a7c483d527806435 ap-northeast-1: MyAMI1: ami-06cd52961ce9f0d85 MyAMI2: ami-053cdd503598e4a9d ap-southeast-1: MyAMI1: ami-08569b978cc4dfa10 MyAMI2: ami-0be9df32ae9f92309 Resources: myEC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !FindInMap [AMIIDMap, !Ref "AWS::Region", MyAMI1] InstanceType: t2.micro

输入参数和 Fn::FindInMap

您可以对 Fn::FindInMap 函数使用输入参数来引用映射中的特定值。例如,假定您有一个映射到特定安全组 ID 的区域和环境类型的列表。您可以使用输入参数(EnvironmentType)来选择堆栈使用的安全组 ID。要确定区域,您可以使用 AWS::Region 伪参数,从而获取创建堆栈时所在的 Amazon Web Services 区域。

此示例还声明了一个 Systems Manager 参数类型,该参数类型提供 Systems Manager 参数别名 (/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2),以作为 EC2 实例的 ImageId 属性的默认值。CloudFormation 将该值解析为创建堆栈所在区域中最新 Amazon Linux 2 AMI 的 AMI ID 值。

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "LatestAmiId" : { "Description" : "The latest Amazon Linux 2 AMI from the Parameter Store", "Type" : "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>", "Default" : "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" }, "EnvironmentType" : { "Description" : "The environment type (Dev or Prod)", "Type" : "String", "Default" : "Dev", "AllowedValues" : [ "Dev", "Prod" ] } }, "Mappings" : { "SecurityGroupMap" : { "us-east-1" : { "Dev" : "sg-12345678", "Prod" : "sg-abcdef01" }, "us-west-2" : { "Dev" : "sg-ghijkl23", "Prod" : "sg-45678abc" } } }, "Resources" : { "Ec2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Ref" : "LatestAmiId" }, "InstanceType" : "t2.micro", "SecurityGroupIds" : [{ "Fn::FindInMap" : [ "SecurityGroupMap", { "Ref" : "AWS::Region" }, { "Ref" : "EnvironmentType" } ]}] } } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Parameters: LatestAmiId: Description: The latest Amazon Linux 2 AMI from the Parameter Store Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>' Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' EnvironmentType: Description: The environment type (Dev or Prod) Type: String Default: Dev AllowedValues: - Dev - Prod Mappings: SecurityGroupMap: us-east-1: Dev: "sg-12345678" Prod: "sg-abcdef01" us-west-2: Dev: "sg-ghijkl23" Prod: "sg-45678abc" Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: !Ref LatestAmiId InstanceType: t2.micro SecurityGroupIds: - !FindInMap [SecurityGroupMap, !Ref "AWS::Region", !Ref EnvironmentType]

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