本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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
來搭配包含單一映射 的 Mappings
區段RegionMap
,該映射AMIs與 AWS 區域建立關聯。
-
映射有 5 個對應於不同 AWS 區域的頂層金鑰。
-
每個頂層金鑰都會指派一個清單,其中包含兩個第二層金鑰
"HVM64"
和"HVMG2"
,對應至 AMI的架構。 -
每個第二層金鑰都會指派適當的AMI名稱。
範例範本包含 AWS::EC2::Instance
資源,它的 ImageId
屬性是由 FindInMap
函數設定。
MapName
設為使用到的映射,在本範例中為 "RegionMap"
。TopLevelKey
設為建立堆疊的區域,這使用 "AWS::Region"
虛擬參數判斷。SecondLevelKey
設為所需的架構,在本範例中為 "HVM64"
。
FindInMap
會傳回AMI指派給 的 FindInMap
。對於 us-east-1 中的HVM64執行個體, FindInMap
會傳回 "ami-0ff8a91507f77f867"
。
注意
將 AWS Systems Manager 參數視為Mappings
區段的替代方案。為了避免在每次要使用變更AMI的 時,使用新的 ID 更新所有範本,請在建立或更新堆疊時,使用 AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
參數類型擷取最新的 AMI ID。Systems Manager 中AMIs也提供常用的最新版本作為公有參數。如需詳細資訊,請參閱使用 CloudFormation提供的參數類型參考現有的資源和 Systems Manager 參數。
JSON
{ ... "Mappings" : { "RegionMap" : { "us-east-1" : { "HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c" }, "us-west-1" : { "HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1" }, "eu-west-1" : { "HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435" }, "ap-southeast-1" : { "HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309" }, "ap-northeast-1" : { "HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d" } } }, "Resources" : { "myEC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "HVM64" ] }, "InstanceType" : "t2.micro" } } } }
YAML
Mappings: RegionMap: us-east-1: HVM64: "ami-0ff8a91507f77f867" HVMG2: "ami-0a584ac55a7631c0c" us-west-1: HVM64: "ami-0bdb828fd58c52235" HVMG2: "ami-066ee5fd4a9ef77f1" eu-west-1: HVM64: "ami-047bb4163c506cd98" HVMG2: "ami-0a7c483d527806435" ap-southeast-1: HVM64: "ami-08569b978cc4dfa10" HVMG2: "ami-0be9df32ae9f92309" ap-northeast-1: HVM64: "ami-06cd52961ce9f0d85" HVMG2: "ami-053cdd503598e4a9d" Resources: myEC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !FindInMap - RegionMap - !Ref 'AWS::Region' - HVM64 InstanceType: t2.micro
使用 Fn::FindInMap 適用於環境特定的組態
下列範例示範如何將 範本Fn::FindInMap
用於包含單一映射 的 Mappings
區段SecurityGroups
。它還包含一個EnvironmentType
參數,可讓您指定環境是 Dev
還是 Prod
。其預設為 ,Dev
但可以在堆疊建立期間覆寫。
Fn::FindInMap
SecurityGroupIds
根據 EnvironmentType
參數傳回適當的 。 Fn::Split
然後將安全群組的逗號分隔字串分割IDs為清單,這是 的預期格式 SecurityGroupIds.
如果您在 EnvironmentType
設定為 的情況下部署此堆疊Dev
,則 SecurityGroupIds
的 EC2Instance
將為 sg-12345678
。如果您將 EnvironmentType
設定為 Prod
,則會使用 sg-abcdef01
和 sg-ghijkl23
。
JSON
{ ... "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": "ami-0a70b9d193ae8a799", "InstanceType": "t2.micro", "SecurityGroupIds":{ "Fn::Split":[ ",", { "Fn::FindInMap":[ "SecurityGroups", { "Ref":"EnvironmentType" }, "SecurityGroupIds" ] } ] } } } } }
YAML
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: ami-0a70b9d193ae8a799 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
函數的範本時,這些相關主題會很有幫助。