Fn::FindInMap - AWS CloudFormation

這是新的 AWS CloudFormation 範本參考指南。請更新您的書籤和連結。如需開始使用 CloudFormation 的說明,請參閱 AWS CloudFormation 使用者指南

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

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中使用 : AWSInstanceType2ArchAWSRegionArch2AMI。它還包含 InstanceType 參數,可讓您在 t3.micro和 之間進行選擇t4g.nano。預設值為 t3.micro,但可以在堆疊建立期間覆寫。

Fn::FindInMap 先根據選取的執行個體類型決定架構 (HVM64ARM64),然後在目前的 中查詢該架構的正確 AMI ID AWS 區域。

注意

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

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用於環境特定的組態

下列範例示範如何將 Fn::FindInMap用於包含單一映射的 Mappings區段的 範本SecurityGroups。它還包含 EnvironmentType 參數,可讓您指定環境是 Dev還是 Prod。其預設為 ,Dev但可以在堆疊建立期間覆寫。

Fn::FindInMap SecurityGroupIds會根據 EnvironmentType 參數傳回適當的 。 Fn::Split 然後將逗號分隔的安全群組 IDs 字串分割為清單,這是 的預期格式SecurityGroupIds

如果您在 EnvironmentType設定為 的情況下部署此堆疊DevSecurityGroupIdsEC2Instance 將是 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函數的範本時,這些相關主題會很有幫助。