

Esta es la nueva *Guía de referencia de plantillas de CloudFormation*. Actualice sus marcadores y enlaces. Para obtener ayuda sobre cómo empezar a usar CloudFormation, consulte la [Guía del usuario de AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html).

# Referencia de función intrínseca
<a name="intrinsic-function-reference"></a>

CloudFormation ofrece varias funciones integradas que le ayudan a administrar sus pilas. Utilice las funciones intrínsecas en las plantillas para asignar valores a las propiedades que no están disponibles hasta que el tiempo de ejecución.

**nota**  
Puede utilizar funciones intrínsecas solo en partes específicas de una plantilla. Actualmente, puede utilizar funciones intrínsecas en propiedades de recursos, salidas, atributos de metadatos y atributos de política de actualización. También puede usar las funciones intrínsecas para crear condicionalmente los recursos de la pila.

**Topics**
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::Cidr`](intrinsic-function-reference-cidr.md)
+ [Funciones de condiciones](intrinsic-function-reference-conditions.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::ForEach`](intrinsic-function-reference-foreach.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.md)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Length`](intrinsic-function-reference-length.md)
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Split`](intrinsic-function-reference-split.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ [`Fn::Transform`](intrinsic-function-reference-transform.md)
+ [`Ref`](intrinsic-function-reference-ref.md)
+ [Funciones de reglas](intrinsic-function-reference-rules.md)

# `Fn::Base64`
<a name="intrinsic-function-reference-base64"></a>

La función intrínseca `Fn::Base64` devuelve la representación Base64 de la cadena de entrada. Esta función se suele utilizar para transferir datos cifrados para instancias Amazon EC2 mediante la propiedad `UserData`.

## Declaración
<a name="w2aac24c12b5"></a>

### JSON
<a name="intrinsic-function-reference-base64-syntax.json"></a>

```
{ "Fn::Base64" : valueToEncode }
```

### YAML
<a name="intrinsic-function-reference-base64-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Base64: valueToEncode
```

Sintaxis de la forma abreviada:

```
!Base64 valueToEncode
```

**nota**  
Si utiliza la forma abreviada e incluye inmediatamente otra función en el parámetro `valueToEncode`, utilice el nombre de la función completa para una de las funciones como mínimo. Por ejemplo, la siguiente sintaxis no es válida:  

```
!Base64 !Sub string
!Base64 !Ref logical_ID
```
En su lugar, utilice el nombre de la función completa de al menos una de las funciones, tal y como se muestra en los siguientes ejemplos:  

```
!Base64
  "Fn::Sub": string

Fn::Base64:
  !Sub string
```

## Parameters
<a name="w2aac24c12b7"></a>

valueToEncode  
El valor de cadena que desee convertir en Base64.

## Valor devuelto:
<a name="w2aac24c12b9"></a>

La cadena original, en representación Base64.

## Ejemplos
<a name="w2aac24c12c11"></a>

### JSON
<a name="intrinsic-function-reference-base64-example.json"></a>

```
{ "Fn::Base64" : "AWS CloudFormation" }
```

### YAML
<a name="intrinsic-function-reference-base64-example.yaml"></a>

```
Fn::Base64: AWS CloudFormation
```

## Funciones compatibles
<a name="w2aac24c12c13"></a>

Puede utilizar cualquier función que devuelve una cadena dentro de la función `Fn::Base64`.

# `Fn::Cidr`
<a name="intrinsic-function-reference-cidr"></a>

La función intrínseca `Fn::Cidr` devuelve una matriz de bloques de direcciones de CIDR. El número de bloques de CIDR devueltos depende del parámetro `count`.

## Declaración
<a name="intrinsic-function-reference-cidr-declaration"></a>

### JSON
<a name="intrinsic-function-reference-cidr-syntax.json"></a>

```
{ "Fn::Cidr" : [ipBlock, count, cidrBits]}
```

### YAML
<a name="intrinsic-function-reference-cidr-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Cidr: 
  - ipBlock
  - count
  - cidrBits
```

Sintaxis de la forma abreviada:

```
!Cidr [ ipBlock, count, cidrBits ]
```

## Parámetros
<a name="intrinsic-function-reference-cidr-parameters"></a>

ipBlock  <a name="ipBlock"></a>
El bloque de direcciones de CIDR especificado por el usuario que se divide en bloques de CIDR más pequeños.

count  <a name="count"></a>
Número de CIDR que se van a generar. El intervalo válido está entre 1 y 256.

cidrBits  <a name="cidrBits"></a>
El número de bits de subred del CIDR. Por ejemplo, si se especifica un valor “8” para este parámetro se creará un CIDR con una máscara de “/24”.  
Bits de subred es lo inverso de una máscara de subred. Para calcular los bits de host necesarios para unos bits de subred determinados, reste los bits de subred a 32 bits para IPv4 o a 128 para IPv6.

## Valor devuelto
<a name="intrinsic-function-reference-cidr-return-values"></a>

Una matriz de bloques de direcciones de CIDR.

## Ejemplo
<a name="intrinsic-function-reference-cidr-examples"></a>

### Uso básico
<a name="intrinsic-function-reference-cidr-example1"></a>

En este ejemplo se crean 6 CIDR con una máscara de subred “/27” dentro de un CIDR con una máscara de “/24”.

#### JSON
<a name="intrinsic-function-reference-cidr-example1.json"></a>

```
{ "Fn::Cidr" : [ "192.168.0.0/24", "6", "5"] }
```

#### YAML
<a name="intrinsic-function-reference-cidr-example1.yaml"></a>

```
!Cidr [ "192.168.0.0/24", 6, 5 ]
```

### Creación de una VPC habilitada para IPv6
<a name="intrinsic-function-reference-cidr-example2"></a>

En esta plantilla de ejemplo se crea una subred habilitada para IPv6.

#### JSON
<a name="intrinsic-function-reference-cidr-example2.json"></a>

```
{
    "Resources": {
        "ExampleVpc": {
            "Type": "AWS::EC2::VPC",
            "Properties": {
                "CidrBlock": "10.0.0.0/16"
            }
        },
        "IPv6CidrBlock": {
            "Type": "AWS::EC2::VPCCidrBlock",
            "Properties": {
                "AmazonProvidedIpv6CidrBlock": true,
                "VpcId": {
                    "Ref": "ExampleVpc"
                }
            }
        },
        "ExampleSubnet": {
            "Type": "AWS::EC2::Subnet",
            "DependsOn": "IPv6CidrBlock",
            "Properties": {
                "AssignIpv6AddressOnCreation": true,
                "CidrBlock": {
                    "Fn::Select": [
                        0,
                        {
                            "Fn::Cidr": [
                                {
                                    "Fn::GetAtt": [
                                        "ExampleVpc",
                                        "CidrBlock"
                                    ]
                                },
                                1,
                                8
                            ]
                        }
                    ]
                },
                "Ipv6CidrBlock": {
                    "Fn::Select": [
                        0,
                        {
                            "Fn::Cidr": [
                                {
                                    "Fn::Select": [
                                        0,
                                        {
                                            "Fn::GetAtt": [
                                                "ExampleVpc",
                                                "Ipv6CidrBlocks"
                                            ]
                                        }
                                    ]
                                },
                                1,
                                64
                            ]
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "ExampleVpc"
                }
            }
        }
    }
}
```

#### YAML
<a name="intrinsic-function-reference-cidr-example2.yaml"></a>

```
Resources:
  ExampleVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  IPv6CidrBlock:
    Type: AWS::EC2::VPCCidrBlock
    Properties:
      AmazonProvidedIpv6CidrBlock: true
      VpcId: !Ref ExampleVpc
  ExampleSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: IPv6CidrBlock
    Properties:
      AssignIpv6AddressOnCreation: true
      CidrBlock: !Select
        - 0
        - !Cidr
          - !GetAtt ExampleVpc.CidrBlock
          - 1
          - 8
      Ipv6CidrBlock: !Select
        - 0
        - !Cidr
          - !Select
            - 0
            - !GetAtt ExampleVpc.Ipv6CidrBlocks
          - 1
          - 64
      VpcId: !Ref ExampleVpc
```

## Funciones compatibles
<a name="intrinsic-function-reference-cidr-functions"></a>

Puede utilizar las siguientes funciones en una función `Fn::Cidr`:
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Ref`](intrinsic-function-reference-ref.md)

# Funciones de condiciones
<a name="intrinsic-function-reference-conditions"></a>

Puede utilizar funciones intrínsecas, como por ejemplo `Fn::If` o `Fn::Equals`, para crear y configurar recursos de la pila en función de la lógica condicional. Estas condiciones se evalúan durante la creación de la pila o sus actualizaciones. Después de definir todas las condiciones, puede asociarlas con los recursos o las propiedades de los recursos en las secciones `Resources` y `Outputs` de una plantilla.

Para escenarios avanzados, puede combinar condiciones mediante funciones `Fn::And` o `Fn::Or`, o usar `Fn::Not` para negar el valor de una condición. También puede anidar condiciones para crear una lógica condicional más compleja.

Si es la primera vez que utiliza condiciones en sus plantillas, recomendamos consultar primero el tema de [sintaxis de las condiciones de las plantillas de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html) en la *Guía del usuario de AWS CloudFormation*.

**nota**  
Debe definir todas las condiciones en la sección `Conditions` de una plantilla, excepto las condiciones `Fn::If`. Puede utilizar la condición `Fn::If` en el atributo `Metadata`, en el atributo `UpdatePolicy` y los valores de la propiedad en la secciones `Resources` y `Outputs`.

**Topics**
+ [`Fn::And`](#intrinsic-function-reference-conditions-and)
+ [`Fn::Equals`](#intrinsic-function-reference-conditions-equals)
+ [`Fn::If`](#intrinsic-function-reference-conditions-if)
+ [`Fn::Not`](#intrinsic-function-reference-conditions-not)
+ [`Fn::Or`](#intrinsic-function-reference-conditions-or)
+ [Funciones compatibles](#w2aac24c20c25)
+ [Plantilla de muestra](#conditions-sample-templates)

## `Fn::And`
<a name="intrinsic-function-reference-conditions-and"></a>

Devuelve `true` si todas las condiciones especificadas se evalúan como true o devuelve `false` si alguna de las condiciones se evalúa como false. `Fn::And` actúa como operador AND. El número mínimo de las condiciones que puede incluir es 2 y el máximo es 10.

### Declaración
<a name="intrinsic-function-reference-conditions-and-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-and-syntax.json"></a>

```
"Fn::And": [{condition}, {...}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-and-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::And: [condition]
```

Sintaxis de la forma abreviada:

```
!And [condition]
```

### Parameters
<a name="w2aac24c20c13b7"></a>

condition  <a name="fn-and-condition"></a>
Una condición que se evalúa como `true` o `false`.

### Ejemplos de uso de `Fn::And`
<a name="w2aac24c20c13b9"></a>

La siguiente condición `MyAndCondition` se evalúa como true si el nombre del grupo de seguridad al que se hace referencia es igual a `sg-mysggroup` y si `SomeOtherCondition` se evalúa como true:

#### JSON
<a name="intrinsic-function-reference-conditions-and-example.json"></a>

```
"MyAndCondition": {
   "Fn::And": [
      {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]},
      {"Condition": "SomeOtherCondition"}
   ]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-and-example.yaml"></a>

```
MyAndCondition: !And
  - !Equals ["sg-mysggroup", !Ref ASecurityGroup]
  - !Condition SomeOtherCondition
```

## `Fn::Equals`
<a name="intrinsic-function-reference-conditions-equals"></a>

Compara si dos valores son iguales. Devuelve `true` si los dos valores son iguales o `false` si no lo son.

### Declaración
<a name="intrinsic-function-reference-conditions-equals-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-equals-syntax.json"></a>

```
"Fn::Equals" : ["value_1", "value_2"]
```

#### YAML
<a name="intrinsic-function-reference-conditions-equals-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Equals: [value_1, value_2]
```

Sintaxis de la forma abreviada:

```
!Equals [value_1, value_2]
```

### Parameters
<a name="w2aac24c20c15b7"></a>

value  
Un valor de cadena que desee comparar.

### Ejemplos de uso de `Fn::Equals`
<a name="w2aac24c20c15b9"></a>

La siguiente condición `IsProduction` se evalúa como true si el valor para el parámetro `EnvironmentType` es igual a `prod`:

#### JSON
<a name="intrinsic-function-reference-conditions-equals-example.json"></a>

```
"IsProduction" : {
   "Fn::Equals": [
      {"Ref": "EnvironmentType"},
      "prod"
   ]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-equals-example.yaml"></a>

```
IsProduction:
  !Equals [!Ref EnvironmentType, prod]
```

## `Fn::If`
<a name="intrinsic-function-reference-conditions-if"></a>

Devuelve un valor si la condición especificada se evalúa como `true` y otro valor si la condición especificada se evalúa como `false`. En la actualidad, CloudFormation es compatible con la función intrínseca `Fn::If` en el atributo `Metadata`, en el atributo `UpdatePolicy` y en los valores de la propiedad en la sección `Resources` y en las secciones `Outputs` de una plantilla. Puede utilizar el pseudoparámetro `AWS::NoValue` como valor devuelto para eliminar la propiedad correspondiente.

### Declaración
<a name="intrinsic-function-reference-conditions-if-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-if-syntax.json"></a>

```
"Fn::If": [condition_name, value_if_true, value_if_false]
```

#### YAML
<a name="intrinsic-function-reference-conditions-if-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::If: [condition_name, value_if_true, value_if_false]
```

Sintaxis de la forma abreviada:

```
!If [condition_name, value_if_true, value_if_false]
```

### Parameters
<a name="w2aac24c20c19b7"></a>

condition\$1name  <a name="condition_name"></a>
Una referencia a una condición en la sección Conditions. Utilice el nombre de la condición para hacer referencia a él.

value\$1if\$1true  <a name="value_if_true"></a>
Un valor que se devuelve si la condición especificada se evalúa como true.

value\$1if\$1false  <a name="value_if_false"></a>
Un valor que se devuelve si la condición especificada se evalúa como `false`.

### Ejemplos de uso de `Fn::If`
<a name="w2aac24c20c19b9"></a>

**Topics**
+ [Elección de un recurso de forma condicional](#w2aac24c20c19b9b5)
+ [Salidas condicionales](#w2aac24c20c19b9b7)
+ [Valores de matriz condicionales](#w2aac24c20c19b9b9)
+ [Propiedades condicionales y valores de propiedad](#w2aac24c20c19b9c11)
+ [Políticas de actualización condicional](#w2aac24c20c19b9c13)

#### Elección de un recurso de forma condicional
<a name="w2aac24c20c19b9b5"></a>

En el siguiente ejemplo, se utiliza una función `Fn::If` en una definición de recurso de Amazon EC2 para determinar qué recurso del grupo de seguridad se debe asociar a la instancia. Si la condición `CreateNewSecurityGroup` se evalúa como verdadera, CloudFormation utiliza el valor al que se hace referencia `NewSecurityGroup` (un grupo de seguridad creado en otra parte de la plantilla) para especificar la propiedad `SecurityGroupIds`. Si `CreateNewSecurityGroup` es falso, CloudFormation utiliza el valor referenciado de `ExistingSecurityGroupId` (un parámetro que hace referencia a un grupo de seguridad existente).

##### JSON
<a name="intrinsic-function-reference-conditions-if-example1.json"></a>

```
"Resources": {
  "EC2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "ImageId": "ami-0abcdef1234567890",
      "InstanceType": "t3.micro",
      "SecurityGroupIds": {
        "Fn::If": [
          "CreateNewSecurityGroup",
          [{"Ref": "NewSecurityGroup"}],
          [{"Ref": "ExistingSecurityGroupId"}]
        ]
      }]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example1.yaml"></a>

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0abcdef1234567890
      InstanceType: t3.micro
      SecurityGroupIds: !If
        - CreateNewSecurityGroup
        - [!Ref NewSecurityGroup]
        - [!Ref ExistingSecurityGroupId]
```

#### Salidas condicionales
<a name="w2aac24c20c19b9b7"></a>

En la sección `Output` de una plantilla, puede utilizar la función `Fn::If` para emitir información de forma condicional. En el siguiente fragmento de código, si la condición `CreateNewSecurityGroup` se evalúa como true, CloudFormation devuelve el ID del grupo de seguridad del recurso `NewSecurityGroup`. Si la condición es false, CloudFormation devuelve el ID de grupo de seguridad del recurso`ExistingSecurityGroup`.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example2.json"></a>

```
"Outputs" : {
  "SecurityGroupId" : {
    "Description" : "Group ID of the security group used.",
    "Value" : {
      "Fn::If" : [
        "CreateNewSecurityGroup",
        {"Ref" : "NewSecurityGroup"},
        {"Ref" : "ExistingSecurityGroupId"}
      ]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example2.yaml"></a>

```
Outputs:
  SecurityGroupId: 
    Description: Group ID of the security group used.
    Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]
```

#### Valores de matriz condicionales
<a name="w2aac24c20c19b9b9"></a>

El siguiente ejemplo utiliza `Fn::If` para proporcionar condicionalmente diferentes valores de matriz en función de una condición. Si la condición `MoreThan2AZs` se evalúa como verdadera, utiliza tres subredes públicas. De lo contrario, utiliza solo dos subredes públicas.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example-arrays.json"></a>

```
"Subnets": {
  "Fn::If": [
    "MoreThan2AZs",
    [
      {"Fn::ImportValue": "PublicSubnet01"},
      {"Fn::ImportValue": "PublicSubnet02"},
      {"Fn::ImportValue": "PublicSubnet03"}
    ],
    [
      {"Fn::ImportValue": "PublicSubnet01"},
      {"Fn::ImportValue": "PublicSubnet02"}
    ]
  ]
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example-arrays.yaml"></a>

```
Subnets:
  Fn::If:
    - MoreThan2AZs
    - - Fn::ImportValue: PublicSubnet01
      - Fn::ImportValue: PublicSubnet02
      - Fn::ImportValue: PublicSubnet03
    - - Fn::ImportValue: PublicSubnet01
      - Fn::ImportValue: PublicSubnet02
```

#### Propiedades condicionales y valores de propiedad
<a name="w2aac24c20c19b9c11"></a>

El siguiente ejemplo utiliza el pseudoparámetro `AWS::NoValue` en una función `Fn::If`. La condición utiliza una instantánea para una instancia de base de datos de Amazon RDS solo si se proporciona un ID de instantánea. Si la condición `UseDBSnapshot` se evalúa como true, CloudFormation utiliza el valor del parámetro `DBSnapshotName` para la propiedad `DBSnapshotIdentifier`. Si se evalúa la condición como false, CloudFormation elimina la propiedad `DBSnapshotIdentifier`.

También utiliza una función `Fn::If` en la propiedad `AllocatedStorage` de la instancia de base de datos de Amazon RDS. Si la condición `IsProduction` se evalúa como verdadera, el tamaño de almacenamiento se establece en `100`. De lo contrario, se establece en `20`.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example3.json"></a>

```
"MyDatabase" : {
  "Type" : "AWS::RDS::DBInstance",
  "Properties": {
    "DBInstanceClass": "db.t3.micro",
    "AllocatedStorage": {
      "Fn::If": [
        "IsProduction",
        100,
        20
      ]
    },
    "Engine" : "MySQL",
    "EngineVersion" : "5.5",
    "MasterUsername" : { "Ref" : "DBUser" },
    "MasterUserPassword" : { "Ref" : "DBPassword" },
    "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" },
    "DBSnapshotIdentifier" : {
      "Fn::If" : [
        "UseDBSnapshot",
        {"Ref" : "DBSnapshotName"},
        {"Ref" : "AWS::NoValue"}
      ]
    }
  }
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example3.yaml"></a>

```
MyDatabase:
  Type: AWS::RDS::DBInstance
  Properties:
    DBInstanceClass: db.t3.micro
    AllocatedStorage: !If [IsProduction, 100, 20]
    Engine: MySQL
    EngineVersion: 5.5
    MasterUsername: !Ref DBUser
    MasterUserPassword: !Ref DBPassword
    DBParameterGroupName: !Ref MyRDSParamGroup
    DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]
```

#### Políticas de actualización condicional
<a name="w2aac24c20c19b9c13"></a>

El siguiente fragmento de código proporciona una política de actualización de escalado automático solo si la condición `RollingUpdates` se evalúa como true (verdadera). Si la condición se evalúa como false, CloudFormation elimina la política de actualización `AutoScalingRollingUpdate`.

##### JSON
<a name="intrinsic-function-reference-conditions-if-example4.json"></a>

```
"UpdatePolicy": {
  "Fn::If": [
    "RollingUpdates",
    {
      "AutoScalingRollingUpdate": {
        "MaxBatchSize": 2,
        "MinInstancesInService": 2,
        "PauseTime": "PT0M30S"
      }
    },
    {
      "Ref": "AWS::NoValue"
    }
  ]
}
```

##### YAML
<a name="intrinsic-function-reference-conditions-if-example4.yaml"></a>

```
UpdatePolicy: !If
  - RollingUpdates
  - AutoScalingRollingUpdate:
      MaxBatchSize: 2
      MinInstancesInService: 2
      PauseTime: PT0M30S
  - !Ref "AWS::NoValue"
```

## `Fn::Not`
<a name="intrinsic-function-reference-conditions-not"></a>

Devuelve `true` para una condición que se evalúa en `false` o devuelve `false` para una condición que se evalúa en `true`. `Fn::Not` actúa como operador NOT.

### Declaración
<a name="intrinsic-function-reference-conditions-not-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-not-syntax.json"></a>

```
"Fn::Not": [{condition}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-not-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Not: [condition]
```

Sintaxis de la forma abreviada:

```
!Not [condition]
```

### Parameters
<a name="w2aac24c20c21b7"></a>

condition  <a name="condition"></a>
Una condición como, por ejemplo, `Fn::Equals` que se evalúa como `true` o `false`.

### Ejemplos de uso de `Fn::Not`
<a name="w2aac24c20c21b9"></a>

La siguiente condición `EnvCondition` se evalúa como true si el valor para el parámetro `EnvironmentType` no es igual a `prod`:

#### JSON
<a name="intrinsic-function-reference-conditions-not-example.json"></a>

```
"MyNotCondition" : {
   "Fn::Not" : [{
      "Fn::Equals" : [
         {"Ref" : "EnvironmentType"},
         "prod"
      ]
   }]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-not-example.yaml"></a>

```
MyNotCondition:
  !Not [!Equals [!Ref EnvironmentType, prod]]
```

## `Fn::Or`
<a name="intrinsic-function-reference-conditions-or"></a>

Devuelve `true` si alguna de las condiciones especificadas se evalúa como true o devuelve `false` si todas las condiciones se evalúan como false. `Fn::Or` actúa como operador OR. El número mínimo de las condiciones que puede incluir es 2 y el máximo es 10.

### Declaración
<a name="intrinsic-function-reference-conditions-or-syntax"></a>

#### JSON
<a name="intrinsic-function-reference-conditions-or-syntax.json"></a>

```
"Fn::Or": [{condition}, {...}]
```

#### YAML
<a name="intrinsic-function-reference-conditions-or-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Or: [condition, ...]
```

Sintaxis de la forma abreviada:

```
!Or [condition, ...]
```

### Parameters
<a name="w2aac24c20c23b7"></a>

condition  
Una condición que se evalúa como `true` o `false`.

### Ejemplos de uso de `Fn::Or`
<a name="w2aac24c20c23b9"></a>

La siguiente condición `MyOrCondition` se evalúa como true si el nombre del grupo de seguridad al que se hace referencia es igual a `sg-mysggroup` o si `SomeOtherCondition` se evalúa como true:

#### JSON
<a name="intrinsic-function-reference-conditions-or-example.json"></a>

```
"MyOrCondition" : {
   "Fn::Or" : [
      {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]},
      {"Condition" : "SomeOtherCondition"}
   ]
}
```

#### YAML
<a name="intrinsic-function-reference-conditions-or-example.yaml"></a>

```
MyOrCondition:
  !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]
```

## Funciones compatibles
<a name="w2aac24c20c25"></a>

Puede utilizar las siguientes funciones en la condición `Fn::If`:
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

Puede utilizar las siguientes funciones en todas las demás funciones de condiciones, como `Fn::Equals` y `Fn::Or`:
+ `Fn::FindInMap`
+ `Ref`
+ Otras funciones de condiciones

## Plantilla de muestra
<a name="conditions-sample-templates"></a>

### Cree condicionalmente recursos para una pila de producción, desarrollo o prueba
<a name="w2aac24c20c27b3"></a>

En algunos casos, es posible que desee crear pilas que son similares, pero con pequeñas modificaciones. Por ejemplo, podría tener una plantilla que utiliza para aplicaciones de producción. Tiene que crear la misma pila de producción para poder usarla con fines de desarrollo o de realización de pruebas. Sin embargo, para el desarrollo y la realización de pruebas, es posible que no necesite toda la capacidad adicional que se incluye en una pila de nivel de producción. En su lugar, puede utilizar un parámetro de entrada de tipo de entorno para crear condicionalmente recursos de la pila específicos de producción, desarrollo o pruebas, tal y como se muestra en el siguiente ejemplo:

Puede especificar `prod`, `dev`o `test` para el parámetro `EnvType`. Para cada tipo de entorno, la plantilla especifica un tipo de instancia diferente. Los tipos de instancia varían desde un tipo de instancia grande optimizada para computación a un tipo de instancia pequeño de uso general. Para especificar condicionalmente el tipo de instancia, la plantilla define dos condiciones en la sección `Conditions` de la plantilla: `CreateProdResources`, que se evalúa como true si el valor del parámetro `EnvType` es igual a `prod` y `CreateDevResources`, que se evalúa como true si el valor del parámetro es igual a `dev`.

En la propiedad `InstanceType`, la plantilla anida dos funciones intrínsecas `Fn::If` para determinar qué tipo de instancia utilizar. Si la condición `CreateProdResources` es true, el tipo de instancia es `c5.xlarge`. Si la condición es falsa, se evalúa la condición `CreateDevResources`. Si la condición `CreateDevResources` es true, el tipo de instancia es `t3.medium` o de lo contrario el tipo de instancia es `t3.small`.

Además del tipo de instancia, el entorno de producción crea y adjunta un volumen de Amazon EC2 a la instancia. Los recursos `MountPoint` y `NewVolume` se asocian con la condición `CreateProdResources` para que los recursos se creen únicamente si la condición se evalúa como true.

**Example JSON**  

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Parameters" : {
    "EnvType" : {
      "Description" : "Environment type.",
      "Default" : "test",
      "Type" : "String",
      "AllowedValues" : ["prod", "dev", "test"],
      "ConstraintDescription" : "must specify prod, dev, or test."
    }
  },
  "Conditions" : {
    "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]},
    "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]}
  },
  "Resources" : {
    "EC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "ami-1234567890abcdef0",
        "InstanceType" : { "Fn::If" : [
          "CreateProdResources",
          "c5.xlarge",
          {"Fn::If" : [
            "CreateDevResources",
            "t3.medium",
            "t3.small"
          ]}
        ]}
      }
    },
    "MountPoint" : {
      "Type" : "AWS::EC2::VolumeAttachment",
      "Condition" : "CreateProdResources",
      "Properties" : {
        "InstanceId" : { "Ref" : "EC2Instance" },
        "VolumeId"  : { "Ref" : "NewVolume" },
        "Device" : "/dev/sdh"
      }
    },
    "NewVolume" : {
      "Type" : "AWS::EC2::Volume",
      "Condition" : "CreateProdResources",
      "Properties" : {
        "Size" : "100",
        "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]}
      }
    }
  }
}
```

**Example YAML**  

```
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  EnvType:
    Description: Environment type.
    Default: test
    Type: String
    AllowedValues: [prod, dev, test]
    ConstraintDescription: must specify prod, dev, or test.
Conditions:
  CreateProdResources: !Equals [!Ref EnvType, prod]
  CreateDevResources: !Equals [!Ref EnvType, "dev"]
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-1234567890abcdef0
      InstanceType: !If [CreateProdResources, c5.xlarge, !If [CreateDevResources, t3.medium, t3.small]]    
  MountPoint:
    Type: AWS::EC2::VolumeAttachment
    Condition: CreateProdResources
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref NewVolume
      Device: /dev/sdh
  NewVolume:
    Type: AWS::EC2::Volume
    Condition: CreateProdResources
    Properties:
      Size: 100
      AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
```

**nota**  
Para ver ejemplos más complejos del uso de condiciones para crear recursos, consulte el tema [`Condition`Atributo](aws-attribute-condition.md).

# `Fn::FindInMap`
<a name="intrinsic-function-reference-findinmap"></a>

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
<a name="w2aac24c25b5"></a>

### JSON
<a name="intrinsic-function-reference-findinmap-syntax.json"></a>

```
{ "Fn::FindInMap" : [ "MapName", "TopLevelKey", "SecondLevelKey"] }
```

### YAML
<a name="intrinsic-function-reference-findinmap-syntax.yaml"></a>

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.

## Parameters
<a name="w2aac24c25b7"></a>

MapName  <a name="MapName"></a>
El nombre lógico de un mapeo declarado en la sección Mappings que contiene las claves y valores.

TopLevelKey  <a name="TopLevelKey"></a>
El nombre de clave de nivel superior. Su valor es una lista de pares clave-valor.

SecondLevelKey  <a name="SecondLevelKey"></a>
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
<a name="w2aac24c25b9"></a>

El valor que se ha asignado a `SecondLevelKey`.

## Ejemplos
<a name="intrinsic-function-reference-findinmap-examples"></a>

Los siguientes ejemplos muestran cómo utilizar la función `Fn::FindInMap`.

**Topics**
+ [Uso de Fn::FindInMap con valores específicos de la región](#intrinsic-function-reference-findinmap-region-example)
+ [Uso de Fn::FindInMap para configuraciones específicas del entorno](#intrinsic-function-reference-findinmap-environment-example)

### Uso de Fn::FindInMap con valores específicos de la región
<a name="intrinsic-function-reference-findinmap-region-example"></a>

El siguiente ejemplo muestra cómo utilizar `Fn::FindInMap` en una plantilla que incluye dos asignaciones: `AWSInstanceType2Arch` y `AWSRegionArch2AMI`. También incluye un parámetro `InstanceType` que le permite elegir entre `t3.micro` y `t4g.nano`. El valor predeterminado es `t3.micro`, pero se puede anular durante la creación de la pila. 

`Fn::FindInMap` primero determina la arquitectura (`HVM64` o `ARM64`) en función del tipo de instancia seleccionado y, a continuación, busca el ID de AMI correcto para esa arquitectura en la Región de AWS actual. 

**nota**  
Los ID de AMI que se muestran en estos ejemplos son marcadores de posición con fines de demostración. Siempre que sea posible, considere la posibilidad de utilizar referencias dinámicas a los parámetros AWS Systems Manager como 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 un parámetro AWS Systems Manager 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 [Obtención de valores almacenados en otros servicios con referencias dinámicas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html). 

#### JSON
<a name="intrinsic-function-reference-findinmap-region-example.json"></a>

```
{
  "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
<a name="intrinsic-function-reference-findinmap-region-example.yaml"></a>

```
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
```

### Uso de Fn::FindInMap para configuraciones específicas del entorno
<a name="intrinsic-function-reference-findinmap-environment-example"></a>

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 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html#cfn-ec2-instance-securitygroupids](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html#cfn-ec2-instance-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
<a name="intrinsic-function-reference-findinmap-environment-example.json"></a>

```
{
  "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
<a name="intrinsic-function-reference-findinmap-environment-example.yaml"></a>

```
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 ]
```

## Funciones compatibles
<a name="w2aac24c25c13"></a>

Puede utilizar las siguientes funciones en una función `Fn::FindInMap`:
+ `Fn::FindInMap`
+ `Ref`

## Recursos relacionados
<a name="w2aac24c25c15"></a>

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`](intrinsic-function-reference-findinmap-enhancements.md).

Estos temas relacionados pueden resultarle útiles a la hora de desarrollar plantillas que utilicen la función `Fn::FindInMap`.
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [Sintaxis Mappings de la plantilla de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/mappings-section-structure.html) en la *Guía del usuario de AWS CloudFormation*

# `Fn::ForEach`
<a name="intrinsic-function-reference-foreach"></a>

La función intrínseca `Fn::ForEach` toma una colección y un fragmento y aplica los elementos de la colección al identificador del fragmento proporcionado. `Fn::ForEach` puede contener otras funciones intrínsecas, incluida la propia función `Fn::ForEach`, y usarse en las secciones `Conditions`, `Outputs` y `Resources` (incluidas las propiedades de los recursos). No se puede usar en ninguna de las siguientes secciones: `AWSTemplateFormatVersion`, `Description`, `Metadata`, `Transform`, `Parameters`, `Mappings`, `Rules`, o `Hooks`.

Si usa la función intrínseca `Fn::ForEach` en su plantilla, también debe usar las [`AWS::LanguageExtensions`Transformación de](transform-aws-languageextensions.md).

El uso de la función intrínseca `Fn::ForEach` no cambia las cuotas, que se aplican a la plantilla resultante. Las cuotas incluyen el tamaño máximo de una plantilla y el número máximo de recursos en una plantilla. Para obtener más información, consulte las [Comprensión de las cuotas de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html) en la *Guía del usuario de AWS CloudFormation*.

## Declaración
<a name="intrinsic-function-reference-foreach-declaration"></a>

### JSON
<a name="intrinsic-function-reference-foreach-declaration.json"></a>

```
"Fn::ForEach::LoopLogicalName": [
  "Identifier",
  ["Value1","Value2"], // Collection
  {"OutputKey": {OutputValue}}
]
```

### YAML
<a name="intrinsic-function-reference-foreach-declaration.yaml"></a>

```
'Fn::ForEach::LoopLogicalName':
    - Identifier
    - - Value1 # Collection
      - Value2
    - 'OutputKey':
        OutputValue
```

## Parameters
<a name="intrinsic-function-reference-foreach-parameters"></a>

*Nombre lógico del bucle*  
Un identificador lógico para el bucle. El nombre debe ser único dentro de la plantilla y no puede entrar en conflicto con ningún valor de ID lógico en la sección `Resources` de la plantilla. Este nombre no aparece en la salida transformada. Se usa para referencia interna dentro de la propia plantilla de CloudFormation.

*Identificador*  
Un identificador del marcador de posición que se reemplaza en los parámetros `OutputKey` y `OutputValue`. Todas las instancias de `${Identifier}` o `&{Identifier}` en los parámetros `OutputKey` y `OutputValue` se reemplazarán con los valores del parámetro `Collection`.

*Recopilación*  
La colección de valores sobre la que iterar. Puede ser una matriz en este parámetro o una [`Ref`](intrinsic-function-reference-ref.md) a una `CommaDelimitedList`. Cuando se utiliza `&{Identifier}`, se pueden pasar caracteres no alfanuméricos en la `Collection`.

*Clave de salida*  
La clave en la plantilla transformada. `${Identifier}` o `&{Identifier}` debe estar incluidos dentro del parámetro `OutputKey`. Por ejemplo, si se usa `Fn::ForEach` en la sección `Resources` de la plantilla, este es el ID lógico de cada recurso.  
La sintaxis `&{}` permite utilizar caracteres no alfanuméricos en la `Collection` que se utilizará en el parámetro `OutputKey`. Para ver un ejemplo de esto, consulte [Transferencia de caracteres no alfanuméricos en `Collection` para `Fn::ForEach`](intrinsic-function-reference-foreach-example-resource.md#intrinsic-function-reference-foreach-example-non-alphanumeric).

*Valor de la salida*  
El valor que se replica en la plantilla transformada para cada elemento en el parámetro `Collection`. Por ejemplo, si se usa `Fn::ForEach` en la sección `Resources` de la plantilla, este es el fragmento de plantilla que se repite para configurar cada recurso.

## Valor devuelto
<a name="intrinsic-function-reference-foreach-return-value"></a>

Un objeto expandido que contiene el fragmento de objeto repetido una vez para cada elemento de la colección, donde el identificador del fragmento se reemplaza por el elemento de la colección.

## Funciones compatibles
<a name="intrinsic-function-reference-foreach-nested-functions"></a>

Puede utilizar las siguientes funciones en `Fn::ForEach`.
+ Funciones de condiciones:
  + [`Fn::And`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-and)
  + [`Fn::Equals`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-equals)
  + [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
  + [`Fn::Not`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-not)
  + [`Fn::Or`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-or)
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.md)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Length`](intrinsic-function-reference-length.md)
+ [`Fn::Transform`](intrinsic-function-reference-transform.md)
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ [`Ref`](intrinsic-function-reference-ref.md)

## Ejemplos
<a name="intrinsic-function-reference-foreach-example-pointer"></a>

Encontrará ejemplos de las secciones `Conditions`, `Outputs` y `Resources` en [Ejemplos](intrinsic-function-reference-foreach-examples.md).

# Ejemplos
<a name="intrinsic-function-reference-foreach-examples"></a>

**Topics**
+ [Ejemplos de `Fn::ForEach` en la sección `Resources`](intrinsic-function-reference-foreach-example-resource.md)
+ [Ejemplos de `Fn::ForEach` en la sección `Outputs`](intrinsic-function-reference-foreach-example-outputs.md)
+ [Ejemplos de `Fn::ForEach` en la sección `Conditions`](intrinsic-function-reference-foreach-example-conditions.md)

# Ejemplos de `Fn::ForEach` en la sección `Resources`
<a name="intrinsic-function-reference-foreach-example-resource"></a>

Estos ejemplos son una demostración del uso de la función intrínseca `Fn::ForEach` en la sección `Resources`. Para obtener más información sobre esta sección, consulte [Recursos](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html) en la *Guía del usuario de AWS CloudFormation*.

**Topics**
+ [Replicación de un recurso de Amazon SNS](#intrinsic-function-reference-foreach-example-replicate-resource)
+ [Replicación de un recurso de Amazon DynamoDB](#intrinsic-function-reference-foreach-example-replicate-ddb-resource)
+ [Replicación de varios recursos](#intrinsic-function-reference-foreach-example-replicate-multiple-resources)
+ [Replicación de varios recursos mediante bucles `Fn::ForEach` anidados](#intrinsic-function-reference-foreach-example-nested-loop-resources)
+ [Referencia a propiedades replicadas para un recurso de Amazon EC2](#intrinsic-function-reference-foreach-example-reference-replicated-resource)
+ [Replicación de propiedades de un recurso de Amazon EC2](#intrinsic-function-reference-foreach-example-replicate-resource-properties)
+ [Transferencia de caracteres no alfanuméricos en `Collection` para `Fn::ForEach`](#intrinsic-function-reference-foreach-example-non-alphanumeric)

## Replicación de un recurso de Amazon SNS
<a name="intrinsic-function-reference-foreach-example-replicate-resource"></a>

Este fragmento de ejemplo muestra una lista de cuatro temas de Amazon SNS, con el ID lógico correspondiente a los elementos de la colección (`Success`, `Failure`, `Timeout`, `Unknown`), con un valor de `TopicName` coincidente y `FifoTopic` establecido en `true`.

**nota**  
Para las plantillas que necesitan funcionar con temas estándar y FIFO, puede utilizar la propiedad `DisplayName` en lugar de `TopicName`. Esto permite a CloudFormation generar automáticamente los nombres de los temas con el sufijo `.fifo` correspondiente cuando `FifoTopic` sea `true`. Simplemente reemplace `TopicName` con `DisplayName: !Ref TopicName` en la sección `Properties`.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-resource.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Resources": {
        "Fn::ForEach::Topics": [
            "TopicName",
            ["Success", "Failure", "Timeout", "Unknown"],
            {
                "SnsTopic${TopicName}": {
                    "Type": "AWS::SNS::Topic",
                    "Properties": {
                        "TopicName": {"Fn::Sub": "${TopicName}.fifo"},
                        "FifoTopic": true
                    }
                }
            }
        ]
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-resource.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  'Fn::ForEach::Topics':
    - TopicName
    - [Success, Failure, Timeout, Unknown]
    - 'SnsTopic${TopicName}':
        Type: AWS::SNS::Topic
        Properties:
          TopicName: !Sub '${TopicName}.fifo'
          FifoTopic: true
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  SnsTopicSuccess:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Success.fifo
      FifoTopic: true
  SnsTopicFailure:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Failure.fifo
      FifoTopic: true
  SnsTopicTimeout:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Timeout.fifo
      FifoTopic: true
  SnsTopicUnknown:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: Unknown.fifo
      FifoTopic: true
```

## Replicación de un recurso de Amazon DynamoDB
<a name="intrinsic-function-reference-foreach-example-replicate-ddb-resource"></a>

En este fragmento de ejemplo se crean cuatro recursos [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html) con nombres como `Points`, `Score`, etc.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-ddb-resource.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Resources": {
        "Fn::ForEach::Tables": [
            "TableName",
            ["Points", "Score", "Name", "Leaderboard"],
            {
                "DynamoDB${TableName}": {
                    "Type": "AWS::DynamoDB::Table",
                    "Properties": {
                        "TableName": {
                            "Ref": "TableName"
                        },
                        "AttributeDefinitions": [
                            {
                                "AttributeName": "id",
                                "AttributeType": "S"
                            }
                        ],
                        "KeySchema": [
                            {
                                "AttributeName": "id",
                                "KeyType": "HASH"
                            }
                        ],
                        "ProvisionedThroughput": {
                            "ReadCapacityUnits": "5",
                            "WriteCapacityUnits": "5"
                        }
                    }
                }
            }
        ]
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-ddb-resource.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  'Fn::ForEach::Tables':
    - TableName
    - [Points, Score, Name, Leaderboard]
    - 'DynamoDB${TableName}':
        Type: AWS::DynamoDB::Table
        Properties:
          TableName: !Ref TableName
          AttributeDefinitions:
            - AttributeName: id
              AttributeType: S
          KeySchema:
            - AttributeName: id
              KeyType: HASH
          ProvisionedThroughput:
            ReadCapacityUnits: '5'
            WriteCapacityUnits: '5'
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  DynamoDBPoints:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Points
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
  DynamoDBScore:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Score
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
  DynamoDBName:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Name
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
  DynamoDBLeaderboard:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: Leaderboard
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: '5'
        WriteCapacityUnits: '5'
```

## Replicación de varios recursos
<a name="intrinsic-function-reference-foreach-example-replicate-multiple-resources"></a>

En este ejemplo se crean varias instancias de [AWS::EC2::NatGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-natgateway.html) y [AWS::EC2::EIP](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html) con la convención de nomenclatura de `"{ResourceType}${Identifier}"`. Puede declarar varios tipos de recursos en un bucle `Fn::ForEach` para utilizar un único identificador.

Los valores únicos de cada elemento de la colección se definen en la sección `Mappings`, donde se usa la función intrínseca [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md) para hacer referencia al valor correspondiente. Si `Fn::FindInMap` no puede encontrar el identificador correspondiente, la propiedad `Condition` no se establecerá y se resolverá en `!Ref AWS:::NoValue`.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-multiple-resources.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Conditions": {
    "TwoNatGateways": {"Fn::Equals": [{"Ref": "AWS::Region"}, "us-east-1"]},
    "ThreeNatGateways": {"Fn::Equals": [{"Ref": "AWS::Region"}, "us-west-2"]}
  },
  "Mappings": {
    "NatGateway": {
      "Condition": {
        "B": "TwoNatGateways",
        "C": "ThreeNatGateways"
      }
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {"CidrBlock": "10.0.0.0/16"}
    },
    "PublicSubnetA": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "CidrBlock": "10.0.1.0/24",
        "AvailabilityZone": {"Fn::Select": [0, {"Fn::GetAZs": ""}]}
      }
    },
    "PublicSubnetB": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "CidrBlock": "10.0.2.0/24",
        "AvailabilityZone": {"Fn::Select": [1, {"Fn::GetAZs": ""}]}
      }
    },
    "PublicSubnetC": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "CidrBlock": "10.0.3.0/24",
        "AvailabilityZone": {"Fn::Select": [2, {"Fn::GetAZs": ""}]}
      }
    },
    "Fn::ForEach::NatGatewayAndEIP": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "NatGateway${Identifier}": {
          "Type": "AWS::EC2::NatGateway",
          "Properties": {
            "AllocationId": {"Fn::GetAtt": [{"Fn::Sub": "NatGatewayAttachment${Identifier}"}, "AllocationId"]},
            "SubnetId": {"Ref": {"Fn::Sub": "PublicSubnet${Identifier}"}}
          },
          "Condition": {"Fn::FindInMap": ["NatGateway", "Condition", {"Ref": "Identifier"}, {"DefaultValue": {"Ref": "AWS::NoValue"}}]}
        },
        "NatGatewayAttachment${Identifier}": {
          "Type": "AWS::EC2::EIP",
          "Properties": {
            "Domain": "vpc"
          },
          "Condition": {"Fn::FindInMap": ["NatGateway", "Condition", {"Ref": "Identifier"}, {"DefaultValue": {"Ref": "AWS::NoValue"}}]}
        }
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-multiple-resources.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Conditions:
  TwoNatGateways: !Equals [!Ref "AWS::Region", "us-east-1"]
  ThreeNatGateways: !Equals [!Ref "AWS::Region", "us-west-2"]
Mappings:
  NatGateway:
    Condition:
      B: TwoNatGateways
      C: ThreeNatGateways
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [1, !GetAZs ""]
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
      AvailabilityZone: !Select [2, !GetAZs ""]
  Fn::ForEach::NatGatewayAndEIP:
    - Identifier
    - - A
      - B
      - C
    - NatGateway${Identifier}:
        Type: AWS::EC2::NatGateway
        Properties:
          AllocationId: !GetAtt
            - !Sub NatGatewayAttachment${Identifier}
            - AllocationId
          SubnetId: !Ref
            Fn::Sub: PublicSubnet${Identifier}
        Condition: !FindInMap
          - NatGateway
          - Condition
          - !Ref Identifier
          - DefaultValue: !Ref AWS::NoValue
      NatGatewayAttachment${Identifier}:
        Type: AWS::EC2::EIP
        Properties:
          Domain: vpc
        Condition: !FindInMap
          - NatGateway
          - Condition
          - !Ref Identifier
          - DefaultValue: !Ref AWS::NoValue
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Conditions:
  TwoNatGateways: !Equals [!Ref "AWS::Region", "us-east-1"]
  ThreeNatGateways: !Equals [!Ref "AWS::Region", "us-west-2"]
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [1, !GetAZs ""]
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
      AvailabilityZone: !Select [2, !GetAZs ""]
  NatGatewayA:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt
        - NatGatewayAttachmentA
        - AllocationId
      SubnetId: !Ref PublicSubnetA
  NatGatewayB:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt
        - NatGatewayAttachmentB
        - AllocationId
      SubnetId: !Ref PublicSubnetB
    Condition: TwoNatGateways
  NatGatewayC:
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt
        - NatGatewayAttachmentC
        - AllocationId
      SubnetId: !Ref PublicSubnetC
    Condition: ThreeNatGateways
  NatGatewayAttachmentA:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  NatGatewayAttachmentB:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
    Condition: TwoNatGateways
  NatGatewayAttachmentC:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
    Condition: ThreeNatGateways
```

## Replicación de varios recursos mediante bucles `Fn::ForEach` anidados
<a name="intrinsic-function-reference-foreach-example-nested-loop-resources"></a>

En este ejemplo se utilizan bucles `Fn::ForEach` anidados para asignar tres recursos ([AWS::EC2::NetworkAcl](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-natgateway.html), [AWS::EC2::Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html) y [AWS::EC2::SubnetNetworkAclAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnetnetworkaclassociation.html)) entre sí.

### JSON
<a name="intrinsic-function-reference-foreach-example-nested-loop-resources.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": "10.0.0.0/16",
        "EnableDnsSupport": "true",
        "EnableDnsHostnames": "true"
      }
    },
    "Fn::ForEach::SubnetResources": [
      "Prefix",
      [
        "Transit",
        "Public"
      ],
      {
        "Nacl${Prefix}Subnet": {
          "Type": "AWS::EC2::NetworkAcl",
          "Properties": {
            "VpcId": {
              "Ref": "VPC"
            }
          }
        },
        "Fn::ForEach::LoopInner": [
          "Suffix",
          [
            "A",
            "B",
            "C"
          ],
          {
            "${Prefix}Subnet${Suffix}": {
              "Type": "AWS::EC2::Subnet",
              "Properties": {
                "VpcId": {
                  "Ref": "VPC"
                }
              }
            },
            "Nacl${Prefix}Subnet${Suffix}Association": {
              "Type": "AWS::EC2::SubnetNetworkAclAssociation",
              "Properties": {
                "SubnetId": {
                  "Ref": {
                    "Fn::Sub": "${Prefix}Subnet${Suffix}"
                  }
                },
                "NetworkAclId": {
                  "Ref": {
                    "Fn::Sub": "Nacl${Prefix}Subnet"
                  }
                }
              }
            }
          }
        ]
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-nested-loop-resources.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  'Fn::ForEach::SubnetResources':
  - Prefix
  - [Transit, Public]
  - 'Nacl${Prefix}Subnet':
      Type: AWS::EC2::NetworkAcl
      Properties:
        VpcId: !Ref 'VPC'
    'Fn::ForEach::LoopInner':
    - Suffix
    - [A, B, C]
    - '${Prefix}Subnet${Suffix}':
        Type: AWS::EC2::Subnet
        Properties:
          VpcId: !Ref 'VPC'
      'Nacl${Prefix}Subnet${Suffix}Association':
        Type: AWS::EC2::SubnetNetworkAclAssociation
        Properties:
          SubnetId: !Ref
            'Fn::Sub': '${Prefix}Subnet${Suffix}'
          NetworkAclId: !Ref
            'Fn::Sub': 'Nacl${Prefix}Subnet'
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  NaclTransitSubnet:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref VPC
  TransitSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclTransitSubnetAAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref TransitSubnetA
      NetworkAclId: !Ref NaclTransitSubnet
  TransitSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclTransitSubnetBAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref TransitSubnetB
      NetworkAclId: !Ref NaclTransitSubnet
  TransitSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclTransitSubnetCAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref TransitSubnetC
      NetworkAclId: !Ref NaclTransitSubnet
  NaclPublicSubnet:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref VPC
  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclPublicSubnetAAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref PublicSubnetA
      NetworkAclId: !Ref NaclPublicSubnet
  PublicSubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclPublicSubnetBAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref PublicSubnetB
      NetworkAclId: !Ref NaclPublicSubnet
  PublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
  NaclPublicSubnetCAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref PublicSubnetC
      NetworkAclId: !Ref NaclPublicSubnet
```

## Referencia a propiedades replicadas para un recurso de Amazon EC2
<a name="intrinsic-function-reference-foreach-example-reference-replicated-resource"></a>

En este ejemplo se usa la función intrínseca `Fn::ForEach` para hacer referencia a recursos replicados [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html).

### JSON
<a name="intrinsic-function-reference-foreach-example-reference-replicated-resource.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Mappings": {
    "Instances": {
      "InstanceType": {
        "B": "m5.4xlarge",
        "C": "c5.2xlarge"
      },
      "ImageId": {"A": "ami-id1"}
    }
  },
  "Resources": {
    "Fn::ForEach::Instances": [
      "Identifier",
      [
        "A",
        "B",
        "C"
      ],
      {
        "Instance${Identifier}": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "InstanceType": {"Fn::FindInMap": ["Instances", "InstanceType", {"Ref": "Identifier"}, {"DefaultValue": "m5.xlarge"}]},
            "ImageId": {"Fn::FindInMap": ["Instances", "ImageId", {"Ref": "Identifier"}, {"DefaultValue": "ami-id-default"}]}
          }
        }
      }
    ]
  },
  "Outputs": {
    "SecondInstanceId": {
      "Description": "Instance Id for InstanceB",
      "Value": {"Ref": "InstanceB"}
    },
    "SecondPrivateIp": {
      "Description": "Private IP for InstanceB",
      "Value": {
        "Fn::GetAtt": [
          "InstanceB",
          "PrivateIp"
        ]
      }
    }
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-reference-replicated-resource.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  Instances:
    InstanceType:
      B: m5.4xlarge
      C: c5.2xlarge
    ImageId:
      A: ami-id1
Resources:
  'Fn::ForEach::Instances':
  - Identifier
  - [A, B, C]
  - 'Instance${Identifier}':
      Type: AWS::EC2::Instance
      Properties:
        InstanceType: !FindInMap [Instances, InstanceType, !Ref 'Identifier', {DefaultValue: m5.xlarge}]
        ImageId: !FindInMap [Instances, ImageId, !Ref 'Identifier', {DefaultValue: ami-id-default}]
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref 'InstanceB'
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.xlarge
      ImageId: ami-id1
  InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.4xlarge
      ImageId: ami-id-default
  InstanceC:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: c5.2xlarge
      ImageId: ami-id-default
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref InstanceB
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

## Replicación de propiedades de un recurso de Amazon EC2
<a name="intrinsic-function-reference-foreach-example-replicate-resource-properties"></a>

En este ejemplo se usa la función intrínseca `Fn::ForEach` para repetir algunas propiedades como `ImageId`, `InstanceType` y `AvailabilityZone` en un recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html).

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-resource-properties.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Mappings": {
    "InstanceA": {
      "Properties": {
        "ImageId": "ami-id1",
        "InstanceType": "m5.xlarge"
      }
    },
    "InstanceB": {
      "Properties": {
        "ImageId": "ami-id2"
      }
    },
    "InstanceC": {
      "Properties": {
        "ImageId": "ami-id3",
        "InstanceType": "m5.2xlarge",
        "AvailabilityZone": "us-east-1a"
      }
    }
  },
  "Resources": {
    "Fn::ForEach::Instances": [
      "InstanceLogicalId",
      [ "InstanceA", "InstanceB", "InstanceC" ],
      {
        "${InstanceLogicalId}": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "DisableApiTermination": true,
            "UserData": {
              "Fn::Base64": {
                "Fn::Join": [
                  "",
                  [
                    "#!/bin/bash\n",
                    "yum update -y\n",
                    "yum install -y httpd.x86_64\n",
                    "systemctl start httpd.service\n",
                    "systemctl enable httpd.service\n",
                    "echo \"Hello World from $(hostname -f)\" > /var/www/html/index.html\n"
                  ]
                ]
              }
            },
            "Fn::ForEach::Properties": [
              "PropertyName",
              [ "ImageId", "InstanceType", "AvailabilityZone" ],
              {
                "${PropertyName}": {
                  "Fn::FindInMap": [
                    { "Ref": "InstanceLogicalId" },
                    "Properties",
                    { "Ref": "PropertyName"},
                    {
                      "DefaultValue": { "Ref": "AWS::NoValue" }
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-resource-properties.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  InstanceA:
    Properties:
      ImageId: ami-id1
      InstanceType: m5.xlarge
  InstanceB:
    Properties:
      ImageId: ami-id2
  InstanceC:
    Properties:
      ImageId: ami-id3
      InstanceType: m5.2xlarge
      AvailabilityZone: us-east-1a
Resources:
  'Fn::ForEach::Instances':
  - InstanceLogicalId
  - [InstanceA, InstanceB, InstanceC]
  - '${InstanceLogicalId}':
      Type: AWS::EC2::Instance
      Properties:
        DisableApiTermination: true
        UserData:
          Fn::Base64: !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
        'Fn::ForEach::Properties':
          - PropertyName
          - [ImageId, InstanceType, AvailabilityZone]
          - '${PropertyName}':
             'Fn::FindInMap':
               - Ref: 'InstanceLogicalId'
               - Properties
               - Ref: 'PropertyName'
               - {DefaultValue: !Ref 'AWS::NoValue'}
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      DisableApiTermination: true
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
      ImageId: ami-id1
      InstanceType: m5.xlarge
  InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      DisableApiTermination: true
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
      ImageId: ami-id2
  InstanceC:
    Type: AWS::EC2::Instance
    Properties:
      DisableApiTermination: true
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd.x86_64
            systemctl start httpd.service
            systemctl enable httpd.service
            echo "Hello World from $(hostname -f)" > /var/www/html/index.html
      ImageId: ami-id3
      InstanceType: m5.2xlarge
      AvailabilityZone: us-east-1a
```

## Transferencia de caracteres no alfanuméricos en `Collection` para `Fn::ForEach`
<a name="intrinsic-function-reference-foreach-example-non-alphanumeric"></a>

En este ejemplo, se utiliza la sintaxis `&{}`, que permite que los caracteres no alfanuméricos (`.` y `/`) de las direcciones IP se pasen dentro de `Collection`.

### JSON
<a name="intrinsic-function-reference-foreach-example-non-alphanumeric-json.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Parameters": {
        "IpAddresses": {
            "Type": "CommaDelimitedList",
            "Default": "10.0.2.0/24,10.0.3.0/24,10.0.4.0/24"
        }
    },
    "Resources": {
        "VPC": {
            "Type": "AWS::EC2::VPC",
            "Properties": {
                "CidrBlock": "10.0.0.0/16",
                "EnableDnsSupport": "true",
                "EnableDnsHostnames": "true"
            }
        },
        "Fn::ForEach::Subnets": [
            "CIDR",
            {
                "Ref": "IpAddresses"
            },
            {
                "Subnet&{CIDR}": {
                    "Type": "AWS::EC2::Subnet",
                    "Properties": {
                        "VpcId": {
                            "Ref": "VPC"
                        },
                        "CidrBlock": {
                            "Ref": "CIDR"
                        }
                    }
                }
            }
        ]
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-non-alphanumeric-yaml.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  IpAddresses:
    Type: CommaDelimitedList
    Default: '10.0.2.0/24,10.0.3.0/24,10.0.4.0/24'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  'Fn::ForEach::Subnets':
    - CIDR
    - !Ref IpAddresses
    - 'Subnet&{CIDR}':
        Type: AWS::EC2::Subnet
        Properties:
          VpcId: !Ref VPC
          CidrBlock: !Ref CIDR
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  IpAddresses:
    Type: CommaDelimitedList
    Default: '10.0.2.0/24,10.0.3.0/24,10.0.4.0/24'
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
  Subnet1002024:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.2.0/24
  Subnet1003024:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.3.0/24
  Subnet1004024:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.4.0/24
```

# Ejemplos de `Fn::ForEach` en la sección `Outputs`
<a name="intrinsic-function-reference-foreach-example-outputs"></a>

Estos ejemplos son una demostración del uso de la función intrínseca `Fn::ForEach` en la sección `Outputs`. Para obtener más información sobre esta sección, consulte [Salidas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html) en la *Guía del usuario de AWS CloudFormation*.

**Topics**
+ [Referencia a los recursos `AWS::S3::Bucket` replicados](#intrinsic-function-reference-foreach-example-replicate-outputs)
+ [Referencia a los recursos `AWS::EC2::Instance` replicados](#intrinsic-function-reference-foreach-example-replicate-conditions)

## Referencia a los recursos `AWS::S3::Bucket` replicados
<a name="intrinsic-function-reference-foreach-example-replicate-outputs"></a>

En este ejemplo se usan bucles `Fn::ForEach` anidados en la sección `Outputs` para reducir la longitud de la plantilla.

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-outputs.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Resources": {
    "Fn::ForEach::Buckets": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "S3Bucket${Identifier}": {
          "Type": "AWS::S3::Bucket",
          "Properties": {
            "AccessControl": "PublicRead",
            "MetricsConfigurations": [
              {
                "Id": {"Fn::Sub": "EntireBucket${Identifier}"}
              }
            ],
            "WebsiteConfiguration": {
              "IndexDocument": "index.html",
              "ErrorDocument": "error.html",
              "RoutingRules": [
                {
                  "RoutingRuleCondition": {
                    "HttpErrorCodeReturnedEquals": "404",
                    "KeyPrefixEquals": "out1/"
                  },
                  "RedirectRule": {
                    "HostName": "ec2-11-22-333-44.compute-1.amazonaws.com",
                    "ReplaceKeyPrefixWith": "report-404/"
                  }
                }
              ]
            }
          },
          "DeletionPolicy": "Retain",
          "UpdateReplacePolicy": "Retain"
        }
      }
    ]
  },
  "Outputs": {
    "Fn::ForEach::BucketOutputs": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "Fn::ForEach::GetAttLoop": [
          "Property",
          [ "Arn", "DomainName", "WebsiteURL" ],
          {
            "S3Bucket${Identifier}${Property}": {
              "Value": {"Fn::GetAtt": [{"Fn::Sub": "S3Bucket${Identifier}"}, {"Ref": "Property"}]}
            }
          }
        ]
      }
    ]
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-outputs.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  'Fn::ForEach::Buckets':
    - Identifier
    - [A, B, C]
    - 'S3Bucket${Identifier}':
        Type: AWS::S3::Bucket
        Properties:
          AccessControl: PublicRead
          MetricsConfigurations:
            - Id: !Sub 'EntireBucket${Identifier}'
          WebsiteConfiguration:
            IndexDocument: index.html
            ErrorDocument: error.html
            RoutingRules:
              - RoutingRuleCondition:
                  HttpErrorCodeReturnedEquals: '404'
                  KeyPrefixEquals: out1/
                RedirectRule:
                  HostName: ec2-11-22-333-44.compute-1.amazonaws.com
                  ReplaceKeyPrefixWith: report-404/
        DeletionPolicy: Retain
        UpdateReplacePolicy: Retain
Outputs:
  'Fn::ForEach::BucketOutputs':
    - Identifier
    - [A, B, C]
    - 'Fn::ForEach::GetAttLoop':
        - Property
        - [Arn, DomainName, WebsiteURL]
        - 'S3Bucket${Identifier}${Property}':
            Value: !GetAtt [!Sub 'S3Bucket${Identifier}', !Ref Property]
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  S3BucketA:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      MetricsConfigurations:
        - Id: EntireBucketA
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
        RoutingRules:
          - RoutingRuleCondition:
              HttpErrorCodeReturnedEquals: '404'
              KeyPrefixEquals: out1/
            RedirectRule:
              HostName: ec2-11-22-333-44.compute-1.amazonaws.com
              ReplaceKeyPrefixWith: report-404/
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
  S3BucketB:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      MetricsConfigurations:
        - Id: EntireBucketB
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
        RoutingRules:
          - RoutingRuleCondition:
              HttpErrorCodeReturnedEquals: '404'
              KeyPrefixEquals: out1/
            RedirectRule:
              HostName: ec2-11-22-333-44.compute-1.amazonaws.com
              ReplaceKeyPrefixWith: report-404/
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
  S3BucketC:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      MetricsConfigurations:
        - Id: EntireBucketC
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
        RoutingRules:
          - RoutingRuleCondition:
              HttpErrorCodeReturnedEquals: '404'
              KeyPrefixEquals: out1/
            RedirectRule:
              HostName: ec2-11-22-333-44.compute-1.amazonaws.com
              ReplaceKeyPrefixWith: report-404/
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
Outputs:
  S3BucketAArn:
    Value: !GetAtt [S3BucketA, Arn]
  S3BucketADomainName:
    Value: !GetAtt [S3BucketA, DomainName]
  S3BucketAWebsiteURL:
    Value: !GetAtt [S3BucketA, WebsiteURL]
  S3BucketBArn:
    Value: !GetAtt [S3BucketB, Arn]
  S3BucketBDomainName:
    Value: !GetAtt [S3BucketB, DomainName]
  S3BucketBWebsiteURL:
    Value: !GetAtt [S3BucketB, WebsiteURL]
  S3BucketCArn:
    Value: !GetAtt [S3BucketC, Arn]
  S3BucketCDomainName:
    Value: !GetAtt [S3BucketC, DomainName]
  S3BucketCWebsiteURL:
    Value: !GetAtt [S3BucketC, WebsiteURL]
```

## Referencia a los recursos `AWS::EC2::Instance` replicados
<a name="intrinsic-function-reference-foreach-example-replicate-conditions"></a>

En este ejemplo se hace referencia a los recursos replicados en la sección `Resources` mediante los ID lógicos generados. 

### JSON
<a name="intrinsic-function-reference-foreach-example-replicate-conditions.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::LanguageExtensions",
  "Mappings": {
    "Instances": {
      "InstanceType": {
        "B": "m5.4xlarge",
        "C": "c5.2xlarge"
      },
      "ImageId": {"A": "ami-id1"}
    }
  },
  "Resources": {
    "Fn::ForEach::Instances": [
      "Identifier",
      [ "A", "B", "C" ],
      {
        "Instance${Identifier}": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "InstanceType": {"Fn::FindInMap": ["Instances", "InstanceType", {"Ref": "Identifier"}, {"DefaultValue": "m5.xlarge"}]},
            "ImageId": {"Fn::FindInMap": ["Instances", "ImageId", {"Ref": "Identifier"}, {"DefaultValue": "ami-id-default"}]}
          }
        }
      }
    ]
  },
  "Outputs": {
    "SecondInstanceId": {
      "Description": "Instance Id for InstanceB",
      "Value": {"Ref": "InstanceB"}
    },
    "SecondPrivateIp": {
      "Description": "Private IP for InstanceB",
      "Value": {
        "Fn::GetAtt": [
          "InstanceB",
          "PrivateIp"
        ]
      }
    }
  }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-replicate-conditions.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  Instances:
    InstanceType:
      B: m5.4xlarge
      C: c5.2xlarge
    ImageId:
      A: ami-id1
Resources:
  'Fn::ForEach::Instances':
    - Identifier
    - [A, B, C]
    - 'Instance${Identifier}':
        Type: AWS::EC2::Instance
        Properties:
          InstanceType: !FindInMap [Instances, InstanceType, !Ref Identifier, DefaultValue: m5.xlarge]
          ImageId: !FindInMap [Instances, ImageId, !Ref Identifier, DefaultValue: ami-id-default]
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref InstanceB
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
  InstanceA:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.xlarge
      ImageId: ami-id1
  InstanceB:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: m5.4xlarge
      ImageId: ami-id-default
  InstanceC:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: c5.2xlarge
      ImageId: ami-id-default
Outputs:
  SecondInstanceId:
    Description: Instance Id for InstanceB
    Value: !Ref InstanceB
  SecondPrivateIp:
    Description: Private IP for InstanceB
    Value: !GetAtt [InstanceB, PrivateIp]
```

# Ejemplos de `Fn::ForEach` en la sección `Conditions`
<a name="intrinsic-function-reference-foreach-example-conditions"></a>

Estos ejemplos son una demostración del uso de la función intrínseca `Fn::ForEach` en la sección `Conditions`. Para obtener más información sobre esta sección, consulte [Condiciones](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html) en la *Guía del usuario de AWS CloudFormation*.

**importante**  
`Conditions` debe ser la segunda propiedad de la lista o una posterior. La creación de la pila fallará si `Conditions` es la primera propiedad que aparece en el parámetro de fragmento de plantilla de `Fn::ForEach`.

```
Resources:
  'Fn::ForEach::Topics':
    - LogicalId
    - !Ref TopicList
    - '${LogicalId}':
        Condition: !Sub 'TopicCondition${LogicalId}'
        Type: AWS::SNS::Topic
        Properties:
          TopicName: !Sub 'My${LogicalId}'
```

`Conditions` debe agregarse como segunda clave, o posteriormente, para que la creación de la pila se realice correctamente: 

```
Resources:
  'Fn::ForEach::Topics':
    - LogicalId
    - !Ref TopicList
    - '${LogicalId}':
        Type: AWS::SNS::Topic
        Condition: !Sub 'TopicCondition${LogicalId}'
        Properties:
          TopicName: !Sub 'My${LogicalId}'
```

**Topics**
+ [Replicación de una sola condición](#intrinsic-function-reference-foreach-example-replicated-single-condition)

## Replicación de una sola condición
<a name="intrinsic-function-reference-foreach-example-replicated-single-condition"></a>

En este ejemplo, se usa la función intrínseca `Fn::ForEach` en la sección `Conditions` para replicar varias condiciones similares con propiedades diferentes.

### JSON
<a name="intrinsic-function-reference-foreach-example-conditions.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Parameters": {
        "ParamA": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        },
        "ParamB": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        },
        "ParamC": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        },
        "ParamD": {
            "Type": "String",
            "AllowedValues": [
                "true",
                "false"
            ]
        }
    },
    "Conditions": {
        "Fn::ForEach::CheckTrue": [
            "Identifier",
            ["A", "B", "C", "D"],
            {
                "IsParam${Identifier}Enabled": {
                    "Fn::Equals": [
                        {"Ref": {"Fn::Sub": "Param${Identifier}"}},
                        "true"
                    ]
                }
            }
        ]
    },
    "Resources": {
        "WaitConditionHandle": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        }
    }
}
```

### YAML
<a name="intrinsic-function-reference-foreach-example-conditions.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  ParamA:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamB:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamC:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamD:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
Conditions:
  'Fn::ForEach::CheckTrue':
    - Identifier
    - [A, B, C, D]
    - 'IsParam${Identifier}Enabled': !Equals 
        - !Ref 
          'Fn::Sub': 'Param${Identifier}'
        - 'true'
Resources:
  WaitConditionHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

La plantilla transformada será equivalente a la plantilla siguiente:

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  ParamA:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamB:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamC:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
  ParamD:
    Type: String
    AllowedValues:
      - 'true'
      - 'false'
Conditions:
  IsParamAEnabled: !Equals 
    - !Ref ParamA
    - 'true'
  IsParamBEnabled: !Equals 
    - !Ref ParamB
    - 'true'
  IsParamCEnabled: !Equals 
    - !Ref ParamC
    - 'true'
  IsParamDEnabled: !Equals 
    - !Ref ParamD
    - 'true'
Resources:
  WaitConditionHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

# `Fn::GetAtt`
<a name="intrinsic-function-reference-getatt"></a>

La función intrínseca `Fn::GetAtt` devuelve el valor de un atributo de un recurso de la plantilla. 

## Declaración
<a name="getatt-declaration"></a>

### JSON
<a name="intrinsic-function-reference-getatt-syntax.json"></a>

```
{ "Fn::GetAtt" : [ "logicalNameOfResource", "attributeName" ] }
```

### YAML
<a name="intrinsic-function-reference-getatt-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::GetAtt: [ logicalNameOfResource, attributeName ]
```

Sintaxis de la forma abreviada:

```
!GetAtt logicalNameOfResource.attributeName
```

## Parameters
<a name="getatt-parameters"></a>

`logicalNameOfResource`  
El nombre lógico (también denominado *ID lógico*) del recurso que contiene el atributo que desea.

`attributeName`  
El nombre del atributo específico de un recurso cuyo valor desea. Consulte la página de referencia de recursos en busca de detalles sobre los atributos disponibles para ese tipo de recurso.

## Valor devuelto
<a name="intrinsic-function-reference-getatt-return"></a>

El valor del atributo. Para obtener información acerca de los valores de devolución de `GetAtt` para los recursos, consulte la documentación de los recursos en la [Referencia de recursos y propiedades](aws-template-resource-type-ref.md).

## Ejemplos
<a name="intrinsic-function-reference-getatt-examples"></a>

### Devolución de un valor de atributo
<a name="intrinsic-function-reference-getatt-example"></a>

En los siguientes ejemplos se devuelve una cadena que contiene el nombre de DNS del equilibrador de carga con el nombre lógico `myELB`.

#### JSON
<a name="intrinsic-function-reference-getatt-example.json"></a>

```
"Fn::GetAtt" : [ "myELB" , "DNSName" ]
```

#### YAML
<a name="intrinsic-function-reference-getatt-example.yaml"></a>

```
!GetAtt myELB.DNSName
```

#### Devolución de varios valores de atributo
<a name="intrinsic-function-reference-getatt-example2"></a>

Em los siguientes ejemplos se devuelve el `SourceSecurityGroup.OwnerAlias` y el `SourceSecurityGroup.GroupName` del equilibrador de carga con el nombre lógico `myELB`.

##### JSON
<a name="intrinsic-function-reference-getatt-example2.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "myELB": {
            "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
            "Properties": {
                "AvailabilityZones": [
                    "eu-west-1a"
                ],
                "Listeners": [
                    {
                        "LoadBalancerPort": "80",
                        "InstancePort": "80",
                        "Protocol": "HTTP"
                    }
                ]
            }
        },
        "myELBIngressGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "ELB ingress group",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "SourceSecurityGroupOwnerId": {
                            "Fn::GetAtt": [
                                "myELB",
                                "SourceSecurityGroup.OwnerAlias"
                            ]
                        },
                        "SourceSecurityGroupName": {
                            "Fn::GetAtt": [
                                "myELB",
                                "SourceSecurityGroup.GroupName"
                            ]
                        }
                    }
                ]
            }
        }
    }
}
```

##### YAML
<a name="intrinsic-function-reference-getatt-example2.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  myELB:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      AvailabilityZones:
        - eu-west-1a
      Listeners:
        - LoadBalancerPort: '80'
          InstancePort: '80'
          Protocol: HTTP
  myELBIngressGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB ingress group
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupOwnerId: !GetAtt myELB.SourceSecurityGroup.OwnerAlias
          SourceSecurityGroupName: !GetAtt myELB.SourceSecurityGroup.GroupName
```

#### Uso de `Fn::Sub` dentro de la función `Fn::GetAtt`
<a name="intrinsic-function-reference-getatt-foreach"></a>

**nota**  
Cuando utilice la transformación `AWS::LanguageExtensions`, podrá utilizar `Fn::GetAtt` en combinación con otras funciones intrínsecas. Para ver las funciones compatibles, consulte [Funciones compatibles](#getatt-supported-functions).

En los siguientes ejemplos se muestra cómo usar `Fn::GetAtt` con [`Fn::Sub`](intrinsic-function-reference-sub.md), en combinación con [`Fn::ForEach`](intrinsic-function-reference-foreach.md), en la sección `Outputs` de una plantilla para reducir la longitud y nivel de detalle de la plantilla. El uso de `Fn::Sub` dentro de `Fn::GetAtt` permite que la plantilla contenga una única función intrínseca que puede hacer referencia a un bucket diferente en cada iteración de la llamada a `Fn::ForEach`. 

##### JSON
<a name="intrinsic-function-reference-getatt-foreach.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Mappings": {
        "Buckets": {
            "Properties": {
                "Identifiers": ["A", "B", "C"]
            }
        }
    },
    "Resources": {
        "Fn::ForEach::Buckets": [
            "Identifier",
            {"Fn::FindInMap": ["Buckets", "Properties", "Identifiers"]},
            {
                "S3Bucket${Identifier}": {
                    "Type": "AWS::S3::Bucket",
                    "Properties": {
                        "AccessControl": "PublicRead",
                        "MetricsConfigurations": [
                            {
                                "Id": {"Fn::Sub": "EntireBucket${Identifier}"}
                            }
                        ],
                        "WebsiteConfiguration": {
                            "IndexDocument": "index.html",
                            "ErrorDocument": "error.html",
                            "RoutingRules": [
                                {
                                    "RoutingRuleCondition": {
                                        "HttpErrorCodeReturnedEquals": "404",
                                        "KeyPrefixEquals": "out1/"
                                    },
                                    "RedirectRule": {
                                        "HostName": "ec2-11-22-333-44.compute-1.amazonaws.com",
                                        "ReplaceKeyPrefixWith": "report-404/"
                                    }
                                }
                            ]
                        }
                    },
                    "DeletionPolicy": "Retain",
                    "UpdateReplacePolicy": "Retain"
                }
            }
        ]
    },
    "Outputs": {
        "Fn::ForEach::BucketOutputs": [
            "Identifier",
            {"Fn::FindInMap": ["Buckets", "Properties", "Identifiers"]},
            {
                "Fn::ForEach::GetAttLoop": [
                    "Property",
                    ["Arn", "DomainName", "WebsiteURL"],
                    {
                        "S3Bucket${Identifier}${Property}": {
                            "Value": {
                                "Fn::GetAtt": [{"Fn::Sub": "S3Bucket${Identifier}"}, {"Ref": "Property"}]
                            }
                        }
                    }
                ]
            }
        ]
    }
}
```

##### YAML
<a name="intrinsic-function-reference-getatt-foreach.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
  Buckets:
    Properties:
      Identifiers:
        - A
        - B
        - C
Resources:
  'Fn::ForEach::Buckets':
    - Identifier
    - Fn::FindInMap: 
      - Buckets
      - Properties
      - Identifiers
    - 'S3Bucket${Identifier}':
        Type: AWS::S3::Bucket
        Properties:
          AccessControl: PublicRead
          MetricsConfigurations:
            - Id: 
                Fn::Sub: 'EntireBucket${Identifier}'
          WebsiteConfiguration:
            IndexDocument: index.html
            ErrorDocument: error.html
            RoutingRules:
              - RoutingRuleCondition:
                  HttpErrorCodeReturnedEquals: '404'
                  KeyPrefixEquals: out1/
                RedirectRule:
                  HostName: ec2-11-22-333-44.compute-1.amazonaws.com
                  ReplaceKeyPrefixWith: report-404/
        DeletionPolicy: Retain
        UpdateReplacePolicy: Retain
Outputs:
  'Fn::ForEach::BucketOutputs':
    - Identifier
    - Fn::FindInMap:
      - Buckets
      - Properties
      - Identifiers
    - 'Fn::ForEach::GetAttLoop':
        - Property
        - - Arn
          - DomainName
          - WebsiteURL
        - 'S3Bucket${Identifier}${Property}':
            Value: !GetAtt 
              - !Sub 'S3Bucket${Identifier}'
              - !Ref Property
```

## Funciones compatibles
<a name="getatt-supported-functions"></a>

Cuando se usa la [transformación AWS::LanguageExtensions](transform-aws-languageextensions.md), se pueden usar las siguientes funciones dentro de la función `Fn::GetAtt`. Esto se aplica tanto al nombre de recurso lógico de `Fn::GetAtt` como al nombre de atributo de `Fn::GetAtt`.
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ [`Ref`](intrinsic-function-reference-ref.md)

Cuando no se usa la transformación `AWS::LanguageExtensions`:
+ El nombre de atributo de `Fn::GetAtt` solo puede usar la función [`Ref`](intrinsic-function-reference-ref.md).
+ El nombre de recurso lógico de `Fn::GetAtt` no puede usar funciones. Debe especificar una cadena que sea el ID lógico de un recurso. 

# `Fn::GetAZs`
<a name="intrinsic-function-reference-getavailabilityzones"></a>

La función intrínseca `Fn::GetAZs` devuelve una matriz que enumera las zonas de disponibilidad de una región determinada en orden alfabético. Dado que los clientes tienen acceso a diferentes zonas de disponibilidad, la función intrínseca `Fn::GetAZs` permite a los autores de plantillas escribir plantillas que se adaptan al acceso del usuario que llama. De esta forma, no es necesario codificar rígidamente una lista completa de las zonas de disponibilidad de una región determinada.

**importante**  
La función `Fn::GetAZs` devuelve solo las zonas de disponibilidad que tienen una subred predeterminada, a menos que ninguna de las zonas de disponibilidad tenga una subred predeterminada; en ese caso, se devuelven todas las zonas de disponibilidad.  
De forma similar a la respuesta del comando `describe-availability-zones` de AWS CLI, el orden de los resultados de la función `Fn::GetAZs` no está garantizado y puede cambiar cuando se añaden nuevas zonas de disponibilidad.

Permisos de IAM

Los permisos que necesita para utilizar la función `Fn::GetAZs` dependen de la plataforma en la que lance las instancias Amazon EC2. Para ambas plataformas, necesita permisos para las acciones `DescribeAvailabilityZones` y `DescribeAccountAttributes` de Amazon EC2. Para EC2-VPC, también necesita permisos para la acción `DescribeSubnets` de Amazon EC2.

## Declaración
<a name="intrinsic-function-reference-getazs-declaration"></a>

### JSON
<a name="intrinsic-function-reference-getazs-syntax.json"></a>

```
{ "Fn::GetAZs" : "region" }
```

### YAML
<a name="intrinsic-function-reference-getazs-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::GetAZs: region
```

Sintaxis de la forma abreviada:

```
!GetAZs region
```

## Parameters
<a name="intrinsic-function-reference-getazs-parameters"></a>

region  <a name="region"></a>
Es el nombre de la región para la que desea obtener las zonas de disponibilidad.  
Puede utilizar el pseudoparámetro `AWS::Region` para especificar la región en la que se crea la pila. Especificar una cadena vacía equivale a especificar `AWS::Region`.

## Valor devuelto
<a name="intrinsic-function-reference-getazs-return-value"></a>

La lista de las zonas de disponibilidad de la región.

## Ejemplos
<a name="intrinsic-function-reference-getazs-examples"></a>

### Evaluar una región
<a name="intrinsic-function-reference-getazs-examples-evaluate-region"></a>

Para estos ejemplos, CloudFormation evalúa `Fn::GetAZs` según la siguiente matriz, suponiendo que el usuario creó la pila en la región `us-east-1`:

`[ "us-east-1a", "us-east-1b", "us-east-1c", "us-east-1d", "us-east-1e" ]`

#### JSON
<a name="intrinsic-function-reference-getazs-example1.json"></a>

```
1. { "Fn::GetAZs" : "" }
2. { "Fn::GetAZs" : { "Ref" : "AWS::Region" } }
3. { "Fn::GetAZs" : "us-east-1" }
```

#### YAML
<a name="intrinsic-function-reference-getazs-example1.yaml"></a>

```
1. Fn::GetAZs: ""
2. Fn::GetAZs:
3.   Ref: "AWS::Region"
4. Fn::GetAZs: us-east-1
```

 

### Especificación de la zona de disponibilidad de una subred
<a name="intrinsic-function-reference-getazs-examples-subnet-az"></a>

En el siguiente ejemplo utiliza `Fn::GetAZs` para especificar la zona de disponibilidad de una subred:

#### JSON
<a name="intrinsic-function-reference-getazs-example.json"></a>

```
"mySubnet" : {
  "Type" : "AWS::EC2::Subnet",
  "Properties" : {
    "VpcId" : { 
      "Ref" : "VPC"   
    },
    "CidrBlock" : "10.0.0.0/24",
    "AvailabilityZone" : {
      "Fn::Select" : [ 
        0, 
        { 
          "Fn::GetAZs" : "" 
        } 
      ]
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-getazs-example.yaml"></a>

```
mySubnet: 
  Type: AWS::EC2::Subnet
  Properties: 
    VpcId: 
      !Ref VPC
    CidrBlock: 10.0.0.0/24
    AvailabilityZone: 
      Fn::Select: 
        - 0
        - Fn::GetAZs: ""
```

 

### Funciones anidadas con la forma abreviada YAML
<a name="intrinsic-function-reference-getazs-examples-nested-functions"></a>

Los siguientes ejemplos muestran patrones válidos para el uso de funciones intrínsecas anidadas con la forma abreviada YAML. No puede anidar funciones de forma corta consecutivamente, por lo que un patrón como `!GetAZs !Ref` no es válido.

#### YAML
<a name="intrinsic-function-reference-getavailabilityzones-example3.yaml"></a>

```
1. AvailabilityZone: !Select
2.   - 0
3.   - !GetAZs
4.     Ref: 'AWS::Region'
```

#### YAML
<a name="intrinsic-function-reference-getavailabilityzones-example4.yaml"></a>

```
1. AvailabilityZone: !Select
2.   - 0
3.   - Fn::GetAZs: !Ref 'AWS::Region'
```

## Funciones compatibles
<a name="intrinsic-function-reference-getazs-supported-functions"></a>

Puede utilizar la función `Ref` en la función `Fn::GetAZs`.

# `Fn::ImportValue`
<a name="intrinsic-function-reference-importvalue"></a>

La función intrínseca `Fn::ImportValue` devuelve el valor de una salida exportada por otra pila. Esta función se suele utilizar para crear referencias cruzadas entre pilas. Para obtener más información, consulte [Walkthrough: Refer to resource outputs in another CloudFormation stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html) en la *Guía del usuario de AWS CloudFormation*.

En los siguientes fragmentos de código de plantillas de ejemplo, la Pila A exporta valores del grupo de seguridad de la VPC y la Pila B los importa.

**nota**  
Las siguientes restricciones se aplican a las referencias cruzadas entre pilas:  
Para cada Cuenta de AWS, los nombres `Export` deben ser únicos dentro de una región.
No puede crear referencias cruzadas entre regiones. Puede utilizar la función intrínseca `Fn::ImportValue` para importar solo valores que se hayan exportado dentro de la misma región.
Para las salidas, el valor de la propiedad `Name` de un `Export` no puede usar las funciones `Ref` o `GetAtt` que dependen de un recurso.  
Del mismo modo, la función `ImportValue` no puede incluir funciones `Ref` o `GetAtt` que dependen de un recurso.
Después de que otra pila importe un valor de salida, no se puede eliminar la pila que exporta el valor de salida ni modificar el valor de salida exportado. Todas las importaciones deben eliminarse antes de poder eliminar la pila de exportación o modificar el valor de salida.

## JSON
<a name="intrinsic-function-reference-importvalue-export.json"></a>

Exportación de la pila A

```
"Outputs" : {
  "PublicSubnet" : {
    "Description" : "The subnet ID to use for public web servers",
    "Value" :  { "Ref" : "PublicSubnet" },
    "Export" : { "Name" : {"Fn::Sub": "${AWS::StackName}-SubnetID" }}
  },
  "WebServerSecurityGroup" : {
    "Description" : "The security group ID to use for public web servers",
    "Value" :  { "Fn::GetAtt" : ["WebServerSecurityGroup", "GroupId"] },
    "Export" : { "Name" : {"Fn::Sub": "${AWS::StackName}-SecurityGroupID" }}
  }
}
```

## YAML
<a name="intrinsic-function-reference-importvalue-export.yaml"></a>

Exportación de la pila A

```
Outputs:
  PublicSubnet:
    Description: The subnet ID to use for public web servers
    Value:
      Ref: PublicSubnet
    Export:
      Name:
        'Fn::Sub': '${AWS::StackName}-SubnetID'
  WebServerSecurityGroup:
    Description: The security group ID to use for public web servers
    Value:
      'Fn::GetAtt':
        - WebServerSecurityGroup
        - GroupId
    Export:
      Name:
        'Fn::Sub': '${AWS::StackName}-SecurityGroupID'
```

## JSON
<a name="intrinsic-function-reference-importvalue-import.json"></a>

Importación de la Pila B

```
"Resources" : {
  "WebServerInstance" : {
    "Type" : "AWS::EC2::Instance",
    "Properties" : {
      "InstanceType" : "t2.micro",
      "ImageId" : "ami-a1b23456",
      "NetworkInterfaces" : [{
        "GroupSet" : [{"Fn::ImportValue" : {"Fn::Sub" : "${NetworkStackNameParameter}-SecurityGroupID"}}],
        "AssociatePublicIpAddress" : "true",
        "DeviceIndex" : "0",
        "DeleteOnTermination" : "true",
        "SubnetId" : {"Fn::ImportValue" : {"Fn::Sub" : "${NetworkStackNameParameter}-SubnetID"}}
      }]
    }
  }
}
```

## YAML
<a name="intrinsic-function-reference-importvalue-import.yaml"></a>

Importación de la Pila B

```
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-a1b23456
      NetworkInterfaces:
        - GroupSet:
            - Fn::ImportValue: 
              'Fn::Sub': '${NetworkStackNameParameter}-SecurityGroupID'
          AssociatePublicIpAddress: 'true'
          DeviceIndex: '0'
          DeleteOnTermination: 'true'
          SubnetId: Fn::ImportValue: 
            'Fn::Sub': '${NetworkStackNameParameter}-SubnetID'
```

## Declaración
<a name="w2aac24c43c11"></a>

### JSON
<a name="intrinsic-function-reference-importvalue-syntax.json"></a>

```
{ "Fn::ImportValue" : sharedValueToImport }
```

### YAML
<a name="intrinsic-function-reference-importvalue-syntax.yaml"></a>

Puede utilizar el nombre de la función completa:

```
Fn::ImportValue: sharedValueToImport
```

También puede utilizar la forma abreviada:

```
!ImportValue sharedValueToImport
```

**importante**  
No se puede utilizar la forma abreviada de `!ImportValue` cuando contiene la forma abreviada de `!Sub`.   

```
# do not use
!ImportValue
  !Sub '${NetworkStack}-SubnetID'
```
En lugar de ello, debe utilizar el nombre de la función completa, por ejemplo:  

```
Fn::ImportValue:
  !Sub "${NetworkStack}-SubnetID"
```

## Parameters
<a name="w2aac24c43c13"></a>

sharedValueToImport  
El valor de salida de la pila que desea importar.

## Valor devuelto
<a name="w2aac24c43c15"></a>

El valor de salida de la pila.

## Ejemplo
<a name="w2aac24c43c17"></a>

### JSON
<a name="intrinsic-function-reference-importvalue-example.json"></a>

```
{ "Fn::ImportValue" : {"Fn::Sub": "${NetworkStackNameParameter}-SubnetID" } }
```

### YAML
<a name="intrinsic-function-reference-importvalue-example.yaml"></a>

```
Fn::ImportValue:
  !Sub "${NetworkStackName}-SecurityGroupID"
```

## Funciones compatibles
<a name="w2aac24c43c19"></a>

Puede utilizar las siguientes funciones en la función `Fn::ImportValue`. El valor de estas funciones no puede depender de un recurso.
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::If`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

# `Fn::Join`
<a name="intrinsic-function-reference-join"></a>

La función intrínseca `Fn::Join` añade un conjunto de valores a un único valor separado por el delimitador indicado. Si un delimitador es la cadena vacía, el conjunto de valores se concatena sin delimitador.

## Declaración
<a name="w2aac24c48b5"></a>

### JSON
<a name="intrinsic-function-reference-join-syntax.json"></a>

```
{ "Fn::Join" : [ "delimiter", [ comma-delimited list of values ] ] }
```

### YAML
<a name="intrinsic-function-reference-join-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Join: [ delimiter, [ comma-delimited list of values ] ]
```

Sintaxis de la forma abreviada:

```
!Join [ delimiter, [ comma-delimited list of values ] ]
```

## Parameters
<a name="intrinsic-function-reference-join-parameters"></a>

delimiter  
Es el valor que desea que se produzca entre fragmentos. El delimitador solo se producirá entre fragmentos. No terminará el valor final.

ListOfValues  
Es la lista de valores que desea combinar.

## Valor devuelto
<a name="intrinsic-function-reference-join-returnvalues"></a>

La cadena combinada.

## Ejemplos
<a name="intrinsic-function-reference-join-examples"></a>

### Unirse a una matriz de cadenas simple
<a name="intrinsic-function-reference-join-example1"></a>

El ejemplo siguiente devuelve: `"a:b:c"`.

#### JSON
<a name="intrinsic-function-reference-join-example1.json"></a>

```
"Fn::Join" : [ ":", [ "a", "b", "c" ] ]
```

#### YAML
<a name="intrinsic-function-reference-join-example1.yaml"></a>

```
!Join [ ":", [ a, b, c ] ]
```

### Unirse mediante la función ref con parámetros
<a name="intrinsic-function-reference-join-example2"></a>

En el siguiente ejemplo se utiliza `Fn::Join` para construir un valor de cadena. Utiliza la función `Ref` con el parámetro `AWS::Partition` y el pseudoparámetro `AWS::AccountId`.

#### JSON
<a name="intrinsic-function-reference-join-example2.json"></a>

```
{
  "Fn::Join": [
    "", [
      "arn:",
      {
        "Ref": "AWS::Partition"
      },
      ":s3:::elasticbeanstalk-*-",
      {
        "Ref": "AWS::AccountId"
      }
    ]
  ]
}
```

#### YAML
<a name="intrinsic-function-reference-join-example2.yaml"></a>

```
!Join
  - ''
  - - 'arn:'
    - !Ref AWS::Partition
    - ':s3:::elasticbeanstalk-*-'
    - !Ref AWS::AccountId
```

**nota**  
En la función [`Fn::Sub`](intrinsic-function-reference-sub.md) también encontrará una funcionalidad similar.

## Funciones compatibles
<a name="intrinsic-function-reference-join-supportedfunctions"></a>

Para el delimitador `Fn::Join`, no se puede usar ninguna función. Debe especificar un valor de cadena.

Para la lista de valores `Fn::Join`, se pueden usar las siguientes funciones:
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::ImportValue`
+ `Fn::Join`
+ `Fn::Split`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

# `Fn::Length`
<a name="intrinsic-function-reference-length"></a>

La función `Fn::Length` intrínseca devuelve el número de elementos de una matriz o una función intrínseca que devuelve una matriz.

**importante**  
Debe usar la [`AWS::LanguageExtensions`Transformación de](transform-aws-languageextensions.md) para usar la función intrínseca `Fn::Length`.

## Declaración
<a name="length-declaration"></a>

### JSON
<a name="intrinsic-function-reference-length-syntax.json"></a>

```
{ "Fn::Length" : IntrinsicFunction }
```

```
{ "Fn::Length" : Array }
```

### YAML
<a name="intrinsic-function-reference-length-syntax.yaml"></a>

```
Fn::Length : IntrinsicFunction
```

```
Fn::Length : Array
```

## Parameters
<a name="length-parameters"></a>

`IntrinsicFunction`  
La función intrínseca que devuelve una matriz de la que quiere devolver cierta cantidad de elementos.

`Array`  
La matriz de la que quiere devolver el número de elementos.

## Valor devuelto
<a name="intrinsic-function-reference-length-return"></a>

El número de elementos en la función intrínseca que devuelve una matriz o en la matriz que se pasó a la función intrínseca. 

## Ejemplos
<a name="intrinsic-function-reference-length-examples"></a>

### Devolución del número de elementos en una función intrínseca que devuelve una matriz
<a name="intrinsic-function-reference-length-example-subsection"></a>

En este fragmento de código de ejemplo, se devuelve el número de elementos en una función intrínseca que devuelve una matriz. La función devuelve 3.

#### JSON
<a name="intrinsic-function-reference-length-example.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::Length" : {
            "Fn::Split": ["|", "a|b|c"]
        }
//...
}
```

#### YAML
<a name="intrinsic-function-reference-legnth-example.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::Length: 
    !Split ["|", "a|b|c"]
#...
```

### Devolución del número de elementos en una función Ref intrínseca que hace referencia a un tipo de parámetro de lista
<a name="intrinsic-function-reference-length-example2"></a>

En este fragmento de código de ejemplo, se devuelve el número de elementos en una función `Ref` intrínseca que hace referencia a un tipo de parámetro de lista. Si el parámetro con el nombre `ListParameter` es una lista con 3 elementos, la función devuelve 3.

#### JSON
<a name="intrinsic-function-reference-length-example2.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::Length": {
            "Ref": "ListParameter"
        }
//...
}
```

#### YAML
<a name="intrinsic-function-reference-legnth-example2.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::Length: 
    !Ref ListParameter
#...
```

### Devolución de la cantidad de elementos en una matriz
<a name="intrinsic-function-reference-length-example3"></a>

En este fragmento de código de ejemplo se devuelve el número de elementos en una matriz que se pasó a una función intrínseca. La función devuelve 3.

#### JSON
<a name="intrinsic-function-reference-length-example3.json"></a>

```
 1. {
 2. //...
 3.     "Transform": "AWS::LanguageExtensions"
 4.     //...
 5.         "Fn::Length": [
 6.             1,
 7.             {"Ref": "ParameterName"}, 
 8.             3
 9.         ]
10. //...
11. }
```

#### YAML
<a name="intrinsic-function-reference-legnth-example3.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::Length: 
    - 1
    - !Ref ParameterName
    - 3
#...
```

## Funciones compatibles
<a name="length-supported-functions"></a>

Puede usar las siguientes funciones en la función `Fn::Length` intrínseca o la matriz:
+ `Condition Functions`
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::Join`
+ `Fn::Length`
+ `Fn::Select`
+ `Fn::Split`
+ `Fn::Sub`
+ `Fn::ToJsonString`
+ `Ref`

# `Fn::Select`
<a name="intrinsic-function-reference-select"></a>

La función intrínseca `Fn::Select` devuelve un único objeto de una lista de objetos por índice.

**importante**  
`Fn::Select` no comprueba si hay valores nulos o si el índice queda fuera de los límites de la matriz. Ambas condiciones llevarán a un error de pila, por lo que tiene que estar seguro de que el índice que elige sea válido y que la lista contiene valores no nulos.

## Declaración
<a name="w2aac24c58b7"></a>

### JSON
<a name="intrinsic-function-reference-select-syntax.json"></a>

```
{ "Fn::Select" : [ index, listOfObjects ] }
```

### YAML
<a name="intrinsic-function-reference-select-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Select: [ index, listOfObjects ] 
```

Sintaxis de la forma abreviada:

```
!Select [ index, listOfObjects ]
```

## Parameters
<a name="w2aac24c58b9"></a>

índice  
El índice del objeto para recuperar. Tiene que ser un valor de cero a N-1, donde N representa el número de elementos en la matriz.

listOfObjects  
La lista de objetos para seleccionar. Esta lista no debe ser nula, ni puede tener entradas nulas.

## Valor devuelto
<a name="w2aac24c58c11"></a>

El objeto seleccionado.

## Ejemplos
<a name="w2aac24c58c13"></a>

### Ejemplo básico
<a name="w2aac24c58c13b3"></a>

El ejemplo siguiente devuelve: `"grapes"`.

#### JSON
<a name="intrinsic-function-reference-select-example0.json"></a>

```
{ "Fn::Select" : [ "1", [ "apples", "grapes", "oranges", "mangoes" ] ] }
```

#### YAML
<a name="intrinsic-function-reference-select-example0.yaml"></a>

```
!Select [ "1", [ "apples", "grapes", "oranges", "mangoes" ] ]
```

 

### Tipo de parámetros de lista delimitados por comas
<a name="w2aac24c58c13b5"></a>

Puede utilizar `Fn::Select` para seleccionar un objeto de un parámetro `CommaDelimitedList`. Puede utilizar un parámetro `CommaDelimitedList` para combinar los valores de los parámetros relacionados, lo que reduce el número total de parámetros en la plantilla. Por ejemplo, el siguiente parámetro especifica una lista delimitada por comas de tres bloques de CIDR:

#### JSON
<a name="intrinsic-function-reference-select-example1.json"></a>

```
"Parameters" : {
  "DbSubnetIpBlocks": {
    "Description": "Comma-delimited list of three CIDR blocks",
    "Type": "CommaDelimitedList",
      "Default": "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
  }
}
```

#### YAML
<a name="intrinsic-function-reference-select-example1.yaml"></a>

```
Parameters: 
  DbSubnetIpBlocks: 
    Description: "Comma-delimited list of three CIDR blocks"
    Type: CommaDelimitedList
    Default: "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
```

Para especificar uno de los tres bloques de CIDR, utilice `Fn::Select` en la sección Resources de la misma plantilla, tal y como se muestra en el siguiente fragmento de código de ejemplo:

#### JSON
<a name="intrinsic-function-reference-select-example2.json"></a>

```
"Subnet0": {
  "Type": "AWS::EC2::Subnet",
    "Properties": {
      "VpcId": { "Ref": "VPC" },
      "CidrBlock": { "Fn::Select" : [ "0", {"Ref": "DbSubnetIpBlocks"} ] }
    }
}
```

#### YAML
<a name="intrinsic-function-reference-select-example2.yaml"></a>

```
Subnet0: 
  Type: AWS::EC2::Subnet
  Properties: 
    VpcId: !Ref VPC
    CidrBlock: !Select [ 0, !Ref DbSubnetIpBlocks ]
```

 

### Funciones anidadas con la forma abreviada YAML
<a name="w2aac24c58c13b7"></a>

Los siguientes ejemplos muestran patrones válidas para el uso de funciones intrínsecas anidadas con la forma abreviada `!Select`. No puede anidar funciones de forma corta consecutivamente, por lo que un patrón como `!GetAZs !Ref` no es válido.

#### YAML
<a name="intrinsic-function-reference-select-example3.yaml"></a>

```
AvailabilityZone: !Select 
  - 0
  - !GetAZs 
    Ref: 'AWS::Region'
```

#### YAML
<a name="intrinsic-function-reference-select-example4.yaml"></a>

```
AvailabilityZone: !Select 
  - 0
  - Fn::GetAZs: !Ref 'AWS::Region'
```

## Funciones compatibles
<a name="w2aac24c58c15"></a>

Para el valor índice `Fn::Select`, puede utilizar las funciones `Ref` y `Fn::FindInMap`.

Para la lista de objetos `Fn::Select`, puede usar las siguientes funciones:
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::Split`
+ `Ref`

# `Fn::Split`
<a name="intrinsic-function-reference-split"></a>

Para dividir una cadena en una lista de valores de cadena, para poder seleccionar un elemento de la lista de cadenas resultante, utilice la función intrínseca `Fn::Split`. Especifique la ubicación de divisiones con un delimitador, como `,` (una coma). Después de dividir una cadena, utilice la función [`Fn::Select`](intrinsic-function-reference-select.md) para elegir un elemento específico.

Por ejemplo, si una cadena delimitada por comas de IDs de subred se importa a la plantilla de pila, puede dividir la cadena en cada coma. Desde la lista de IDs de subred, use la función intrínseca `Fn::Select` para especificar un ID de subred de un recurso.

## Declaración
<a name="w2aac24c62b7"></a>

### JSON
<a name="intrinsic-function-reference-split-syntax.json"></a>

```
{ "Fn::Split" : [ "delimiter", "source string" ] }
```

### YAML
<a name="intrinsic-function-reference-split-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Split: [ delimiter, source string ]
```

Sintaxis de la forma abreviada:

```
!Split [ delimiter, source string ]
```

## Parameters
<a name="w2aac24c62b9"></a>

Debe especificar ambos parámetros.

delimiter  
Un valor de cadena que determina dónde se divide la cadena de origen.

cadena de origen  
El valor de cadena que desee dividir.

## Valor devuelto
<a name="w2aac24c62c11"></a>

Una lista de los valores de cadena.

## Ejemplos
<a name="w2aac24c62c13"></a>

Los siguientes ejemplos muestran el comportamiento de la función `Fn::Split`.

### Lista simple
<a name="w2aac24c62c13b5"></a>

El siguiente ejemplo divide una cadena en cada barra vertical (`|`). La función devuelve `["a", "b", "c"]`.

#### JSON
<a name="intrinsic-function-reference-split-example.json"></a>

```
{ "Fn::Split" : [ "|" , "a|b|c" ] }
```

#### YAML
<a name="intrinsic-function-reference-split-example.yaml"></a>

```
!Split [ "|" , "a|b|c" ]
```

 

### Lista con valores de cadenas vacíos
<a name="w2aac24c62c13b7"></a>

Si divide una cadena con delimitadores consecutivos, la lista resultante incluirá una cadena vacía. El siguiente ejemplo muestra cómo se divide una cadena con dos delimitadores consecutivos y un delimitador agregado. La función devuelve `["a", "", "c", ""]`.

#### JSON
<a name="w2aac24c62c13b7b5"></a>

```
{ "Fn::Split" : [ "|" , "a||c|" ] }
```

#### YAML
<a name="w2aac24c62c13b7b7"></a>

```
!Split [ "|" , "a||c|" ]
```

 

### Dividir un valor de salida importado
<a name="w2aac24c62c13b9"></a>

En el siguiente ejemplo se divide un valor de salida importada y, a continuación, selecciona el tercer elemento de la lista resultante de IDs de subred, tal y como especifica la función `Fn::Select`.

#### JSON
<a name="w2aac24c62c13b9b5"></a>

```
{ "Fn::Select" : [ "2", { "Fn::Split": [",", {"Fn::ImportValue": "AccountSubnetIDs"}]}] }
```

#### YAML
<a name="w2aac24c62c13b9b7"></a>

```
!Select [2, !Split [",", !ImportValue AccountSubnetIDs]]
```

## Funciones compatibles
<a name="w2aac24c62c15"></a>

Para el delimitador `Fn::Split`, no se puede usar ninguna función. Debe especificar un valor de cadena.

Para la lista de valores `Fn::Split`, se pueden usar las siguientes funciones:
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::ImportValue`
+ `Fn::Join`
+ `Fn::Select`
+ `Fn::Sub`
+ `Ref`

# `Fn::Sub`
<a name="intrinsic-function-reference-sub"></a>

La función intrínseca `Fn::Sub` sustituye variables en una cadena de entrada por los valores que especifique. En las plantillas, puede utilizar esta función para construir comandos o salidas que incluyen valores que no están disponibles hasta que crea o actualiza una pila.

## Declaración
<a name="intrinsic-function-reference-sub-declaration"></a>

En las secciones siguientes se muestra la sintaxis de la función.

### JSON
<a name="intrinsic-function-reference-sub-syntax.json"></a>

```
{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }
```

Si está sustituyendo solamente parámetros de plantilla, ID lógicos de recursos o atributos de recursos en el parámetro `String`, no especifique un mapa de variables.

```
{ "Fn::Sub" : String }
```

### YAML
<a name="intrinsic-function-reference-sub-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Sub:
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value
```

Sintaxis de la forma abreviada:

```
!Sub
  - String
  - Var1Name: Var1Value
    Var2Name: Var2Value
```

Si está sustituyendo solamente parámetros de plantilla, ID lógicos de recursos o atributos de recursos en el parámetro `String`, no especifique un mapa de variables.

Sintaxis del nombre de función completo:

```
Fn::Sub: String
```

Sintaxis de la forma abreviada:

```
!Sub String
```

## Parameters
<a name="w2aac24c66b7"></a>

`String`  
Una cadena con variables que CloudFormation sustituye por los valores asociados durante el tiempo de ejecución. Escriba variables como `${MyVarName}`. Las variables pueden ser los nombres de parámetros de plantilla, ID lógicos de recursos, atributos de recursos o una asignación clave-valor. Si especifica únicamente nombres de parámetros de plantilla, ID de recursos lógicos y atributos de recursos, no especifique una asignación clave-valor.  
Si especifica nombres de parámetros de plantilla o ID lógicos de recursos, como por ejemplo `${InstanceTypeParameter}`, CloudFormation devuelve los mismos valores que si utiliza la función intrínseca `Ref`. Si especifica atributos de recursos, como por ejemplo `${MyInstance.PublicIp}`, CloudFormation devuelve los mismos valores que si utiliza la función intrínseca `Fn::GetAtt`.  
Para escribir un símbolo de dólar y llaves (`${}`) literalmente, agregue una exclamación (`!`) después de la llave de apertura, como, por ejemplo, `${!Literal}`. CloudFormation resuelve este texto como `${Literal}`.  
Si está utilizando una plantilla de lanzamiento, agregue una barra invertida `\` antes del signo del dólar, por ejemplo `\${!Literal}`, de lo contrario el literal se resolverá como una cadena vacía.

`VarName`  
El nombre de una variable que incluyó en el parámetro `String`.

`VarValue`  
El valor que CloudFormation sustituye para el nombre de variable asociada durante el tiempo de ejecución.

## Valor devuelto
<a name="w2aac24c66b9"></a>

CloudFormation devuelve la cadena original y sustituye los valores para todas las variables.

## Ejemplos
<a name="w2aac24c66c11"></a>

Los siguientes ejemplos muestran cómo utilizar la función `Fn::Sub`.

### Uso de `Fn::Sub` sin una asignación de clave-valor
<a name="w2aac24c66c11b5"></a>

En este sencillo ejemplo, la descripción del recurso `InstanceSecurityGroup` se crea dinámicamente con el pseudoparámetro `AWS::StackName`. Por ejemplo, si el nombre de la pila es “VPC-EC2-ALB-Stack”, la descripción resultante es “SSH security group for VPC-EC2-ALB-Stack”.

#### JSON
<a name="intrinsic-function-reference-sub-example-1.json"></a>

```
"InstanceSecurityGroup" : {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
        "GroupDescription" : {"Fn::Sub": "SSH security group for ${AWS::StackName}"}
}}
```

#### YAML
<a name="intrinsic-function-reference-sub-example-1.yaml"></a>

```
InstanceSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: !Sub "SSH security group for ${AWS::StackName}"
```

### Uso de `Fn::Sub` con una asignación de clave-valor
<a name="w2aac24c66c11b7"></a>

En este ejemplo, el nombre del recurso `WWWBucket` se crea dinámicamente con una asignación de clave-valor. La función `Fn::Sub` sustituye a `${Domain}` en la cadena de entrada `www.${Domain}` por el valor de una función `Ref` que hace referencia al parámetro `RootDomainName` definido en la misma plantilla de pila. Por ejemplo, si el nombre del dominio raíz es “mydomain.com”, el nombre resultante de este recurso es “www.mydomain.com”.

#### JSON
<a name="intrinsic-function-reference-sub-example-2.json"></a>

```
"WWWBucket":{
  "Type":"AWS::S3::Bucket",
  "Properties":{
    "BucketName":{
      "Fn::Sub":[
        "www.${Domain}",
        {
          "Domain":{
            "Ref":"RootDomainName"
          }
        }
      ]
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-sub-example-2.yaml"></a>

```
  WWWBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub
        - 'www.${Domain}'
        - Domain: !Ref RootDomainName
```

### Uso de diversas variables para construir los ARN
<a name="w2aac24c66c11b9"></a>

En el siguiente ejemplo se utiliza `Fn::Sub` con los pseudoparámetros `AWS::Region` y `AWS::AccountId`, y el ID lógico de recurso `vpc` para crear un nombre de recurso de Amazon (ARN) de una VPC.

#### JSON
<a name="intrinsic-function-reference-sub-example-3.json"></a>

```
{ "Fn::Sub": "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}" }
```

#### YAML
<a name="intrinsic-function-reference-sub-example-3.yaml"></a>

```
!Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
```

### Transferencia de los valores de los parámetros a los scripts de datos de usuario
<a name="w2aac24c66c11c11"></a>

En el siguiente ejemplo, se utiliza `Fn::Sub` para sustituir los pseudoparámetros `AWS::StackName` y `AWS::Region` del nombre de pila real, y la región durante el tiempo de ejecución.

#### JSON
<a name="intrinsic-function-reference-sub-example.json"></a>

Por ejemplo, el ejemplo de JSON utiliza la función `Fn::Join` para separar cada comando, en lugar de especificar la totalidad del script de datos del usuario en un valor de cadena individual.

```
"UserData": { "Fn::Base64": { "Fn::Join": ["\n", [
  "#!/bin/bash -xe",
  "yum update -y aws-cfn-bootstrap",
  { "Fn::Sub": "/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}" },
  { "Fn::Sub": "/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}" }]]
}}
```

#### YAML
<a name="intrinsic-function-reference-sub-example.yaml"></a>

El ejemplo de YAML utiliza un bloque literal para especificar el script de datos del usuario.

```
UserData:
  Fn::Base64:
    !Sub |
      #!/bin/bash -xe
      yum update -y aws-cfn-bootstrap
      /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}
      /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
```

### Especificación de valores condicionales con asignaciones
<a name="w2aac24c66c11c13"></a>

En este ejemplo, el nombre del recurso de `myLogGroup` se crea dinámicamente mediante la sustitución de la variable `log_group_name` por el valor resultante de la función `Fn::FindInMap`.

#### JSON
<a name="intrinsic-function-reference-sub-example-5.json"></a>

```
{
  "Mappings": {
    "LogGroupMapping": {
      "Test": {
        "Name": "test_log_group"
      },
      "Prod": {
        "Name": "prod_log_group"
      }
    }
  },
  "Resources": {
    "myLogGroup": {
      "Type": "AWS::Logs::LogGroup",
      "Properties": {
        "LogGroupName": {
          "Fn::Sub": [
            "cloud_watch_${log_group_name}",
            {
              "log_group_name": {
                "Fn::FindInMap": [
                  "LogGroupMapping",
                  "Test",
                  "Name"
                ]
              }
            }
          ]
        }
      }
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-sub-example-5.yaml"></a>

```
Mappings:
  LogGroupMapping:
    Test:
      Name: test_log_group
    Prod:
      Name: prod_log_group
Resources:
  myLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub 
        - 'cloud_watch_${log_group_name}'
        - log_group_name: !FindInMap 
            - LogGroupMapping
            - Test
            - Name
```

## Funciones compatibles
<a name="intrinsic-function-reference-sub-supported-functions"></a>

Para el parámetro `String`, no se puede usar ninguna función. Debe especificar un valor de cadena.

Para los parámetros `VarName` y `VarValue`, puede utilizar las siguientes funciones:
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::GetAtt`](intrinsic-function-reference-getatt.md)
+ [`Fn::GetAZs`](intrinsic-function-reference-getavailabilityzones.md)
+ [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Select`](intrinsic-function-reference-select.md)
+ [`Fn::Sub`](#intrinsic-function-reference-sub)
+ [`Ref`](intrinsic-function-reference-ref.md)

# `Fn::ToJsonString`
<a name="intrinsic-function-reference-ToJsonString"></a>

La función `Fn::ToJsonString` intrínseca convierte un objeto o una matriz en su cadena JSON correspondiente.

**importante**  
Debe usar la [`AWS::LanguageExtensions`Transformación de](transform-aws-languageextensions.md) para usar la función intrínseca `Fn::ToJsonString`.

## Declaración
<a name="tojsonstring-declaration"></a>

### JSON
<a name="intrinsic-function-reference-tojsonstring-syntax.json"></a>

```
{ "Fn::ToJsonString": Object }
```

```
{ "Fn::ToJsonString": Array }
```

### YAML
<a name="intrinsic-function-reference-tojsonstring-syntax.yaml"></a>

```
Fn::ToJsonString: Object
```

```
Fn::ToJsonString: Array
```

## Parameters
<a name="tojsonstring-parameters"></a>

`Object`  
El objeto que quiera convertir en una cadena JSON.

`Array`  
La matriz que quiera convertir en una cadena JSON.

## Valor devuelto
<a name="intrinsic-function-reference-tojsonstring-return"></a>

El objeto o la matriz convertidos en una cadena JSON. 

## Ejemplos
<a name="intrinsic-function-reference-tojsonstring-examples"></a>

### Conversión de un objeto en una cadena JSON
<a name="intrinsic-function-reference-tojsonstring-example-subsection"></a>

En este fragmento de código de ejemplo se convierte el objeto que se pasó a la función intrínseca en una cadena JSON.

#### JSON
<a name="intrinsic-function-reference-tojsonstring-example.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::ToJsonString": {
            "key1": "value1",
            "key2": { 
                "Ref": "ParameterName"
            }
        }
//...
}
```

#### YAML
<a name="intrinsic-function-reference-tojsonstring-example.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::ToJsonString: 
    key1: value1
    key2: !Ref ParameterName
#...
```

En ambos ejemplos, si de `Ref` a `ParameterName` resulta ser `resolvedValue`, la función se resuelve en la siguiente cadena JSON:

```
"{\"key1\":\"value1\",\"key2\":\"resolvedValue\"}"
```

### Conversión de una matriz en una cadena JSON
<a name="intrinsic-function-reference-tojsonstring-example2"></a>

En este fragmento de código de ejemplo convierte la matriz que se pasó a la función intrínseca en una cadena JSON.

#### JSON
<a name="intrinsic-function-reference-tojsonstring-example2.json"></a>

```
{
//...
    "Transform": "AWS::LanguageExtensions"
    //...
        "Fn::ToJsonString": [{
            "key1": "value1",
            "key2": { 
                "Ref": "ParameterName" 
            }
        }]
//...
}
```

#### YAML
<a name="intrinsic-function-reference-tojsonstring-example2.yaml"></a>

```
Transform: 'AWS::LanguageExtensions'
#...
  Fn::ToJsonString: 
    - key1: value1
      key2: !Ref ParameterName
#...
```

En ambos ejemplos, si de `Ref` a `ParameterName` resulta ser `resolvedValue`, la función se resuelve en la siguiente cadena JSON:

```
"[{\"key1\":\"value1\"},{\"key2\":\"resolvedValue\"}]"
```

## Funciones compatibles
<a name="tojsonstring-supported-functions"></a>

Puede usar las siguientes funciones en la función `Fn::ToJsonString` intrínseca o la matriz:
+ `Fn::Base64`
+ `Fn::FindInMap`
+ `Fn::GetAtt`
+ `Fn::GetAZs`
+ `Fn::If`
+ `Fn::ImportValue`
+ `Fn::Join`
+ `Fn::Length`
+ `Fn::Select`
+ `Fn::Split`
+ `Fn::Sub`
+ `Fn::ToJsonString`
+ `Ref`

# `Fn::Transform`
<a name="intrinsic-function-reference-transform"></a>

la función intrínseca `Fn::Transform` especifica una macro para realizar un procesamiento personalizado en parte de una plantilla de pila. Las macros le permiten realizar un procesamiento personalizado de plantillas, desde acciones sencillas como operaciones de búsqueda y reemplazo, hasta amplias transformaciones de plantillas completas. Para obtener más información, consulte [Uso de macros de CloudFormation para llevar a cabo un procesamiento personalizado en plantillas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html) en la *Guía del usuario de AWS CloudFormation*.

También puede utilizar `Fn::Transform` para llamar a la transformación [`AWS::Include`Transformación de](transform-aws-include.md), que es una macro alojado por CloudFormation.

## Declaración
<a name="intrinsic-function-reference-transform-declaration"></a>

### JSON
<a name="intrinsic-function-reference-transform-syntax.json"></a>

Sintaxis del nombre de función completo:

```
{
    "Fn::Transform": {
        "Name": "macro name",
        "Parameters": {
            "Key": "value"
        }
    }
}
```

Sintaxis de la forma abreviada:

```
{
    "Transform": {
        "Name": "macro name",
        "Parameters": {
            "Key": "value"
        }
    }
}
```

### YAML
<a name="intrinsic-function-reference-transform-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Fn::Transform:
  Name : macro name
  Parameters :
    Key : value
```

Sintaxis de la forma abreviada:

```
!Transform
  Name: macro name
  Parameters:
    Key: value
```

## Parameters
<a name="intrinsic-function-reference-transform-parameters"></a>

`Name`  
El nombre de la macro que desea que realice el procesamiento.

`Parameters`  
Los parámetros de la lista, especificados como pares clave-valor, que se van a pasar a la macro.

## Valor devuelto
<a name="intrinsic-function-reference-transform-returnvalue"></a>

El fragmento de código de la plantilla procesada que se incluirá en la plantilla de pila procesada.

## Ejemplos
<a name="intrinsic-function-reference-transform-examples"></a>

En el siguiente ejemplo se llama a la transformación `AWS::Include` especificando que la ubicación desde la que se recuperará un fragmento de código de plantilla se pasa en el parámetro `InputValue`.

### JSON
<a name="intrinsic-function-reference-transform-example-1.json"></a>

```
{
    "Fn::Transform": {
        "Name": "AWS::Include",
        "Parameters": {
            "Location": {
                "Ref": "InputValue"
            }
        }
    }
}
```

### YAML
<a name="intrinsic-function-reference-transform-example-1.yaml"></a>

```
Fn::Transform:
  Name: AWS::Include
  Parameters:
    Location: !Ref InputValue
```

## Funciones compatibles
<a name="intrinsic-function-reference-transform-supported-functions"></a>

Ninguna.

CloudFormation transmite las llamadas de función intrínseca en `Fn::Transform` a la macro especificada como cadenas literales.

# `Ref`
<a name="intrinsic-function-reference-ref"></a>

La función intrínseca `Ref` devuelve el valor de un parámetro, recurso u otra función intrínseca específicos. Esta función se suele utilizar para crear referencias entre los recursos de una plantilla de CloudFormation. 

## Declaración
<a name="ref-declaration"></a>

### JSON
<a name="intrinsic-function-reference-ref-syntax.json"></a>

```
{ "Ref" : "logicalName" }
```

```
{ "Ref" : "IntrinsicFunction" }
```

### YAML
<a name="intrinsic-function-reference-ref-syntax.yaml"></a>

Sintaxis del nombre de función completo:

```
Ref: logicalName
```

```
Ref:
   IntrinsicFunction
```

Sintaxis de la forma abreviada:

```
!Ref logicalName
```

```
!Ref
   IntrinsicFunction
```

## Parameters
<a name="ref-parameters"></a>

logicalName  
El nombre lógico del recurso o parámetro del que quiera quitar la referencia.

IntrinsicFunction  
La función intrínseca que se resuelve en una cadena válida. Debe contener referencias a parámetros o identificadores, y no debe contener identificadores lógicos de recursos.

## Valor devuelto
<a name="ref-return-value"></a>

El valor devuelto de `Ref` depende del tipo de entidad a la que se hace referencia:
+ Al especificar el nombre lógico de un parámetro, devuelve el valor del parámetro. Para obtener más información, consulte [Sintaxis de Parameters de la plantilla de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html).
+ Al especificar el nombre lógico de un recurso, devuelve un valor que se utiliza para identificar dicho recurso. Normalmente, ese es el nombre del recurso. Sin embargo, para algunos recursos, se devuelve un identificador que tenga otro significado importante en el contexto del recurso. Por ejemplo, el recurso `AWS::EC2::EIP` devuelve la dirección IP, y `AWS::EC2::Instance` devuelve el ID de la instancia. Para obtener más información acerca de los valores de devolución de `Ref` para un recurso, consulte la documentación de dicho recurso en la [Referencia de recursos y propiedades](aws-template-resource-type-ref.md).
+ Al especificar una función intrínseca, devuelve la salida de esa función.

## Ejemplos
<a name="ref-examples"></a>

### Creación de referencias entre recursos
<a name="intrinsic-function-reference-ref-example"></a>

La siguiente declaración de recursos para una dirección IP elástica necesita el ID de instancia de una instancia de EC2. Utiliza la función `Ref` para especificar el ID de instancia del recurso `MyEC2Instance` declarado en otra parte de la plantilla.

#### JSON
<a name="intrinsic-function-reference-ref-example.json"></a>

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Resources":{
  
      ...
  
    "MyEIP":{
      "Type":"AWS::EC2::EIP",
      "Properties":{
        "InstanceId":{
          "Ref":"MyEC2Instance"
        }
      }
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-ref-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Resources:

  ...

  MyEIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref MyEC2Instance
```

### Devolución de un identificador de recurso como salida de la pila
<a name="intrinsic-function-reference-ref-example-2"></a>

En los siguientes ejemplos se muestra cómo utilizar la función `Ref` para devolver el nombre de un bucket de Amazon S3 con el nombre lógico `MyBucket` como salida de la pila. 

#### JSON
<a name="intrinsic-function-reference-ref-example-2.json"></a>

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Resources":{
    "MyBucket":{
      "Type":"AWS::S3::Bucket",
      "Properties":{
        "BucketName":{
          "Fn::Sub": "${AWS::StackName}-mybucket"
        }
      }
    }
  },
  "Outputs":{
    "BucketNameOutput":{
      "Description":"The name of the S3 bucket",
      "Value":{
        "Ref":"MyBucket"
      }
    }
  }
}
```

#### YAML
<a name="intrinsic-function-reference-ref-example-2.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${AWS::StackName}-mybucket

Outputs:
  BucketNameOutput:
    Description: The name of the S3 bucket
    Value: !Ref MyBucket
```

### Uso de la función intrínseca `Fn::Join` dentro de la función `Ref`
<a name="ref-example-intrinsic-functions-multiple-stages"></a>

**nota**  
Cuando utilice la transformación `AWS::LanguageExtensions`, podrá utilizar `Ref` en combinación con otras funciones intrínsecas. Para ver las funciones compatibles, consulte [Funciones compatibles](#ref-supported-functions).

En los siguientes ejemplos se muestra cómo establecer los identificadores de los recursos mediante la función intrínseca `Fn::Sub`, las condiciones y la entrada del parámetro `Stage`. A continuación, las funciones `Ref` y `Fn::GetAtt` hacen referencia a los valores apropiados, en función de la etapa. `Fn::Sub` se usa primero con `Fn::GetAtt` para obtener el ARN de la cola de Amazon SQS adecuada para establecer las dimensiones de la alarma de Amazon CloudWatch. A continuación, [`Fn::Join`](intrinsic-function-reference-join.md) se utiliza con `Ref` para crear el nombre del tema de SNS de la propiedad `AlarmActions`. 

#### JSON
<a name="ref-example-intrinsic-functions-multiple-stages.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Transform": "AWS::LanguageExtensions",
    "Parameters": {
        "Stage": {
            "Type": "String",
            "Default": "Dev",
            "AllowedValues": [
                "Dev",
                "Prod"
            ]
        }
    },
    "Conditions": {
        "isProd": {
            "Fn::Equals": [
                {"Ref": "Stage"},
                "Prod"
            ]
        },
        "isDev": {
            "Fn::Equals": [
                {"Ref": "Stage"},
                "Dev"
            ]
        }
    },
    "Resources": {
        "DevQueue": {
            "Type": "AWS::SQS::Queue",
            "Condition": "isDev",
            "Properties": {
                "QueueName": {"Fn::Sub": "My${Stage}Queue"}
            }
        },
        "ProdQueue": {
            "Type": "AWS::SQS::Queue",
            "Condition": "isProd",
            "Properties": {
                "QueueName": {"Fn::Sub": "My${Stage}Queue"}
            }
        },
        "DevTopic": {
            "Condition": "isDev",
            "Type": "AWS::SNS::Topic"
        },
        "ProdTopic": {
            "Condition": "isProd",
            "Type": "AWS::SNS::Topic"
        },
        "MyAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "Alarm if queue depth grows beyond 10 messages",
                "Namespace": "AWS/SQS",
                "MetricName": "ApproximateNumberOfMessagesVisible",
                "Dimensions":[
                    {
                        "Name": {"Fn::Sub": "${Stage}Queue"},
                        "Value": {"Fn::GetAtt": [{"Fn::Sub": "${Stage}Queue"}, "QueueName"]}
                    }
                ],
                "Statistic": "Sum",
                "Period": 300,
                "EvaluationPeriods": 1,
                "Threshold": 10,
                "ComparisonOperator": "GreaterThanThreshold",
                "AlarmActions": [
                    {
                        "Ref": {"Fn::Join": ["", [{"Ref": "Stage"}, "Topic"]]}
                    }
                ]
            }
        }
    }
}
```

#### YAML
<a name="ref-example-intrinsic-functions-multiple-stages.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Parameters:
  Stage:
    Type: String
    Default: Dev
    AllowedValues:
      - Dev
      - Prod
Conditions:
  isProd: !Equals 
    - !Ref Stage
    - Prod
  isDev: !Equals 
    - !Ref Stage
    - Dev
Resources:
  DevQueue:
    Type: AWS::SQS::Queue
    Condition: isDev
    Properties:
      QueueName: !Sub My${Stage}Queue
  ProdQueu:
    Type: AWS::SQS::Queue
    Condition: isProd
    Properties:
      QueueName: !Sub My${Stage}Queue
  DevTopic:
    Condition: isDev
    Type: AWS::SNS::Topic
  ProdTopic:
    Condition: isProd
    Type: AWS::SNS::Topic
  MyAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: Alarm if queue depth grows beyond 10 messages
      Namespace: AWS/SQS
      MetricName: ApproximateNumberOfMessagesVisible
      Dimensions:
        - Name: !Sub '${Stage}Queue'
          Value: !GetAtt 
            - !Sub '${Stage}Queue'
            - QueueName
      Statistic: Sum
      Period: 300
      EvaluationPeriods: 1
      Threshold: 10
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - !Ref 
          'Fn::Join':
            - ''
            - - !Ref Stage
              - Topic
```

## Funciones compatibles
<a name="ref-supported-functions"></a>

Cuando se usa la [transformación AWS::LanguageExtensions](transform-aws-languageextensions.md), se pueden usar las siguientes funciones dentro de la función `Ref`.
+ [`Fn::Base64`](intrinsic-function-reference-base64.md)
+ [`Fn::FindInMap`](intrinsic-function-reference-findinmap.md)
+ [`Fn::If`](intrinsic-function-reference-conditions.md#intrinsic-function-reference-conditions-if)
+ [`Fn::ImportValue`](intrinsic-function-reference-importvalue.md)
+ [`Fn::Join`](intrinsic-function-reference-join.md)
+ [`Fn::Sub`](intrinsic-function-reference-sub.md)
+ [`Fn::ToJsonString`](intrinsic-function-reference-ToJsonString.md)
+ `Ref`

# Funciones de reglas
<a name="intrinsic-function-reference-rules"></a>

Las funciones de regla son funciones especiales que solo funcionan en la sección `Rules` de una plantilla de CloudFormation. Estas funciones ayudan a validar los valores de los parámetros con una lógica personalizada. Todas las validaciones se realizan antes de que CloudFormation cree o actualice cualquier recurso.

Las reglas son útiles cuando las restricciones de los parámetros estándar no son suficientes. Por ejemplo, cuando SSL está habilitado, se debe proporcionar tanto un certificado como un nombre de dominio. Una regla puede garantizar que se cumplan estas dependencias.

Puede utilizar funciones intrínsecas en la condición o en las declaraciones de una regla; por ejemplo, `Fn::Equals`, `Fn::Not` y `Fn::RefAll`. La propiedad de condición determina si CloudFormation aplicará las declaraciones. Si la condición se evalúa como `true`, CloudFormation evalúa las declaraciones para comprobar si el valor de un parámetro es válido en el momento de crear o actualizar una pila. Si un valor de parámetro no es válido, CloudFormation no crea ni actualiza la pila. Si la condición se evalúa como `false`, CloudFormation no comprueba el valor del parámetro y procede a llevar a cabo la operación de la pila.

Si es la primera vez que utiliza reglas en sus plantillas, recomendamos consulta primero el tema de [sintaxis de Rules de las plantillas de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/rules-section-structure.html) en la *Guía del usuario de AWS CloudFormation*.

**Topics**
+ [`Fn::And`](#fn-and)
+ [`Fn::Contains`](#fn-contains)
+ [`Fn::EachMemberEquals`](#fn-eachmemberequals)
+ [`Fn::EachMemberIn`](#fn-eachmemberin)
+ [`Fn::Equals`](#fn-equals)
+ [`Fn::Not`](#fn-not)
+ [`Fn::Or`](#fn-or)
+ [`Fn::RefAll`](#fn-refall)
+ [`Fn::ValueOf`](#fn-valueof)
+ [`Fn::ValueOfAll`](#fn-valueofall)
+ [Funciones compatibles](#supported-rule-functions)
+ [Atributos admitidos](#rules-parameter-attributes)

## `Fn::And`
<a name="fn-and"></a>

Devuelve `true` si todas las condiciones especificadas se evalúan como `true`; devuelve `false` si alguna de las condiciones se evalúa como `false`. `Fn::And` actúa como operador AND. El número mínimo de condiciones que puede incluir es de dos y el máximo es de diez.

### Declaración
<a name="fn-and-declaration"></a>

```
"Fn::And" : [{condition}, {...}]
```

### Parámetros
<a name="fn-and-parameters"></a>

*condition*  
Una función intrínseca específica de una regla que se evalúa en `true` o en `false`.

### Ejemplo
<a name="fn-and-example"></a>

En el siguiente ejemplo, la condición se evalúa en `true` si el nombre del grupo de seguridad al que se hace referencia es igual a `sg-mysggroup` y si el valor del parámetro `InstanceType` es `t3.large` o `t3.small`:

```
"Fn::And": [
  {
    "Fn::Equals": [
      "sg-mysggroup",
      {"Ref": "ASecurityGroup"}
    ]
  },
  {
    "Fn::Contains": [
      [
        "t3.large",
        "t3.small"
      ],
      {"Ref": "InstanceType"}
    ]
  }
]
```

## `Fn::Contains`
<a name="fn-contains"></a>

Devuelve `true` si una cadena especificada coincide con al menos uno de los valores de una lista de cadenas.

### Declaración
<a name="fn-contains-declaration"></a>

```
"Fn::Contains" : [[list_of_strings], string]
```

### Parámetros
<a name="fn-contains-parameters"></a>

*list\$1of\$1strings*  
Una lista de cadenas, como `"A", "B", "C"`.

*cadena*  
Una cadena, como `"A"`, que se desea comparar con una lista de cadenas.

### Ejemplo
<a name="fn-contains-example"></a>

La siguiente función se evalúa en `true` si el valor del parámetro `InstanceType` figura en la lista (`t3.large` o `t3.small`):

```
"Fn::Contains" : [
  ["t3.large", "t3.small"], {"Ref" : "InstanceType"}
]
```

## `Fn::EachMemberEquals`
<a name="fn-eachmemberequals"></a>

Devuelve `true` si una cadena especificada coincide con todos los valores de una lista.

### Declaración
<a name="fn-eachmemberequals-declaration"></a>

```
"Fn::EachMemberEquals" : [[list_of_strings], string]
```

### Parámetros
<a name="fn-eachmemberequals-parameters"></a>

*list\$1of\$1strings*  
Una lista de cadenas, como `"A", "B", "C"`.

*cadena*  
Una cadena, como `"A"`, que se desea comparar con una lista de cadenas.

### Ejemplo
<a name="fn-eachmemberequals-example"></a>

La siguiente función devuelve `true` si la etiqueta `Department` para todos los parámetros de tipo `AWS::EC2::VPC::Id` tiene un valor de `IT`:

```
"Fn::EachMemberEquals" : [
  {"Fn::ValueOfAll" : ["AWS::EC2::VPC::Id", "Tags.Department"]}, "IT"
]
```

## `Fn::EachMemberIn`
<a name="fn-eachmemberin"></a>

Devuelve `true` si cada miembro de una lista de cadenas coincide con al menos un valor de una segunda lista de cadenas.

### Declaración
<a name="fn-eachmemberin-declaration"></a>

```
"Fn::EachMemberIn" : [[strings_to_check], [strings_to_match]]
```

### Parámetros
<a name="fn-eachmemberin-parameters"></a>

*strings\$1to\$1check*  
Una lista de cadenas, como `"A", "B", "C"`. CloudFormation comprueba si cada miembro del parámetro `strings_to_check` está presente en el parámetro `strings_to_match`.

*strings\$1to\$1match*  
Una lista de cadenas, como `"A", "B", "C"`. Cada miembro del parámetro `strings_to_match` se compara con los miembros del parámetro `strings_to_check`.

### Ejemplo
<a name="fn-eachmemberin-example"></a>

La siguiente función comprueba si los usuarios especifican una subred que pertenece a una nube virtual privada (VPC). La VPC debe encontrarse en la cuenta y la región en las que los usuarios trabajan con la pila. La función se aplica a todos los parámetros de tipo `AWS::EC2::Subnet::Id`.

```
"Fn::EachMemberIn" : [ 
  {"Fn::ValueOfAll" : ["AWS::EC2::Subnet::Id", "VpcId"]}, {"Fn::RefAll" : "AWS::EC2::VPC::Id"}
]
```

## `Fn::Equals`
<a name="fn-equals"></a>

Compara dos valores para determinar si son iguales. Devuelve `true` si los dos valores son iguales y `false` si no lo son.

### Declaración
<a name="fn-equals-declaration"></a>

```
"Fn::Equals" : ["value_1", "value_2"]
```

### Parámetros
<a name="fn-equals-parameters"></a>

*`value`*  
Un valor de cualquier tipo que se desea comparar con otro valor.

### Ejemplo
<a name="fn-equals-example"></a>

El ejemplo siguiente se evalúa en `true` si el valor del parámetro `EnvironmentType` es igual a `prod`:

```
"Fn::Equals" : [{"Ref" : "EnvironmentType"}, "prod"]
```

## `Fn::Not`
<a name="fn-not"></a>

Devuelve `true` para una condición que se evalúa en `false` y devuelve `false` para una condición que se evalúa en `true`. `Fn::Not` actúa como operador NOT.

### Declaración
<a name="fn-not-declaration"></a>

```
"Fn::Not" : [{condition}]
```

### Parámetros
<a name="fn-not-parameters"></a>

*`condition`*  
Una función intrínseca específica de una regla que se evalúa en `true` o en `false`.

### Ejemplo
<a name="fn-not-example"></a>

El ejemplo siguiente se evalúa como `true` si el valor del parámetro `EnvironmentType` no es igual a `prod`:

```
"Fn::Not" : [{"Fn::Equals" : [{"Ref" : "EnvironmentType"}, "prod"]}]
```

## `Fn::Or`
<a name="fn-or"></a>

Devuelve `true` si cualquiera de las condiciones especificadas se evalúa como `true`; devuelve `false` si todas las condiciones se evalúan como `false`. `Fn::Or` actúa como operador OR. El número mínimo de condiciones que puede incluir es de dos y el máximo es de diez.

### Declaración
<a name="fn-or-declaration"></a>

```
"Fn::Or" : [{condition}, {...}]
```

### Parámetros
<a name="fn-or-parameters"></a>

*`condition`*  
Una función intrínseca específica de una regla que se evalúa en `true` o en `false`.

### Ejemplo
<a name="fn-or-example"></a>

En el siguiente ejemplo, la condición se evalúa en `true` si el nombre del grupo de seguridad al que se hace referencia es igual a `sg-mysggroup` o si el valor del parámetro `InstanceType` es `t3.large` o `t3.small`:

```
"Fn::Or" : [
  {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]},
  {"Fn::Contains" : [["t3.large", "t3.small"], {"Ref" : "InstanceType"}]}
]
```

## `Fn::RefAll`
<a name="fn-refall"></a>

Devuelve todos los valores de un tipo de parámetro determinado.

### Declaración
<a name="fn-refall-declaration"></a>

```
"Fn::RefAll" : "parameter_type"
```

### Parámetros
<a name="fn-refall-parameters"></a>

*parameter\$1type*  
Tipo de parámetro específico de AWS, como `AWS::EC2::SecurityGroup::Id` o `AWS::EC2::VPC::Id`. Para obtener más información, consulte [Tipos de parámetros específicos de AWS compatibles](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-supplied-parameter-types.html#aws-specific-parameter-types-supported) en la *Guía del usuario de AWS CloudFormation*.

### Ejemplo
<a name="fn-refall-example"></a>

La siguiente función devuelve una lista de todos los ID de VPC de la región, y la Cuenta de AWS en los que se crea o actualiza la pila:

```
"Fn::RefAll" : "AWS::EC2::VPC::Id"
```

## `Fn::ValueOf`
<a name="fn-valueof"></a>

Devuelve un valor de atributo o una lista de valores para un parámetro y un atributo específicos.

### Declaración
<a name="fn-valueof-declaration"></a>

```
"Fn::ValueOf" : [ "parameter_logical_id", "attribute" ]
```

### Parámetros
<a name="fn-valueof-parameters"></a>

*atributo*  
El nombre de un atributo del cual recuperar un valor. Para obtener más información acerca de los atributos, consulte [Atributos admitidos](#rules-parameter-attributes).

*parameter\$1logical\$1id*  
Nombre de un parámetro del cual recuperar valores de atributo. El parámetro debe declararse en la sección `Parameters` de la plantilla.

### Ejemplos
<a name="fn-valueof-examples"></a>

El siguiente ejemplo devuelve el valor de la etiqueta `Department` de la VPC que se especifica en el parámetro `ElbVpc`:

```
"Fn::ValueOf" : ["ElbVpc", "Tags.Department"]
```

Si especifica varios valores para un parámetro, la función Fn::ValueOf puede devolver una lista. Por ejemplo, puede especificar varias subredes y obtener una lista de zonas de disponibilidad en la que cada miembro sea la zona de disponibilidad de una subred determinada:

```
"Fn::ValueOf" : ["ListOfElbSubnets", "AvailabilityZone"]
```

## `Fn::ValueOfAll`
<a name="fn-valueofall"></a>

Devuelve una lista de todos los valores de atributo de un tipo de parámetro y un atributo determinados.

### Declaración
<a name="fn-valueofall-declaration"></a>

```
"Fn::ValueOfAll" : ["parameter_type", "attribute"]
```

### Parámetros
<a name="fn-valueofall-parameters"></a>

*atributo*  
El nombre de un atributo del que desea recuperar un valor. Para obtener más información acerca de los atributos, consulte [Atributos admitidos](#rules-parameter-attributes).

*parameter\$1type*  
Tipo de parámetro específico de AWS, como `AWS::EC2::SecurityGroup::Id` o `AWS::EC2::VPC::Id`. Para obtener más información, consulte [Tipos de parámetros específicos de AWS compatibles](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-supplied-parameter-types.html#aws-specific-parameter-types-supported) en la *Guía del usuario de AWS CloudFormation*.

### Ejemplo
<a name="fn-valueofall-example"></a>

En el siguiente ejemplo, la función `Fn::ValueOfAll` devuelve una lista de valores en la que cada miembro es el valor de la etiqueta `Department` de las VPC que tienen esa etiqueta:

```
"Fn::ValueOfAll" : ["AWS::EC2::VPC::Id", "Tags.Department"]
```

## Funciones compatibles
<a name="supported-rule-functions"></a>

No puede utilizar otra función en las funciones `Fn::ValueOf` y `Fn::ValueOfAll`. No obstante, puede utilizar las siguientes funciones dentro de todas las demás funciones intrínsecas específicas de reglas:
+ `Ref`
+ Otras funciones intrínsecas específicas de reglas

## Atributos admitidos
<a name="rules-parameter-attributes"></a>

En la siguiente lista se describen los valores de los atributos que puede recuperar para recursos y tipos de parámetros concretos:

El tipo de parámetro `AWS::EC2::VPC::Id` o los identificadores de la VPC.  
+ DefaultNetworkAcl
+ DefaultSecurityGroup
+ Tags.*tag\$1key*

El tipo de parámetro `AWS::EC2::Subnet::Id` o los ID de subred  
+ AvailabilityZone
+ Tags.*tag\$1key*
+ VpcId

El tipo de parámetro `AWS::EC2::SecurityGroup::Id` o los identificadores de grupo de seguridad.  
+ Tags.*tag\$1key*