CloudFormation 範本Mappings語法 - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CloudFormation 範本Mappings語法

選用Mappings區段可協助您建立可用於根據特定條件或相依性指定值的鍵值對。

Mappings 區段的一個常見使用案例是根據部署堆疊 AWS 區域 的 來設定值。這可以透過使用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 區段中包含參數、虛擬參數或內部函數。

如果您的堆疊目前未使用映射中的值,則您無法單獨更新映射。您必須包含新增、修改或刪除資源的變更。

範例

基本映射

下列範例顯示具有映射 MappingsRegionToInstanceType 區段,內含映射至包含單一字串值之名稱值對的五個索引鍵。索引鍵是區域名稱。每個名稱/值對都是來自 T 系列的執行個體類型,可用於由 金鑰表示的區域。名稱/值對具有名稱 (InstanceType 範例中的 ) 和值。

JSON

"Mappings" : { "RegionToInstanceType" : { "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: RegionToInstanceType: 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

注意

這些範例中顯示的 AMI IDs 是做為示範之用的預留位置。盡可能考慮使用參數的 AWS Systems Manager 動態參考作為Mappings區段的替代方案。若要避免在每次要使用變更的 AMI 時,使用新 ID 來更新所有範本,請在建立或更新堆疊時,使用 AWS Systems Manager 參數來擷取最新的 AMI ID。Systems Manager 中也提供最新版本的常用 AMIs 做為公有參數。如需詳細資訊,請參閱使用動態參考取得存放在其他服務中的值

JSON

"Mappings" : { "RegionToAMI" : { "us-east-1" : { "MyAMI1" : "ami-12345678901234567", "MyAMI2" : "ami-23456789012345678" }, "us-west-1" : { "MyAMI1" : "ami-34567890123456789", "MyAMI2" : "ami-45678901234567890" }, "eu-west-1" : { "MyAMI1" : "ami-56789012345678901", "MyAMI2" : "ami-67890123456789012" }, "ap-southeast-1" : { "MyAMI1" : "ami-78901234567890123", "MyAMI2" : "ami-89012345678901234" }, "ap-northeast-1" : { "MyAMI1" : "ami-90123456789012345", "MyAMI2" : "ami-01234567890123456" } } }

YAML

Mappings: RegionToAMI: us-east-1: MyAMI1: ami-12345678901234567 MyAMI2: ami-23456789012345678 us-west-1: MyAMI1: ami-34567890123456789 MyAMI2: ami-45678901234567890 eu-west-1: MyAMI1: ami-56789012345678901 MyAMI2: ami-67890123456789012 ap-southeast-1: MyAMI1: ami-78901234567890123 MyAMI2: ami-89012345678901234 ap-northeast-1: MyAMI1: ami-90123456789012345 MyAMI2: ami-01234567890123456

從映射傳回值

您可以使用 Fn::FindInMap 函數,以根據指定的索引鍵來傳回命名值。下列範例範本包含 Amazon EC2 資源,而其 InstanceType 屬性是由 FindInMap 函數指派。FindInMap 函數會將索引鍵指定為建立堆疊 AWS 區域 的 (使用AWS::Region虛擬參數),並將索引鍵InstanceType指定為要映射的值名稱。ImageId 使用 Systems Manager 參數動態擷取最新的 Amazon Linux 2 AMI。如需這些虛擬參數的詳細資訊,請參閱使用虛擬參數取得 AWS 值

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionToInstanceType" : { "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" } } }, "Resources" : { "myEC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}", "InstanceType" : { "Fn::FindInMap" : [ "RegionToInstanceType", { "Ref" : "AWS::Region" }, "InstanceType" ]} } } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Mappings: RegionToInstanceType: 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 Resources: myEC2Instance: Type: AWS::EC2::Instance Properties: ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}' InstanceType: !FindInMap [RegionToInstanceType, !Ref 'AWS::Region', InstanceType]

輸入參數和 Fn::FindInMap

下列範例範本示範如何使用多個映射建立 EC2 執行個體。範本使用巢狀映射,根據目標和環境類型 (Dev 或 ) 自動選取適當的執行個體類型 AWS 區域 和安全群組Prod。它也會使用 Systems Manager 參數來動態擷取最新的 Amazon Linux 2 AMI。

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "EnvironmentType" : { "Description" : "The environment type (Dev or Prod)", "Type" : "String", "Default" : "Dev", "AllowedValues" : [ "Dev", "Prod" ] } }, "Mappings" : { "RegionAndEnvironmentToInstanceType" : { "us-east-1" : { "Dev" : "t3.micro", "Prod" : "c5.large" }, "us-west-1" : { "Dev" : "t2.micro", "Prod" : "m5.large" } }, "RegionAndEnvironmentToSecurityGroup" : { "us-east-1" : { "Dev" : "sg-12345678", "Prod" : "sg-abcdef01" }, "us-west-1" : { "Dev" : "sg-ghijkl23", "Prod" : "sg-45678abc" } } }, "Resources" : { "Ec2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}", "InstanceType" : { "Fn::FindInMap": [ "RegionAndEnvironmentToInstanceType", { "Ref": "AWS::Region" }, { "Ref": "EnvironmentType" } ]}, "SecurityGroupIds" : [{ "Fn::FindInMap" : [ "RegionAndEnvironmentToSecurityGroup", { "Ref" : "AWS::Region" }, { "Ref" : "EnvironmentType" } ]}] } } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Parameters: EnvironmentType: Description: The environment type (Dev or Prod) Type: String Default: Dev AllowedValues: - Dev - Prod Mappings: RegionAndEnvironmentToInstanceType: us-east-1: Dev: t3.micro Prod: c5.large us-west-1: Dev: t2.micro Prod: m5.large RegionAndEnvironmentToSecurityGroup: us-east-1: Dev: sg-12345678 Prod: sg-abcdef01 us-west-1: Dev: sg-ghijkl23 Prod: sg-45678abc Resources: Ec2Instance: Type: AWS::EC2::Instance Properties: ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}' InstanceType: !FindInMap [RegionAndEnvironmentToInstanceType, !Ref 'AWS::Region', !Ref EnvironmentType] SecurityGroupIds: - !FindInMap [RegionAndEnvironmentToSecurityGroup, !Ref 'AWS::Region', !Ref EnvironmentType]

當您開發使用 Fn::FindInMap函數的範本時,這些相關主題會很有幫助。