Fn::FindInMap
La función Fn::FindInMap
intrínseca devuelve el valor correspondiente a claves en una asignación de dos niveles declarada en la sección Mappings
.
Declaración
JSON
{ "Fn::FindInMap" : [ "
MapName
", "TopLevelKey
", "SecondLevelKey
"] }
YAML
Sintaxis del nombre de función completo:
Fn::FindInMap: [
MapName
,TopLevelKey
,SecondLevelKey
]
Sintaxis de la forma abreviada:
!FindInMap [
MapName
,TopLevelKey
,SecondLevelKey
]
nota
No puede anidar dos instancias de dos funciones de manera abreviada.
Parámetros
- MapName
-
El nombre lógico de un mapeo declarado en la sección Mappings que contiene las claves y valores.
- TopLevelKey
-
El nombre de clave de nivel superior. Su valor es una lista de pares clave-valor.
- SecondLevelKey
-
El nombre de la clave de segundo nivel, que se ha establecido en una de las claves de la lista asignada a
TopLevelKey
.
Valor devuelto
El valor que se ha asignado a SecondLevelKey
.
Ejemplos
Los siguientes ejemplos muestran cómo utilizar la función Fn::FindInMap
.
Uso de Fn::FindInMap con valores específicos de la región
El siguiente ejemplo muestra cómo utilizar Fn::FindInMap
para una plantilla con una sección Mappings
que contiene una única asignación, RegionMap
que asocia AMI con Regiones deAWS.
-
El mapa tiene 5 claves de nivel superior que corresponden a varias regiones de AWS.
-
A cada clave de nivel superior se le asigna una lista con dos claves de segundo nivel,
"HVM64"
y"HVMG2"
que corresponden a la arquitectura de la AMI. -
Se asigna a cada una de las claves de segundo nivel un nombre de AMI apropiado.
La plantilla de ejemplo contiene un recurso AWS::EC2::Instance
cuya propiedad ImageId
establece la función FindInMap
.
MapName
se establece en la asignación de interés, "RegionMap"
en este ejemplo. TopLevelKey
se establece en la región donde se crea la pila, lo cual se determina mediante el pseudoparámetro "AWS::Region"
. SecondLevelKey
se establece en la arquitectura deseada, "HVM64"
para este ejemplo.
FindInMap
devuelve la AMI asignada a FindInMap
. Para una instancia HVM64 en la región us-east-1, FindInMap
devolverá "ami-0ff8a91507f77f867"
.
nota
Considere los parámetros AWS Systems Manager como una alternativa a la sección Mappings
. Para evitar actualizar todas las plantillas con un nuevo ID cada vez que cambie la AMI que desea utilizar, utilice el tipo de parámetro AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
para obtener el último ID de AMI al crear o actualizar la pila. Las versiones más recientes de las AMI más utilizadas también están disponibles como parámetros públicos en Systems Manager. Para obtener más información, consulte Definición de recursos existentes en tiempo de ejecución con tipos de parámetros proporcionados por CloudFormation.
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
Uso de Fn::FindInMap para configuraciones específicas del entorno
El siguiente ejemplo muestra cómo utilizar Fn::FindInMap
para una plantilla con una sección Mappings
que contiene una única asignación, SecurityGroups
. También contiene un parámetro EnvironmentType
que le permite especificar si el entorno es Dev
o Prod
. Su valor predeterminado es Dev
, pero se puede anular durante la creación de la pila.
Fn::FindInMap
devuelve los SecurityGroupIds
apropiados en función del parámetro EnvironmentType
. A continuación, Fn::Split
divide la cadena separada por comas de los identificadores de los grupos de seguridad en una lista, que es el formato esperado para SecurityGroupIds.
Si implementa esta pila con EnvironmentType
establecido en Dev
, el valor de SecurityGroupIds
para EC2Instance
será sg-12345678
. Si establece EnvironmentType
en Prod
, usará sg-abcdef01
y 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 ]
Funciones compatibles
Puede utilizar las siguientes funciones en una función Fn::FindInMap
:
-
Fn::FindInMap
-
Ref
Recursos relacionados
Para usar otras funciones intrínsecas o un valor predeterminado en una función Fn::FindInMap
, debe declarar la transformación AWS::LanguageExtensions
en su plantilla. Para obtener más información, consulte Fn::FindInMap
enhancements.
Estos temas relacionados pueden resultarle útiles a la hora de desarrollar plantillas que utilicen la función Fn::FindInMap
.