

# Trabajo con plantillas de CloudFormation
<a name="template-guide"></a>

Una plantilla de AWS CloudFormation define los recursos de AWS que desea crear, actualizar o eliminar como parte de una pila. Tiene varias secciones, pero la única necesaria es la sección de [Resources](resources-section-structure.md), que debe declarar al menos un recurso. 

Puede crear plantillas mediante uno de los siguientes métodos:
+ **AWS Infrastructure Composer**: una interfaz visual para diseñar plantillas.
+ **Editor de texto**: escriba plantillas directamente en la sintaxis JSON o YAML.
+ **Generador de IaC**: genere plantillas a partir de los recursos aprovisionados en su cuenta que CloudFormation no administra actualmente. El generador de IaC funciona con una amplia gama de recursos compatibles con la API de Cloud Control en su región.

En esta sección se proporciona una guía completa sobre cómo utilizar las distintas secciones de una plantilla de CloudFormation y cómo empezar a crear plantillas de pila. Abarca los siguientes temas:

**Topics**
+ [Dónde se almacenan las plantillas](#where-they-get-stored)
+ [Validación de plantillas](#template-validation)
+ [Introducción a las plantillas](#getting-started)
+ [Plantillas de ejemplo](#sample-templates)
+ [Formato de plantilla](template-formats.md)
+ [Secciones de la plantilla](template-anatomy.md)
+ [Infrastructure Composer](infrastructure-composer-for-cloudformation.md)
+ [Servidor de lenguaje de AWS CloudFormation](ide-extension.md)
+ [Generador de IaC](generate-IaC.md)
+ [Obtención de valores almacenados en otros servicios](dynamic-references.md)
+ [Obtención de valores de AWS](pseudo-parameter-reference.md)
+ [Obtención de salidas de pila](using-cfn-stack-exports.md)
+ [Definición de recursos existentes en tiempo de ejecución](cloudformation-supplied-parameter-types.md)
+ [Tutoriales](walkthroughs.md)
+ [Fragmentos de plantillas](template-snippets.md)
+ [Pilas basadas en Windows](cfn-windows-stacks.md)
+ [Uso de los tipos de recursos que brinda CloudFormation](cloudformation-supplied-resource-types.md)
+ [Creación de configuraciones de recursos reutilizables con módulos](modules.md)

## Dónde se almacenan las plantillas
<a name="where-they-get-stored"></a>

**Bucket de Amazon S3**  
Puede almacenar plantillas de CloudFormation en un bucket de Amazon S3. Al crear o actualizar una pila, puede especificar la URL de S3 de la plantilla en lugar de cargarla directamente.

Si carga las plantillas directamente a través de Consola de administración de AWS o AWS CLI, automáticamente se creará un bucket de S3. Para obtener más información, consulte [Creación de una pila en la consola de CloudFormation](cfn-console-create-stack.md).

**Repositorio de Git**  
Con la [sincronización de Git](git-sync.md), puede almacenar plantillas en un repositorio de Git. Al crear o actualizar una pila, puede especificar la ubicación y la rama del repositorio de Git que contiene la plantilla en lugar de subirla directamente o referenciar a una URL de S3. CloudFormation supervisa automáticamente el repositorio y la rama especificados para detectar cambios en las plantillas. Para obtener más información, consulte [Creación de una pila a partir del código fuente del repositorio con sincronización de Git](git-sync-create-stack-from-repository-source-code.md).

## Validación de plantillas
<a name="template-validation"></a>

**Validación de la sintaxis**  
Puede comprobar la sintaxis JSON o YAML de la plantilla con el comando [validate-template](service_code_examples.md#validate-template-sdk) de la CLI o al especificar la plantilla en la consola. La consola realiza la validación automáticamente. Para obtener más información, consulte [Creación de una pila en la consola de CloudFormation](cfn-console-create-stack.md). 

Sin embargo, estos métodos solo verifican la sintaxis de la plantilla y no validan los valores de propiedad que especificó para un recurso.

**Herramientas de validación adicionales**  
Para validaciones más complejas y comprobaciones de prácticas recomendadas, puede usar herramientas adicionales como:
+ [CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint): valida las plantillas con los [esquemas del proveedor de recursos de CloudFormation.](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html) Incluye comprobar los valores válidos de las propiedades de los recursos y las prácticas recomendadas.
+ [CloudFormation Rain (rain fmt)](https://github.com/aws-cloudformation/rain): formatea sus plantillas de CloudFormation según un estándar coherente o cambia el formato de una plantilla de JSON a YAML (o de YAML a JSON). Conserva los comentarios cuando se usa YAML y, siempre que sea posible, cambia el uso de funciones intrínsecas a una sintaxis corta.

## Introducción a las plantillas
<a name="getting-started"></a>

Para empezar a crear una plantilla de CloudFormation, siga estos pasos:

1. **Elegir los recursos**: identifique los recursos de AWS que desea incluir en su pila, como las instancias de EC2, las VPC, los grupos de seguridad, etc.

1. **Redactar la plantilla**: escriba la plantilla en formato JSON o YAML y defina los recursos y sus propiedades.

1. **Guardar la plantilla**: guarde la plantilla localmente con una extensión de archivo como: `.json`, `.yaml` o `.txt`.

1. **Validar la plantilla**: valide la plantilla con los métodos descritos en la sección [Validación de plantillas](#template-validation).

1. **Crear una pila**: cree una pila con la plantilla validada. 

### Planee usar la plantilla de referencia de CloudFormation
<a name="additional-resources"></a>

A medida que vaya redactando las plantillas, encontrará documentación sobre la sintaxis detallada de los distintos tipos de recursos en la [referencia de tipos de recursos y propiedades de AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

A menudo, las plantillas de pila requieren funciones intrínsecas para asignar valores de propiedad que no están disponibles hasta el tiempo de ejecución y atributos especiales para controlar el comportamiento de los recursos. A medida que redacte la plantilla, consulte los siguientes recursos para obtener orientación:
+ [Referencia de funciones intrínsecas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html): algunas de las funciones intrínsecas más utilizadas incluyen a las siguientes:
  + `Ref`: recupera el valor del parámetro o el ID físico de un recurso.
  + `Sub`: sustituye los marcadores de posición de las cadenas por valores reales.
  + `GetAtt`: devuelve el valor de un atributo de un recurso de la plantilla.
  + `Join`: une un conjunto de valores en una sola cadena.
+ [Referencia de atributos de recursos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html): algunos de los atributos especiales más utilizados incluyen a las siguientes:
  + `DependsOn`: use este atributo para especificar que un recurso debe crearse después de otro.
  + `DeletionPolicy`: use este atributo para especificar cómo debe manejar CloudFormation la eliminación de un recurso.

## Plantillas de ejemplo
<a name="sample-templates"></a>

CloudFormation proporciona plantillas de pila de código abierto que puede utilizar para empezar. Para obtener más información, consulte [Plantillas de CloudFormation de muestra](https://github.com/aws-cloudformation/aws-cloudformation-templates) en el sitio web de GitHub.

Tenga en cuenta que no se pretende que estas plantillas estén listas para la producción. Debería tomarse el tiempo necesario para aprender cómo funcionan, adaptarlas a sus necesidades y asegurarse de que cumplan con los estándares de cumplimiento de su empresa.

Cada plantilla de este repositorio pasa las comprobaciones de [CloudFormation Linter](https://github.com/aws-cloudformation/cfn-lint) (cfn-lint) y también un conjunto básico de reglas AWS CloudFormation Guard basadas en las 20 principales de Center for Internet Security (CIS), con la excepción de algunas reglas en las que tenía sentido mantener la muestra centrada en un único caso de uso.

# Formato de plantilla de CloudFormation
<a name="template-formats"></a>

Puede crear plantillas de CloudFormation en formatos JSON o YAML. Ambos formatos tienen el mismo propósito, pero ofrecen claras ventajas en términos de legibilidad y complejidad.
+ **JSON**: JSON es un formato de intercambio de datos ligero que las máquinas pueden analizar y generar fácilmente. Sin embargo, leer y escribir puede ser engorroso para los humanos, en especial en configuraciones complejas. En JSON, la plantilla se estructura mediante llaves `{}` y corchetes `[]` anidados para definir los recursos, los parámetros y otros componentes. Su sintaxis requiere una declaración explícita de cada elemento, lo que puede hacer que la plantilla sea más detallada, pero garantiza el cumplimiento estricto de un formato estructurado. 
+ **YAML**: YAML está diseñado para ser más legible y menos detallado que JSON. Usa indentación en lugar de llaves y corchetes para indicar el anidamiento, lo que puede facilitar la visualización de la jerarquía de recursos y parámetros. A menudo se prefiere YAML por su claridad y facilidad de uso, en especial cuando se trata de plantillas más complejas. Sin embargo, el hecho de que YAML dependa de la indentación puede provocar errores si el espaciado no es uniforme, lo que requiere una atención cuidadosa para mantener la precisión.

## Estructura de la plantilla
<a name="template-structure"></a>

Las plantillas de CloudFormation se dividen en diversas secciones y cada una de ellas está diseñada para contener un tipo específico de información. Algunas secciones deben declararse en un orden específico y, en el caso de otras, el orden no importa. Sin embargo, al crear la plantilla, puede ser útil utilizar el orden lógico del siguiente ejemplo, ya que los valores de una sección podrían estar relacionados con los valores de una sección anterior. 

Al crear plantillas, no use secciones principales duplicadas, por ejemplo, la sección `Resources`. Aunque CloudFormation puede aceptar la plantilla, esta puede tener un comportamiento indefinido al procesarla, lo que podría resultar en el aprovisionamiento incorrecto de recursos o en la devolución de errores inexplicables.

### JSON
<a name="template-structure.json"></a>

En el siguiente ejemplo se muestra la estructura de una plantilla con formato JSON con todas las secciones disponibles.

```
{
  "AWSTemplateFormatVersion" : "version date",

  "Description" : "JSON string",

  "Metadata" : {
    template metadata
  },

  "Parameters" : {
    set of parameters
  },
  
  "Rules" : {
    set of rules
  },

  "Mappings" : {
    set of mappings
  },

  "Conditions" : {
    set of conditions
  },

  "Transform" : {
    set of transforms
  },

  "Resources" : {
    set of resources
  },
  
  "Outputs" : {
    set of outputs
  }
}
```

### YAML
<a name="template-structure.yaml"></a>

En el siguiente ejemplo se muestra la estructura de una plantilla en formato YAML con todas las secciones disponibles.

```
---
AWSTemplateFormatVersion: version date

Description:
  String

Metadata:
  template metadata

Parameters:
  set of parameters

Rules:
  set of rules

Mappings:
  set of mappings

Conditions:
  set of conditions

Transform:
  set of transforms

Resources:
  set of resources

Outputs:
  set of outputs
```

## Comentarios
<a name="template-comments"></a>

En las plantillas con formato JSON, no se admiten comentarios. JSON, por diseño, no incluye una sintaxis para los comentarios, lo que significa que no se pueden agregar comentarios directamente dentro de la estructura de JSON. Sin embargo, si necesita incluir notas explicativas o documentación, puede agregar metadatos. Para obtener más información, consulte [Metadata atributo](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).

En las plantillas con formato YAML, puede incluir comentarios en línea con el símbolo `#`.

El siguiente ejemplo muestra una plantilla YAML con comentarios en línea.

```
AWSTemplateFormatVersion: 2010-09-09
Description: A sample CloudFormation template with YAML comments.
# Resources section
Resources:
  MyEC2Instance: 
    Type: AWS::EC2::Instance
    Properties: 
      # Linux AMI
      ImageId: ami-1234567890abcdef0 
      InstanceType: t2.micro
      KeyName: MyKey
      BlockDeviceMappings:
        - DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20
```

## Especificaciones
<a name="template-formats.supported-specifications"></a>

CloudFormation es compatible con las siguientes especificaciones de JSON y YAML:

JSON  
CloudFormation sigue el estándar JSON ECMA-404. Para obtener más información sobre el formato JSON, consulte [http://www.json.org](http://www.json.org).

YAML  
CloudFormation admite la especificación YAML versión 1.1 con algunas excepciones. CloudFormation no admite las siguientes características:  
+ Las etiquetas `binary`, `omap`, `pairs`, `set` y `timestamp`
+ Alias
+ Fusiones de hash
Para obtener más información acerca de YAML, consulte [http://yaml.org/](https://yaml.org/).

## Más información
<a name="template-formats.learnmore"></a>

Para cada recurso que especifique en su plantilla, debe definir sus propiedades y valores mediante las reglas de sintaxis específicas de JSON o YAML. Para obtener más información acerca de la sintaxis de la plantilla para cada formato, consulte [Secciones de la plantilla de CloudFormation](template-anatomy.md).

# Uso de expresiones regulares en plantillas de CloudFormation
<a name="cfn-regexes"></a>

Puede utilizar expresiones regulares (conocidas habitualmente como regexes) en una serie de lugares en sus plantillas de CloudFormation, como, por ejemplo, para la propiedad `AllowedPattern` al crear un [parámetro](parameters-section-structure.md) de plantilla.

Todas las expresiones regulares en CloudFormation cumplen la sintaxis de expresiones regulares de Java. Para obtener una descripción completa de la sintaxis de expresiones regulares de Java y sus constructos, consulte [java.util.regex.Pattern](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Pattern.html).

Si escribe la plantilla de CloudFormation en sintaxis JSON, debe aplicar escape cualquier carácter de barra invertida (\$1) en la expresión regular mediante la incorporación de una barra invertida adicional. Esto se debe a que JSON interpreta las barras invertidas como caracteres de escape, y necesita aplicarles escape para asegurarse de que se tratan como barras invertidas literales en la expresión regular.

Por ejemplo, si incluye una `\d` en su expresión regular para que coincida con un dígito, tendrá que escribirlo como `\\d` en su plantilla de JSON.

En el ejemplo siguiente, la propiedad `AllowedPattern` especifica una expresión regular que coincide con cuatro caracteres de dígitos consecutivos (`\d{4}`). Sin embargo, dado que la expresión regular se define en una plantilla JSON, es necesario aplicar escape al carácter de barra invertida con una barra invertida adicional (`\\d`).

```
{
  "Parameters": {
    "MyParameter": {
      "Type": "String",
      "AllowedPattern": "\\d{4}"
    }
  }
}
```

Si escribe la plantilla de CloudFormation en la sintaxis YAML, debe escribir la expresión regular entre comillas simples (“). No se necesita aplicar una secuencia de escape adicional.

```
Parameters:
  MyParameter:
    Type: String
    AllowedPattern: '\d{4}'
```

**nota**  
Las expresiones regulares en CloudFormation solo se admiten con fines de validación en contextos específicos, como `AllowedPattern`. No se admiten como operaciones de coincidencia de patrones en las funciones intrínsecas de CloudFormation, como `Fn::Equals`, que solo realiza una comparación exacta de cadenas, no una coincidencia de patrones.

# Secciones de la plantilla de CloudFormation
<a name="template-anatomy"></a>

Cada plantilla de CloudFormation consta de una o más secciones, cada una con un propósito específico. 

La sección **Recursos** es obligatoria en todas las plantillas de CloudFormation y constituye el núcleo de la plantilla. Esta sección especifica los recursos de la pila y sus propiedades, como una instancia de Amazon EC2 o un bucket de Amazon S3. Cada recurso se define con un identificador lógico único, un tipo y detalles de configuración específicos. 

La sección de **Parámetros**, si bien es opcional, desempeña un rol importante a la hora de hacer que las plantillas sean más flexibles. Permite a los usuarios pasar valores en tiempo de ejecución al crear o actualizar una pila. Se puede referenciar estos parámetros en las secciones `Resources` y `Outputs` y, de este modo, se puede personalizar sin alterar la propia plantilla. Por ejemplo, puede usar los parámetros para especificar los tipos de instancias o la configuración del entorno que varían de una implementación a otra.

La sección **Salidas**, también opcional, define los valores que se devuelven al ver las propiedades de una pila. Los resultados ofrecen información útil, como identificadores de recursos o URL, que se pueden utilizar con fines operativos o para integrarlos con otras pilas. Esta sección ayuda a los usuarios a recuperar y utilizar detalles importantes sobre los recursos creados por la plantilla.

Otras secciones opcionales incluyen las **Asignaciones**, que funcionan como tablas de búsqueda para administrar los valores condicionales. Con las asignaciones, se definen pares clave-valor y se utilizan con la función intrínseca `Fn::FindInMap` en las secciones `Resources` y `Outputs`. Esto resulta útil en situaciones en las que es necesario ajustar las configuraciones según condiciones tales como Región de AWS o el entorno.

Las secciones **Metadatos** y **Reglas**, aunque se utilizan con menos frecuencia, ofrecen funciones adicionales. `Metadata` puede incluir información adicional sobre la plantilla, mientras que `Rules` valida un parámetro o una combinación de parámetros durante la creación o las actualizaciones de la pila, lo que garantiza que se cumplan criterios específicos. La sección **Condiciones** mejora aún más la flexibilidad al controlar si determinados recursos se crean o si a las propiedades se les asigna un valor según condiciones como el tipo de entorno.

Por último, la sección **Transformar** se utiliza para aplicar macros durante el procesamiento de la plantilla. Para las aplicaciones sin servidor (también denominadas aplicaciones de Lambda), especifica la versión de [AWS Serverless Application Model (AWS SAM)](https://github.com/awslabs/serverless-application-specification) que hay que utilizar. Cuando especifique una transformación, puede utilizar sintaxis AWS SAM para declarar los recursos en la plantilla. El modelo define la sintaxis que puede utilizar y la forma en la que se procesa. También puede usar la transformación `AWS::Include` para incluir fragmentos de plantilla que se almacenan por separado de la plantilla principal de CloudFormation. 

Los siguientes temas brindan más información y ejemplos de uso de cada sección.

**Topics**
+ [Resources](resources-section-structure.md)
+ [Parameters](parameters-section-structure.md)
+ [Outputs](outputs-section-structure.md)
+ [Mappings](mappings-section-structure.md)
+ [Metadata](metadata-section-structure.md)
+ [Rules](rules-section-structure.md)
+ [Conditions](conditions-section-structure.md)
+ [Transform](transform-section-structure.md)
+ [Versión del formato](format-version-structure.md)
+ [Description](template-description-structure.md)

# Sintaxis de Resources de la plantilla de CloudFormation
<a name="resources-section-structure"></a>

La sección `Resources` es una sección de nivel superior obligatoria en una plantilla de CloudFormation. Declara los recursos de AWS que usted desea que CloudFormation aprovisione y configure como parte de su pila.

## Sintaxis
<a name="resources-section-structure-syntax"></a>

La sección `Resources` usa la siguiente sintaxis:

### JSON
<a name="resources-section-structure-syntax.json"></a>

```
"Resources" : {
    "LogicalResourceName1" : {
        "Type" : "AWS::ServiceName::ResourceType",
        "Properties" : {
            "PropertyName1" : "PropertyValue1",
            ...
        }
    },

    "LogicalResourceName2" : {
        "Type" : "AWS::ServiceName::ResourceType",
        "Properties" : {
            "PropertyName1" : "PropertyValue1",
            ...
        }
    }
}
```

### YAML
<a name="resources-section-structure-syntax.yaml"></a>

```
Resources:
  LogicalResourceName1:
    Type: AWS::ServiceName::ResourceType
    Properties:
      PropertyName1: PropertyValue1
      ...

  LogicalResourceName2:
    Type: AWS::ServiceName::ResourceType
    Properties:
      PropertyName1: PropertyValue1
      ...
```

## ID lógico (también denominado *nombre lógico*)
<a name="resources-section-logical-id"></a>

En una plantilla de CloudFormation, los recursos se identifican por sus nombres de recursos lógicos. Estos nombres deben ser alfanuméricos (A-Za-z0-9) y únicos dentro de la plantilla. Los nombres lógicos se usan para referenciar a los recursos de otras secciones de la plantilla. 

## Tipo de recurso
<a name="resources-section-resource-type"></a>

Cada recurso debe tener un atributo `Type`, que define el tipo de recurso de AWS que es. El atributo `Type` tiene el formato `AWS::ServiceName::ResourceType`. Por ejemplo, el atributo `Type` de un bucket de Amazon S3 es `AWS::S3::Bucket`. 

Para obtener una lista completa de los tipos de recursos compatibles, consulte [Referencia de tipos de recursos y propiedades de AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

## Propiedades de recursos
<a name="resources-section-resource-properties"></a>

Las propiedades de recursos son opciones adicionales que puede especificar para definir los detalles de configuración para un tipo de recurso específico. Algunas propiedades son obligatorias, mientras que otras son opcionales. Algunas propiedades tienen valores predeterminados, por lo que especificarlas es opcional.

Para obtener información sobre las propiedades compatibles con cada tipo de recurso, consulte los temas en [Referencia de tipos de recursos y propiedades de AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

Los valores de la propiedad pueden ser cadenas literales, listas de cadenas, booleanos, referencias dinámicas, referencias de parámetros, pseudoreferencias o el valor devuelto por una función. En los siguientes ejemplos, se indica cómo declarar diferentes tipos de valores de propiedades:

### JSON
<a name="resource-properties-example.json"></a>

```
"Properties" : {
    "String" : "A string value",
    "Number" : 123,
    "LiteralList" : [ "first-value", "second-value" ],
    "Boolean" : true
}
```

### YAML
<a name="resource-properties-example.yaml"></a>

```
Properties:
  String: A string value 
  Number: 123
  LiteralList:
    - first-value
    - second-value
  Boolean: true
```

## ID físicos
<a name="resources-section-physical-id"></a>

Además de lo IDs lógicos, determinados recursos también tienen un ID físico, que es el nombre asignado real de dicho recurso, como un ID de instancia de EC2 o un nombre de bucket de S3. Utilice los ID físicos para identificar recursos fuera de las plantillas de CloudFormation, pero solo después de que se hayan creado los recursos. Por ejemplo, suponga que da a un recurso de instancia de EC2 un ID lógico de `MyEC2Instance`. Cuando CloudFormation crea la instancia, CloudFormation genera y asigna automáticamente un ID físico (como por ejemplo `i-1234567890abcdef0`) a la instancia. Puede utilizar este ID físico para identificar la instancia y ver sus propiedades (como, por ejemplo, el nombre de DNS) a través de la consola de Amazon EC2. 

Para los buckets de Amazon S3 y muchos otros recursos, CloudFormation genera automáticamente un nombre físico único para el recurso si no se especifica uno de forma explícita. Este nombre físico se basa en una combinación del nombre de la pila de CloudFormation, el nombre lógico del recurso especificado en la plantilla de CloudFormation y un identificador único. Por ejemplo, si tiene un bucket de Amazon S3 con el nombre lógico `MyBucket` en una pila con nombre `MyStack`, CloudFormation podría dar nombre al bucket con el nombre físico `MyStack-MyBucket-abcdefghijk1`.

En el caso de los recursos compatibles con los nombres personalizados, puede asignar sus propios nombres para identificar rápidamente los recursos. Por ejemplo, puede denominar un bucket de S3 que almacena registros `MyPerformanceLogs`. Para obtener más información, consulte [Tipo de nombre](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-name.html).

## Recursos de referencia
<a name="using-cross-resource-references"></a>

A menudo, es necesario establecer las propiedades de un recurso en función del nombre o la propiedad de otro recurso. Por ejemplo, puede crear una instancia de EC2 que utilice los grupos de seguridad de EC2 o una distribución de CloudFront respladada por un bucket de S3. Todos estos recursos se pueden crear en la misma plantilla de CloudFormation. 

CloudFormation proporciona funciones intrínsecas que puede utilizar para hacer referencia a otros recursos y sus propiedades. Estas funciones le permiten crear dependencias entre los recursos y pasar valores de un recurso a otro.

### La función de `Ref`
<a name="resource-properties-ref"></a>

Por lo general, la función `Ref` se utiliza para recuperar una propiedad de identificación de los recursos definidos en la misma plantilla de CloudFormation. Los resultados dependen del tipo de recurso. En la mayoría de recursos, devuelve el nombre físico del recurso. Sin embargo, es posible que algunos tipos de recurso devuelvan un valor diferente, como, por ejemplo, una dirección IP para un recurso `AWS::EC2::EIP` o un Nombre de recurso de Amazon (ARN) para un tema de Amazon SNS. 

Los siguientes ejemplos muestran cómo utilizar la función `Ref` en propiedades. En cada uno de estos ejemplos, el resultado de la función `Ref` será el nombre real del recurso `LogicalResourceName` declarado en otra parte de la plantilla. El ejemplo de sintaxis `!Ref` del ejemplo del archivo YAML es solo una forma más corta de escribir la función `Ref`.

#### JSON
<a name="resource-properties-ref-example.json"></a>

```
"Properties" : {
    "PropertyName" : { "Ref" : "LogicalResourceName" }
}
```

#### YAML
<a name="resource-properties-ref-example.yaml"></a>

```
Properties:
  PropertyName1:
    Ref: LogicalResourceName
  PropertyName2: !Ref LogicalResourceName
```

Para obtener información detallada sobre el uso de la función `Ref`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html). 

### La función de `Fn::GetAtt`
<a name="resource-properties-getatt"></a>

La función `Ref` es útil si el parámetro o el valor que se brinda para un recurso es exactamente lo que desea. Sin embargo, es posible que necesite otros atributos de un recurso. Por ejemplo, si desea crear una distribución de CloudFront con un origen de S3, debe especificar la ubicación del bucket mediante una dirección de estilo DNS. Una serie de recursos tienen atributos adicionales cuyos valores puede utilizar en su plantilla. Para obtener estos atributos, utilice la función `Fn::GetAtt`.

Los siguientes ejemplos muestran cómo utilizar la función `GetAtt` en propiedades. La función `Fn::GetAtt` tiene dos parámetros: el nombre lógico del recurso y el nombre del atributo que debe recuperarse. El ejemplo de sintaxis `!GetAtt` del ejemplo del archivo YAML es solo una forma más corta de escribir la función `GetAtt`.

#### JSON
<a name="resource-properties-getatt-example.json"></a>

```
"Properties" : {
    "PropertyName" : {
        "Fn::GetAtt" : [ "LogicalResourceName", "AttributeName" ]
    }
}
```

#### YAML
<a name="resource-properties-getatt-example.yaml"></a>

```
Properties:
  PropertyName1:
    Fn::GetAtt:
      - LogicalResourceName
      - AttributeName
  PropertyName2: !GetAtt LogicalResourceName.AttributeName
```

Para obtener información detallada sobre el uso de la función `GetAtt`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-getatt.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-getatt.html).

## Ejemplos
<a name="resources-section-structure-examples"></a>

En los siguientes ejemplos, se ilustra cómo declarar los recursos y cómo las plantillas de CloudFormation pueden referenciar a otros recursos definidos en la misma plantilla y a los recursos de AWS existentes.

**Topics**
+ [Declaración de un único recurso con un nombre personalizado](#resources-section-structure-examples-single-resource)
+ [Referencias a otros recursos con la función `Ref`](#resources-section-structure-examples-ref)
+ [Referencias a los atributos de los recursos con la función `Fn::GetAtt`](#resources-section-structure-examples-getatt)

### Declaración de un único recurso con un nombre personalizado
<a name="resources-section-structure-examples-single-resource"></a>

En los siguientes ejemplos, se declara un único recurso de tipo `AWS::S3::Bucket` con el nombre lógico `MyBucket`. La propiedad `BucketName` está establecida en *amzn-s3-demo-bucket* y debe sustituirse por el nombre deseado para su bucket de S3.

Si utiliza esta declaración de recursos para crear una pila, CloudFormation creará un bucket de Amazon S3 con la configuración predeterminada. Para otros recursos, como una instancia de Amazon EC2 o un grupo de escalado automático, CloudFormation requiere más información.

#### JSON
<a name="resources-section-structure-examples-single-resource.json"></a>

```
{
    "Resources": {
        "MyBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": "amzn-s3-demo-bucket"
            }
        }
    }
}
```

#### YAML
<a name="resources-section-structure-examples-single-resource.yaml"></a>

```
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: amzn-s3-demo-bucket
```

### Referencias a otros recursos con la función `Ref`
<a name="resources-section-structure-examples-ref"></a>

En los siguientes ejemplos, se muestra una declaración de recursos que define una instancia de EC2 y un grupo de seguridad. El recurso `Ec2Instance` referencia al recurso `InstanceSecurityGroup` como parte de su propiedad `SecurityGroupIds` con la función `Ref`. También incluye un grupo de seguridad existente (`sg-12a4c434`) que no está declarado en la plantilla. Debe utilizar cadenas literales para hacer referencia a recursos de AWS existentes.

#### JSON
<a name="resources-section-structure-examples-ref.json"></a>

```
{
    "Resources": {
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "SecurityGroupIds": [
                    {
                        "Ref": "InstanceSecurityGroup"
                    },
                    "sg-12a4c434"
                ],
                "KeyName": "MyKey",
                "ImageId": "ami-1234567890abcdef0"
            }
        },
        "InstanceSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable SSH access via port 22",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        }
    }
}
```

#### YAML
<a name="resources-section-structure-examples-ref.yaml"></a>

```
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      SecurityGroupIds:
        - !Ref InstanceSecurityGroup
        - sg-12a4c434
      KeyName: MyKey
      ImageId: ami-1234567890abcdef0
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
```

### Referencias a los atributos de los recursos con la función `Fn::GetAtt`
<a name="resources-section-structure-examples-getatt"></a>

En los siguientes ejemplos, se muestra una declaración de recursos que define un recurso de distribución de CloudFront y un bucket de S3. El recurso `MyDistribution` especifica el nombre DNS del recurso `MyBucket` con la función `Fn::GetAtt` para obtener el atributo `DomainName` del bucket. Observará que la función `Fn::GetAtt` enumera sus dos parámetros en una matriz. Para funciones que utilizan varios parámetros, usted utiliza una matriz para especificar los parámetros.

#### JSON
<a name="resources-section-structure-examples-getatt.json"></a>

```
{
  "Resources": {
    "MyBucket": {
      "Type": "AWS::S3::Bucket"
    },
    "MyDistribution": {
      "Type": "AWS::CloudFront::Distribution",
      "Properties": {
        "DistributionConfig": {
          "Origins": [
            {
              "DomainName": {
                "Fn::GetAtt": [
                  "MyBucket",
                  "DomainName"
                ]
              },
              "Id": "MyS3Origin",
              "S3OriginConfig": {}
            }
          ],
          "Enabled": "true",
          "DefaultCacheBehavior": {
            "TargetOriginId": "MyS3Origin",
            "ForwardedValues": {
              "QueryString": "false"
            },
            "ViewerProtocolPolicy": "allow-all"
          }
        }
      }
    }
  }
}
```

#### YAML
<a name="resources-section-structure-examples-getatt.yaml"></a>

```
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
  MyDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
          - DomainName: !GetAtt 
              - MyBucket
              - DomainName
            Id: MyS3Origin
            S3OriginConfig: {}
        Enabled: 'true'
        DefaultCacheBehavior:
          TargetOriginId: MyS3Origin
          ForwardedValues:
            QueryString: 'false'
          ViewerProtocolPolicy: allow-all
```

# Sintaxis de Parameters de la plantilla de CloudFormation
<a name="parameters-section-structure"></a>

Utilice la sección `Parameters` opcional para personalizar sus plantillas. Con los parámetros, puede ingresar valores personalizados a su plantilla cada vez que crea o actualiza una pila. Al usar parámetros en sus plantillas, puede crear plantillas flexibles y reutilizables que se pueden adaptar a escenarios específicos. 

Al definir los parámetros del tipo adecuado, puede elegir de una lista de identificadores de los recursos existentes cuando utilice la consola para crear su pila. Para obtener más información, consulte [Definición de recursos existentes en tiempo de ejecución con tipos de parámetros proporcionados por CloudFormation](cloudformation-supplied-parameter-types.md).

Los parámetros son una forma común de especificar los valores de las propiedades de los recursos de la pila. Sin embargo, es posible que haya ajustes que dependan de la región o sean algo complejos para que los usuarios los averigüen debido a otras condiciones o dependencias. En estos casos, debería incluir algo de lógica en la propia plantilla para que los usuarios puedan especificar valores más sencillos (o ninguno en absoluto) para obtener los resultados que desean. Por ejemplo, puede usar asignaciones. Para obtener más información, consulte [Sintaxis de Mappings de la plantilla de CloudFormation](mappings-section-structure.md).

## Sintaxis
<a name="parameters-section-structure-syntax"></a>

Puede declarar parámetros en la sección `Parameters` de una plantilla, la cual usa la siguiente sintaxis general:

### JSON
<a name="parameters-section-structure-syntax.json"></a>

```
"Parameters" : {
  "ParameterLogicalID" : {
    "Description": "Information about the parameter",
    "Type" : "DataType",
    "Default" : "value",
    "AllowedValues" : ["value1", "value2"]
  }
}
```

### YAML
<a name="parameters-section-structure-syntax.yaml"></a>

```
Parameters:
  ParameterLogicalID:
    Description: Information about the parameter
    Type: DataType
    Default: value
    AllowedValues:
      - value1
      - value2
```

Un parámetro contiene una lista de atributos que definen su valor y limitaciones frente a su valor. El único atributo obligatorio es `Type`, que puede ser `String`, `Number` o un tipo de parámetro proporcionado por CloudFormation. También puede añadir un atributo `Description` que describe qué tipo de valor debe especificar. El nombre y la descripción del parámetro aparecen en la página **Especificar parámetros** cuando utiliza la plantilla en el asistente de **Crear pila**.

**nota**  
De forma predeterminada, la consola de CloudFormation ordena alfabéticamente parámetros de entrada por su ID lógico. Para anular este orden predeterminado y agrupar los parámetros relacionados, puede usar la clave de metadatos `AWS::CloudFormation::Interface` de su plantilla. Para obtener más información, consulte [Organización de los parámetros de CloudFormation con metadatos `AWS::CloudFormation::Interface`](aws-cloudformation-interface.md).

Para parámetros con valores predeterminados, CloudFormation utiliza los valores predeterminados a menos que los usuarios especifiquen otro valor. Si omite el atributo predeterminado, los usuarios deben especificar un valor para ese parámetro. Sin embargo, exigir que el usuario ingrese un valor no garantiza que el valor sea válido. Para validar el valor de un parámetro, puede declarar limitaciones o indicar un tipo de parámetro específico de AWS.

En el caso de parámetros sin valores predeterminados, los usuarios deben especificar un valor de nombre de clave al crear la pila. Caso contrario, CloudFormation no logra crear la pila y arroja una excepción:

```
Parameters: [KeyName] must have values
```

## Propiedades
<a name="parameters-section-structure-properties"></a>

`AllowedPattern`  
Una expresión regular que representa los patrones que hay que permitir para tipos `String` o `CommaDelimitedList`. Cuando se aplica a un parámetro del tipo `String`, el patrón debe coincidir con todo el valor del parámetro proporcionado. Cuando se aplica a un parámetro del tipo `CommaDelimitedList`, el patrón debe coincidir con cada valor de la lista.  
*Obligatorio*: no

`AllowedValues`  
Una matriz que contiene la lista de valores permitidos para el parámetro. Cuando se aplica a un parámetro del tipo `String`, el valor del parámetro debe ser uno de los valores permitidos. Cuando se aplica a un parámetro del tipo `CommaDelimitedList`, cada valor de la lista debe ser uno de los valores permitidos especificados.  
*Obligatorio*: no  
Si usa YAML y quiere usar cadenas `Yes` y `No` para `AllowedValues`, use comillas simples para evitar que el analizador YAML considere estos valores booleanos.

`ConstraintDescription`  
Una cadena que explica una restricción cuando se infringe la restricción. Por ejemplo, sin una descripción de la restricción, un parámetro con un patrón permitido de `[A-Za-z0-9]+` muestra el siguiente mensaje de error cuando el usuario especifica un valor no válido:  
`Malformed input-Parameter MyParameter must match pattern [A-Za-z0-9]+`  
Al añadir una descripción de restricción, como, por ejemplo *debe contener únicamente letras (mayúsculas y minúsculas) y números*, puede mostrar el siguiente mensaje de error personalizado:  
`Malformed input-Parameter MyParameter must only contain uppercase and lowercase letters and numbers`  
*Obligatorio*: no

`Default`  
Un valor del tipo apropiado para la plantilla que se debe utilizar si no se especifica ningún valor al crear una pila. Si define restricciones para el parámetro, debe especificar un valor que cumpla dichas restricciones.  
*Obligatorio*: no

`Description`  
Una cadena de hasta 4000 caracteres que describe el parámetro.  
*Obligatorio*: no

`MaxLength`  
Cualquier valor entero que determina el mayor número de caracteres que desea permitir para tipos de `String`.  
*Obligatorio*: no

`MaxValue`  
Un valor numérico que determina el mayor valor numérico que desea permitir para tipos de `Number`.  
*Obligatorio*: no

`MinLength`  
Un valor entero que determina el menor número de caracteres que desea permitir para tipos de `String`.  
*Obligatorio*: no

`MinValue`  
Un valor numérico que determina el menor valor numérico que desea permitir para tipos de `Number`.  
*Obligatorio*: no

`NoEcho`  
Si se va a enmascarar el valor del parámetro para impedir que se muestre en la consola, en las herramientas de línea de comandos o en la API. Si establece el atributo `NoEcho` en `true`, CloudFormation devuelve el valor del parámetro enmascarado como asteriscos (\$1\$1\$1\$1\$1) para cualquier llamada que describa la pila o los eventos de la pila, excepto para la información almacenada en las ubicaciones especificadas a continuación.  
*Obligatorio*: no  
El uso del atributo `NoEcho` no enmascara ninguna información almacenada en lo que se muestra a continuación:  
+ La sección de la plantilla `Metadata`. CloudFormation no transforma, modifica ni redacta ninguna información que incluya en la sección `Metadata`. Para obtener más información, consulte [Metadata](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ La sección de la plantilla `Outputs`. Para obtener más información, consulte [Salidas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
+ El atributo `Metadata` de una definición de recurso. Para obtener más información, consulte [`Metadata` atributo](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Recomendamos encarecidamente que no utilice estos mecanismos para incluir información confidencial, como contraseñas o secretos.
En lugar de integrar información confidencial directamente en las plantillas de CloudFormation, se recomienda utilizar parámetros dinámicos en la plantilla de la pila para hacer referencia a la información confidencial almacenada y administrada fuera de CloudFormation, como en AWS Systems Manager Parameter Store o AWS Secrets Manager.  
Para obtener más información, consulte la práctica recomendada [No integre credenciales en sus plantillas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).
Recomendamos encarecidamente no incluir parámetros `NoEcho` ni ningún dato confidencial en las propiedades de los recursos que formen parte del identificador principal de un recurso.  
Cuando se incluye un parámetro de `NoEcho` en una propiedad que forma un identificador de recursos principal, CloudFormation puede usar el *valor de texto sin formato real* en el identificador del recurso principal. Este ID de recurso puede aparecer en cualquier destino o salida derivada.  
Para determinar qué propiedades de recursos comprenden el identificador principal de un tipo de recurso, consulte la documentación de referencia de recursos para ese recurso en la [Referencia de tipos de recursos y propiedades de AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html). En la sección **Return values** (Valores de devolución), el valor de devolución de la función `Ref` representa las propiedades del recurso que comprenden el identificador principal del tipo de recurso.

`Type`  <a name="parameters-section-structure-properties-type"></a>
El tipo de datos para el parámetro (`DataType`).  
*Obligatorio*: sí  
CloudFormation es compatible con los siguientes tipos de parámetros:    
`String`  
Una cadena literal. Puede usar los siguientes atributos para declarar las limitaciones: `MinLength`, `MaxLength`, `Default`, `AllowedValues` y `AllowedPattern`.   
Por ejemplo, los usuarios podrían especificar `"MyUserName"`.  
`Number`  
Un número entero o float. CloudFormation valida el valor del parámetro como un número; sin embargo, cuando utiliza el parámetro en otro sitio en la plantilla (por ejemplo, mediante el uso de la función intrínseca `Ref`), el valor del parámetro se convierte en una cadena.  
Puede usar los siguientes atributos para declarar las limitaciones: `MinValue`, `MaxValue`, `Default` y `AllowedValues`.  
Por ejemplo, los usuarios podrían especificar `"8888"`.  
`List<Number>`  
Una matriz de valores enteros o floats que están separados por comas. CloudFormation valida el valor del parámetro como números; sin embargo, cuando utiliza el parámetro en otro sitio en la plantilla (por ejemplo, mediante el uso de la función intrínseca `Ref`), el valor del parámetro se convierte en una lista de cadenas.  
Por ejemplo, los usuarios podrían especificar `"80,20"` y una `Ref` daría lugar a `["80","20"]`.  
`CommaDelimitedList`  
Una matriz de cadenas literales que están separadas por comas. El número total de cadenas debería ser uno más que el número total de comas. Además, en cada cadena de miembro se elimina el espacio.  
Por ejemplo, los usuarios podrían especificar `"test,dev,prod"` y una `Ref` daría lugar a `["test","dev","prod"]`.  
AWSTipos de parámetros específicos de   
Valores de AWS, como nombres de pares de claves e ID de VPC de Amazon EC2. Para obtener más información, consulte [Definición de recursos existentes en tiempo de ejecución](cloudformation-supplied-parameter-types.md).  
Tipos de parámetros de Systems Manager  
Parámetros correspondientes a los parámetros existentes en Administrador de sistemas Parameter Store. Puede especificar una clave de parámetro de Systems Manager como valor del tipo de parámetro de Systems Manager, y CloudFormation recupera el valor más reciente del Almacén de parámetros que se usará para la pila. Para obtener más información, consulte [Definición de recursos existentes en tiempo de ejecución](cloudformation-supplied-parameter-types.md).

## Requisitos generales para los parámetros
<a name="parameters-section-structure-requirements"></a>

Los siguientes requisitos se aplican al usar los parámetros:
+ Puede tener un máximo de 200 parámetros en una plantilla de CloudFormation.
+ Cada parámetro debe recibir un nombre lógico (también llamado ID lógico), que tiene que ser alfanumérico y único entre todos los nombres lógicos dentro de la plantilla.
+ A cada parámetro se le debe asignar un tipo de parámetro compatible con CloudFormation. Para obtener más información, consulte [Tipo](#parameters-section-structure-properties-type).
+ A cada parámetro se le debe asignar un valor en tiempo de ejecución para que CloudFormation aprovisione correctamente la pila. Si lo desea, puede especificar un valor predeterminado para que CloudFormation lo use a menos que se proporcione otro valor.
+ Los parámetros se deben declarar y se debe hacer referencia a ellos desde la misma plantilla. Puede hacer referencia a los parámetros en las secciones `Resources` y `Outputs` de la plantilla.

## Ejemplos
<a name="parameters-section-examples"></a>

**Topics**
+ [Parámetro de cadena simple](#parameters-section-structure-example-1)
+ [Parámetro de contraseña](#parameters-section-structure-example-2)
+ [Parámetros de referencia](#parameters-section-structure-example-3)
+ [Parámetros de lista delimitada por comas](#parameters-section-structure-example-4)
+ [Devuelva un valor de un parámetro de lista delimitada por comas](#parameters-section-structure-example-5)

### Parámetro de cadena simple
<a name="parameters-section-structure-example-1"></a>

En el siguiente ejemplo se declara un parámetro denominado `InstanceTypeParameter` de tipo `String`. Este parámetro le permite especificar el tipo de instancia de Amazon EC2 para la pila. Si no se proporciona ningún valor durante la creación o actualización de la pila, CloudFormation utiliza el valor predeterminado de `t2.micro`.

#### JSON
<a name="parameters-section-structure-example-1.json"></a>

```
"Parameters" : {
  "InstanceTypeParameter" : {
    "Description" : "Enter t2.micro, m1.small, or m1.large. Default is t2.micro.",
    "Type" : "String",
    "Default" : "t2.micro",
    "AllowedValues" : ["t2.micro", "m1.small", "m1.large"]
  }
}
```

#### YAML
<a name="parameters-section-structure-example-1.yaml"></a>

```
Parameters:
  InstanceTypeParameter:
    Description: Enter t2.micro, m1.small, or m1.large. Default is t2.micro.
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - m1.small
      - m1.large
```

### Parámetro de contraseña
<a name="parameters-section-structure-example-2"></a>

En el siguiente ejemplo se declara un parámetro denominado `DBPwd` de tipo `String` con ningún valor predeterminado. La propiedad `NoEcho` está configurada en `true` para evitar que el valor del parámetro se muestre en las descripciones de las pilas. La longitud mínima que se puede especificar es `1` y la longitud máxima que se puede especificar es `41`. El patrón permite caracteres alfabéticos en mayúsculas y minúsculas, y números. Este ejemplo también ilustra el uso de una expresión regular para la propiedad `AllowedPattern`.

#### JSON
<a name="parameters-section-structure-example-2.json"></a>

```
"Parameters" : {
  "DBPwd" : {
    "NoEcho" : "true",
    "Description" : "The database admin account password",
    "Type" : "String",
    "MinLength" : "1",
    "MaxLength" : "41",
    "AllowedPattern" : "^[a-zA-Z0-9]*$"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-2.yaml"></a>

```
Parameters: 
  DBPwd: 
    NoEcho: true
    Description: The database admin account password
    Type: String
    MinLength: 1
    MaxLength: 41
    AllowedPattern: ^[a-zA-Z0-9]*$
```

### Parámetros de referencia
<a name="parameters-section-structure-example-3"></a>

Puede usar la función intrínseca `Ref` para hacer referencia a un parámetro, mientras que CloudFormation utiliza el valor del parámetro para aprovisionar la pila. Puede hacer referencia a los parámetros en las secciones `Resources` y `Outputs` de la misma plantilla.

En el siguiente ejemplo, la propiedad `InstanceType` del recurso de instancia de EC2 hace referencia al valor del parámetro `InstanceTypeParameter`:

#### JSON
<a name="parameters-section-structure-example-3.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance",
  "Properties" : {
    "InstanceType" : { "Ref" : "InstanceTypeParameter" },
    "ImageId" : "ami-0ff8a91507f77f867"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-3.yaml"></a>

```
Ec2Instance:
  Type: AWS::EC2::Instance
  Properties:
    InstanceType:
      Ref: InstanceTypeParameter
    ImageId: ami-0ff8a91507f77f867
```

### Parámetros de lista delimitada por comas
<a name="parameters-section-structure-example-4"></a>

El tipo de parámetro `CommaDelimitedList` puede resultar útil cuando se necesitan proporcionar varios valores para una sola propiedad. El siguiente ejemplo declara un parámetro denominado `DbSubnetIpBlocks` con un valor predeterminado de tres bloques CIDR separados por comas.

#### JSON
<a name="parameters-section-structure-example-4.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="parameters-section-structure-example-4.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"
```

### Devuelva un valor de un parámetro de lista delimitada por comas
<a name="parameters-section-structure-example-5"></a>

Para consultar un valor específico en una lista delimitada por comas del parámetro, utilice la función intrínseca `Fn::Select` en la sección `Resources` de la plantilla. Transfiera el valor de índice del objeto que desea y una lista de objetos, tal y como se muestra en el siguiente ejemplo.

#### JSON
<a name="parameters-section-structure-example-5.json"></a>

```
{
    "Parameters": {
        "VPC": {
            "Type": "String",
            "Default": "vpc-123456"
        },
        "VpcAzs": {
            "Type": "CommaDelimitedList",
            "Default": "us-west-2a, us-west-2b, us-west-2c"
        },
        "DbSubnetIpBlocks": {
            "Type": "CommaDelimitedList",
            "Default": "172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26"
        }
    },
    "Resources": {
        "DbSubnet1": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Select": [
                      0,
                      { 
                        "Ref": "VpcAzs" 
                      }
                   ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        0,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet2": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    1,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        1,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet3": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    2,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        2,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        }
    }
}
```

#### YAML
<a name="parameters-section-structure-example-5.yaml"></a>

```
Parameters:
  VPC:
    Type: String
    Default: vpc-123456
  VpcAzs:
    Type: CommaDelimitedList
    Default: us-west-2a, us-west-2b, us-west-2c
  DbSubnetIpBlocks:
    Type: CommaDelimitedList
    Default: 172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26
Resources:
  DbSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select
        - 0 
        - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 0
        - !Ref DbSubnetIpBlocks
  DbSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 1
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 1
        - !Ref DbSubnetIpBlocks
  DbSubnet3:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 2
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 2
        - !Ref DbSubnetIpBlocks
```

## Recursos relacionados
<a name="parameters-section-structure-related-resources"></a>

CloudFormation también admite el uso de referencias dinámicas para especificar valores de propiedades de forma dinámica. Por ejemplo, puede que necesite hacer referencia a cadenas seguras almacenadas en el almacén de parámetros de Systems Manager. Para obtener más información, consulte [Obtención de valores almacenados en otros servicios con referencias dinámicas](dynamic-references.md).

También puede utilizar pseudoparámetros dentro de una función `Ref` o `Sub` para rellenar valores de forma dinámica. Para obtener más información, consulte [Obtención de valores de AWS mediante pseudoparámetros](pseudo-parameter-reference.md). 

# Sintaxis de Outputs de la plantilla de CloudFormation
<a name="outputs-section-structure"></a>

La sección opcional `Outputs` declara los valores de salida de la pila. Estos valores de salida se pueden usar de distintas maneras:
+ **Captura de detalles importantes sobre sus recursos**: una salida es una manera cómoda de capturar información importante sobre sus recursos. Por ejemplo, puede declarar la salida para el nombre del bucket de S3 para una pila para que sea más fácil encontrar el bucket. Puede ver los valores de salida en la pestaña **Salidas** de la consola de CloudFormation o con el comando [describe-stacks](service_code_examples.md#describe-stacks-sdk) de la CLI. 
+ **Referencias entre pilas**: puede importar valores de salida a otras pilas para [crear referencias entre pilas](using-cfn-stack-exports.md). Esto es útil cuando necesita compartir recursos o configuraciones entre varias pilas.

**importante**  
CloudFormation no redacta ni enmascara ninguna información que incluya en la sección `Outputs`. Recomendamos encarecidamente que no utilice esta sección para generar información confidencial, como contraseñas o secretos.  
Los valores de salida están disponibles una vez que la operación de pila está completa. Los valores de salida de la pila no están disponibles cuando el estado de la pila está en cualquiera de estos [estados](view-stack-events.md#cfn-console-view-stack-data-resources-status-codes) `IN_PROGRESS`. No recomendamos establecer dependencias entre un tiempo de ejecución de servicio y el valor de salida de la pila porque los valores de salida pueden no estar disponibles en todo momento.

## Sintaxis
<a name="outputs-section-syntax"></a>

La sección `Outputs` consta del nombre de clave `Outputs`. Puede declarar un máximo de 200 salidas en una plantilla.

El siguiente ejemplo muestra la estructura de la sección `Outputs`.

### JSON
<a name="outputs-section-structure-syntax.json"></a>

Utilice llaves para delimitar todas las declaraciones de salida. Delimite varias salidas con comas.

```
"Outputs" : {
  "OutputLogicalID" : {
    "Description" : "Information about the value",
    "Value" : "Value to return",
    "Export" : {
      "Name" : "Name of resource to export"
    }
  }
}
```

### YAML
<a name="outputs-section-structure-syntax.yaml"></a>

```
Outputs:
  OutputLogicalID:
    Description: Information about the value
    Value: Value to return
    Export:
      Name: Name of resource to export
```

### Campos de salida
<a name="outputs-section-structure-output-fields"></a>

La sección `Outputs` puede incluir los siguientes campos.

**ID lógico (también denominado *nombre lógico*)**  
Un identificador para la salida actual. El ID lógico tiene que ser alfanumérico (`a–z`, `A–Z`, `0–9`) y único dentro de la plantilla.

**`Description` (opcional)**  
Un tipo de `String` que describe el valor de salida. El valor de la declaración de la descripción debe ser una cadena literal de entre 0 y 1024 bytes de longitud. No puede utilizar un parámetro o función para especificar la descripción. 

**`Value` (obligatorio)**  
El valor de la propiedad devuelto por el comando [describe-stacks](service_code_examples.md#describe-stacks-sdk). El valor de una salida puede incluir literales, referencias de parámetros, pseudoparámetros, un valor de asignación o funciones intrínsecas.

**`Export` (opcional)**  
El nombre de la salida de los recursos que se exportan para una referencia cruzada de pila.  
Puede utilizar funciones intrínsecas para personalizar el valor `Name` de una exportación.  
Para obtener más información, consulte [Obtención de salidas exportadas de una pila implementada de CloudFormation](using-cfn-stack-exports.md).

Para asociar una condición a una salida, defina la condición en la sección [Conditions](conditions-section-structure.md) de la plantilla.

## Ejemplos
<a name="outputs-section-structure-examples"></a>

Los siguientes ejemplos ilustran cómo funciona la salida de la pila.

**Topics**
+ [Salida de la pila](#outputs-section-structure-examples-stack-output)
+ [Personalización del nombre de exportación mediante `Fn::Sub`](#outputs-section-structure-examples-cross-stack)
+ [Personalización del nombre de exportación mediante `Fn::Join`](#outputs-section-structure-examples-join-export-name)
+ [Devuelve una URL creada con `Fn::Join`](#outputs-section-structure-examples-join-export-url)

### Salida de la pila
<a name="outputs-section-structure-examples-stack-output"></a>

En el siguiente ejemplo, la salida denominada `BackupLoadBalancerDNSName` devuelve el nombre de DNS para el recurso con el ID lógico `BackupLoadBalancer` solo cuando la condición `CreateProdResources` es true. La salida con el nombre `InstanceID` devuelve el ID de la instancia de EC2 con el ID lógico `EC2Instance`.

#### JSON
<a name="outputs-section-structure-example.json"></a>

```
"Outputs" : {
  "BackupLoadBalancerDNSName" : {
    "Description": "The DNSName of the backup load balancer",  
    "Value" : { "Fn::GetAtt" : [ "BackupLoadBalancer", "DNSName" ]},
    "Condition" : "CreateProdResources"
  },
  "InstanceID" : {
    "Description": "The Instance ID",  
    "Value" : { "Ref" : "EC2Instance" }
  }
}
```

#### YAML
<a name="outputs-section-structure-example.yaml"></a>

```
Outputs:
  BackupLoadBalancerDNSName:
    Description: The DNSName of the backup load balancer
    Value: !GetAtt BackupLoadBalancer.DNSName
    Condition: CreateProdResources
  InstanceID:
    Description: The Instance ID
    Value: !Ref EC2Instance
```

### Personalización del nombre de exportación mediante `Fn::Sub`
<a name="outputs-section-structure-examples-cross-stack"></a>

En los siguientes ejemplos, la salida denominada `StackVPC` devuelve el ID de una VPC y, a continuación, exporta el valor para la referencia cruzada de la pila `VPCID` junto al nombre de la pila.

#### JSON
<a name="outputs-section-structure-cross-stack-example.json"></a>

```
"Outputs" : {
  "StackVPC" : {
    "Description" : "The ID of the VPC",
    "Value" : { "Ref" : "MyVPC" },
    "Export" : {
      "Name" : {"Fn::Sub": "${AWS::StackName}-VPCID" }
    }
  }
}
```

#### YAML
<a name="outputs-section-structure-cross-stack-example.yaml"></a>

```
Outputs:
  StackVPC:
    Description: The ID of the VPC
    Value: !Ref MyVPC
    Export:
      Name: !Sub "${AWS::StackName}-VPCID"
```

Para obtener más información sobre la función `Fn::Sub`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html).

### Personalización del nombre de exportación mediante `Fn::Join`
<a name="outputs-section-structure-examples-join-export-name"></a>

También puede usar de la función `Fn::Join` para crear valores basados en parámetros, atributos de recursos y otras cadenas.

En los ejemplos siguientes, se utiliza la función `Fn::Join` para personalizar el nombre de la exportación en lugar de la función `Fn::Sub`. La función `Fn::Join` de ejemplo concatena el nombre de la pila con el nombre `VPCID` utilizando dos puntos como separador.

#### JSON
<a name="outputs-section-structure-join-export-name-example.json"></a>

```
"Outputs" : {
  "StackVPC" : {
    "Description" : "The ID of the VPC",
    "Value" : { "Ref" : "MyVPC" },
    "Export" : {
      "Name" : { "Fn::Join" : [ ":", [ { "Ref" : "AWS::StackName" }, "VPCID" ] ] }
    }
  }
}
```

#### YAML
<a name="outputs-section-structure-join-export-name-example.yaml"></a>

```
Outputs:
  StackVPC:
    Description: The ID of the VPC
    Value: !Ref MyVPC
    Export:
      Name: !Join [ ":", [ !Ref "AWS::StackName", VPCID ] ]
```

Para obtener más información sobre la función `Fn::Join`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html).

### Devuelve una URL creada con `Fn::Join`
<a name="outputs-section-structure-examples-join-export-url"></a>

En el siguiente ejemplo de una plantilla para crear un sitio de WordPress, `InstallURL` es la cadena devuelta por una llamada a una función `Fn::Join` que concatena `http://`, el nombre DNS del recurso `ElasticLoadBalancer` y `/wp-admin/install.php`. El valor de salida debería ser similar al siguiente:

```
http://mywptests-elasticl-1gb51l6sl8y5v-206169572.aws-region.elb.amazonaws.com/wp-admin/install.php
```

#### JSON
<a name="outputs-section-structure-examples-join-export-url.json"></a>

```
{
    "Outputs": {
        "InstallURL": {
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        "http://",
                        {
                            "Fn::GetAtt": [
                                "ElasticLoadBalancer",
                                "DNSName"
                            ]
                        },
                        "/wp-admin/install.php"
                    ]
                ]
            },
            "Description": "Installation URL of the WordPress website"
        }
    }
}
```

#### YAML
<a name="outputs-section-structure-examples-join-export-url.yaml"></a>

```
Outputs:
  InstallURL:
    Value: !Join 
      - ''
      - - 'http://'
        - !GetAtt 
          - ElasticLoadBalancer
          - DNSName
        - /wp-admin/install.php
    Description: Installation URL of the WordPress website
```

Para obtener más información sobre la función `Fn::Join`, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html).

# Sintaxis de Mappings de la plantilla de CloudFormation
<a name="mappings-section-structure"></a>

La sección opcional `Mappings` ayuda a crear pares de clave-valor que pueden usarse para especificar valores a ciertas condiciones o dependencias. 

Un caso de uso común es para la sección `Mappings` es para establecer valores según la Región de AWS en la que la pila esté implementada. Esto se puede lograr con el pseudoparámetro `AWS::Region`. El pseudoparámetro `AWS::Region` es un valor que CloudFormation resuelve para la región en la que se crea la pila. CloudFormation resuelve los pseudoparámetros cuando usted crea la pila. 

Para recuperar los valores de una asignación, puede usar la función intrínseca `Fn::FindInMap` en la sección `Resources` de la plantilla. 

## Sintaxis
<a name="mappings-section-structure-syntax"></a>

La sección `Mappings` usa la siguiente sintaxis:

### JSON
<a name="mappings-section-structure-syntax.json"></a>

```
"Mappings" : {
  "MappingLogicalName" : {
    "Key1" : {
      "Name" : "Value1"
    },
    "Key2" : {
      "Name" : "Value2"
    },
    "Key3" : {
      "Name" : "Value3"
    }
  }
}
```

### YAML
<a name="mappings-section-structure-syntax.yaml"></a>

```
Mappings: 
  MappingLogicalName: 
    Key1: 
      Name: Value1
    Key2: 
      Name: Value2
    Key3: 
      Name: Value3
```
+ `MappingLogicalName` es el nombre lógico para la asignación.
+ Dentro de las asignaciones, cada una es una clave seguida de otra asignación.
+ La clave debe ser un mapa de pares de nombre-valor y única dentro del mapeo.
+ El par nombre-valor es una etiqueta y el valor que se deben asignar. Al nombrar los valores, puede asignar más de un conjunto de valores a una clave.
+ Las claves en mapeos deben ser cadenas literales.
+ Los valores pueden ser de tipo `String` o `List`.

**nota**  
No puede incluir parámetros, pseudo parámetros o funciones intrínsecas en la sección `Mappings`.   
Si actualmente su pila no utiliza los valores de una asignación, no puede actualizar solo la asignación. Tiene que incluir cambios que agreguen, modifiquen o eliminen recursos.

## Ejemplos
<a name="mappings-section-structure-examples"></a>

**Topics**
+ [Asignación básica](#mappings-section-structure-basic-example)
+ [Asignación con múltiples valores](#mappings-section-structure-multiple-values-example)
+ [Devolución de un valor a partir de una asignación](#mappings-section-structure-return-value-example)
+ [Parámetro de entrada y `Fn::FindInMap`](#mappings-section-structure-input-parameter-example)

### Asignación básica
<a name="mappings-section-structure-basic-example"></a>

El siguiente ejemplo muestra la sección `Mappings` con una asignación `RegionToInstanceType`, que contiene cinco claves que se asignan a pares nombre-valor que contienen valores de una única cadena. Las claves son nombres de regiones. Cada par nombre-valor es un tipo de instancia de la familia T que está disponible en la región representada por la clave. Los pares nombre-valor tienen un nombre (`InstanceType` en el ejemplo) y un valor. 

#### JSON
<a name="mappings-section-structure-basic-example.json"></a>

```
"Mappings" : {
  "RegionToInstanceType" : {
    "us-east-1"      : { "InstanceType" : "t2.micro" },
    "us-west-1"      : { "InstanceType" : "t2.micro" },
    "eu-west-1"      : { "InstanceType" : "t2.micro" },
    "eu-north-1"     : { "InstanceType" : "t3.micro" },
    "me-south-1"     : { "InstanceType" : "t3.micro" }
  }
}
```

#### YAML
<a name="mappings-section-structure-basic-example.yaml"></a>

```
Mappings:
  RegionToInstanceType:
    us-east-1:
      InstanceType: t2.micro
    us-west-1:
      InstanceType: t2.micro
    eu-west-1:
      InstanceType: t2.micro
    eu-north-1:
      InstanceType: t3.micro
    me-south-1:
      InstanceType: t3.micro
```

### Asignación con múltiples valores
<a name="mappings-section-structure-multiple-values-example"></a>

En el siguiente ejemplo, se muestran claves de región que se asignan a dos conjuntos de valores: uno denominado `MyAMI1` y el otro, `MyAMI2`.

**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="mappings-section-structure-multiple-values-example"></a>

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

#### YAML
<a name="mappings-section-structure-multiple-values-example.yaml"></a>

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

### Devolución de un valor a partir de una asignación
<a name="mappings-section-structure-return-value-example"></a>

Puede utilizar la función `Fn::FindInMap` para obtener un valor identificado a partir de una clave especificada. La siguiente plantilla de ejemplo contiene un recurso de Amazon EC2 cuya propiedad `InstanceType` asigna la función `FindInMap`. La función `FindInMap` especifica clave como la región de Región de AWS donde se crea la pila (mediante el pseudoparámetro `AWS::Region`) y `InstanceType` como el nombre del valor al que hay que asignarla. `ImageId` utiliza un parámetro de Systems Manager para recuperar de forma dinámica la AMI más reciente de Amazon Linux 2. Para obtener más información sobre pseudoparámetros, consulte . [Obtención de valores de AWS mediante pseudoparámetros](pseudo-parameter-reference.md).

#### JSON
<a name="mappings-section-structure-return-value-example.json"></a>

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Mappings" : {
    "RegionToInstanceType" : {
      "us-east-1"      : { "InstanceType" : "t2.micro" },
      "us-west-1"      : { "InstanceType" : "t2.micro" },
      "eu-west-1"      : { "InstanceType" : "t2.micro" },
      "eu-north-1"     : { "InstanceType" : "t3.micro" },
      "me-south-1"     : { "InstanceType" : "t3.micro" }
    }
  },
  "Resources" : {
    "myEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "InstanceType" : { "Fn::FindInMap" : [ "RegionToInstanceType", { "Ref" : "AWS::Region" }, "InstanceType" ]}
      }
    }
  }
}
```

#### YAML
<a name="mappings-section-structure-return-value-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Mappings: 
  RegionToInstanceType: 
    us-east-1:
      InstanceType: t2.micro
    us-west-1:
      InstanceType: t2.micro
    eu-west-1:
      InstanceType: t2.micro
    eu-north-1:
      InstanceType: t3.micro
    me-south-1:
      InstanceType: t3.micro
Resources: 
  myEC2Instance: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      InstanceType: !FindInMap [RegionToInstanceType, !Ref 'AWS::Region', InstanceType]
```

### Parámetro de entrada y `Fn::FindInMap`
<a name="mappings-section-structure-input-parameter-example"></a>

La siguiente plantilla de ejemplo muestra cómo crear una instancia de EC2 con varias asignaciones. La plantilla utiliza asignaciones anidadas para seleccionar automáticamente el tipo de instancia y el grupo de seguridad adecuados en función de la Región de AWS de destino y el tipo de entorno (`Dev` o `Prod`). También utiliza un parámetro de Systems Manager para recuperar de forma dinámica la AMI más reciente de Amazon Linux 2.

#### JSON
<a name="mappings-section-structure-input-parameter-example.json"></a>

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

#### YAML
<a name="mappings-section-structure-input-parameter-example.yaml"></a>

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

## Recursos relacionados
<a name="mappings-section-related-resources"></a>

Estos temas relacionados pueden resultarle útiles a la hora de desarrollar plantillas que utilicen la función `Fn::FindInMap`.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap.html)
+ [Fn::FindInMap Mejoras de](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap-enhancements.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html)

# Sintaxis de Metadata de la plantilla de CloudFormation
<a name="metadata-section-structure"></a>

`Metadata` almacena información adicional mediante objetos JSON o YAML. Los tipos de metadatos a nivel de plantilla que puede usar en su plantilla incluyen lo siguiente:

Metadatos personalizados  
Almacena pares clave-valor definidos por el usuario. Por ejemplo, puede proporcionar información adicional que no afecte a la creación de recursos, pero que ofrezca un contexto adicional sobre las características específicas de la infraestructura, el equipo o la implementación.

`AWS::CloudFormation::Interface`  
Define el agrupamiento y ordenación de parámetros de entrada cuando se muestran en la consola de CloudFormation. De forma predeterminada, la consola de CloudFormation ordena alfabéticamente parámetros por su ID lógico. 

`AWS::CloudFormation::Designer`  
CloudFormation Designer (Designer) alcanzó el fin de su vida útil el 5 de febrero de 2025.



**importante**  
Durante la actualización de una pila, no puede actualizar la sección `Metadata` por sí misma. Puede actualizarla solo cuando incluye cambios que añaden, modifican o eliminan recursos.  
CloudFormation no transforma, modifica ni redacta ninguna información que incluya en la sección `Metadata`. Debido a esto, recomendamos encarecidamente que no utilice esta sección para almacenar información confidencial, como contraseñas o secretos.

## Sintaxis
<a name="metadata-section-structure-syntax"></a>

Para declarar estos metadatos personalizados en su plantilla de CloudFormation, use la siguiente sintaxis:

### JSON
<a name="metadata-section-structure-syntax.json"></a>

```
"Metadata" : {
  "Instances" : {"Description" : "Information about the instances"},
  "Databases" : {"Description" : "Information about the databases"}
}
```

### YAML
<a name="metadata-section-structure-syntax.yaml"></a>

```
Metadata:
  Instances:
    Description: "Information about the instances"
  Databases: 
    Description: "Information about the databases"
```

Para ver la sintaxis de `AWS::CloudFormation::Interface`, consulte [Organización de los parámetros de CloudFormation con metadatos `AWS::CloudFormation::Interface`](aws-cloudformation-interface.md).

# Organización de los parámetros de CloudFormation con metadatos `AWS::CloudFormation::Interface`
<a name="aws-cloudformation-interface"></a>

`AWS::CloudFormation::Interface` es una clave de metadatos que define cómo se agrupan y ordenan los parámetros en la consola de CloudFormation. De forma predeterminada, cuando crea o actualiza pilas en la consola, la consola muestra parámetros de entrada en orden alfabético por su ID lógico. Al utilizar esta clave, puede definir su propia agrupación y orden de parámetros para que los usuarios puedan especificar los valores de los parámetros de manera eficiente. Por ejemplo, puede agrupar todos los parámetros relacionados con EC2 en un grupo y todos los parámetros relacionados con la VPC en otro grupo.

En la clave de metadatos, puede especificar los grupos que desea crear, los parámetros que desea incluir en cada grupo y el orden en el que la consola muestra cada parámetro dentro de su grupo. 

También puede definir etiquetas para los parámetros. Una etiqueta es una descripción o nombre fáciles de recordar que muestra la consola en lugar de un ID lógico del parámetro. Las etiquetas son útiles para ayudar a los usuarios a entender los valores que se deben especificar para cada parámetro. Por ejemplo, puede etiquetar un parámetro `KeyPair` `Select an EC2 key pair`.

Todos los parámetros a los que se hace referencia en la clave de metadatos deben declararse en la sección `Parameters` de la plantilla.

**nota**  
Solo la consola de CloudFormation utiliza la clave de metadatos `AWS::CloudFormation::Interface`. AWS CLI y llamadas a la API no utilizan esta clave.

## Sintaxis
<a name="aws-resource-cloudformation-interface-syntax"></a>

Para declarar esta entidad en su plantilla de CloudFormation, use la siguiente sintaxis:

### JSON
<a name="aws-resource-cloudformation-interface-syntax.json"></a>

```
"Metadata" : {
  "AWS::CloudFormation::Interface" : {
    "ParameterGroups": [
      {
        "Label": {
          "default": "Group Label"
        },
        "Parameters": [
          "Parameter1",
          "Parameter2"
        ]
      }
    ],
    "ParameterLabels": {
      "Parameter1": {
        "default": "Friendly Name for Parameter1"
      }
    }
  }
}
```

### YAML
<a name="aws-resource-cloudformation-interface-syntax.yaml"></a>

```
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Group Label
        Parameters:
          - Parameter1
          - Parameter2
    ParameterLabels:
      Parameter1:
        default: Friendly Name for Parameter1
```

## Propiedades
<a name="w2aac11c23c29c17c17"></a>

`ParameterGroups`  
Una lista de tipos de grupos de parámetros, donde debe especificar los nombres de los grupos, los parámetros de cada grupo y el orden en el que se muestran los parámetros.  
*Obligatorio:* no    
`Label`  
Un nombre para el grupo de parámetros.  
*Obligatorio*: no  
`default`  
La etiqueta predeterminada que la consola CloudFormation utiliza para denominar un grupo de parámetro.  
*Obligatorio:* no  
*Tipo:* cadena  
`Parameters`  
Una lista de IDs lógicos de parámetros sensibles a mayúsculas y minúsculas que se incluirán en el grupo. Los parámetros ya deben estar definidos en la sección `Parameters` de la plantilla. Se puede incluir un parámetro en un único grupo de parámetros.  
La consola muestra los parámetros que no asocia a un grupo de parámetros por orden alfabético en el grupo `Other parameters`.  
*Obligatorio*: no  
*Tipo*: lista de valores de cadena

`ParameterLabels`  
Una asignación de parámetros y sus nombres fáciles de recordar que muestra la consola de CloudFormation cuando se crea o actualiza una pila.  
*Obligatorio*: no    
Etiqueta de parámetro  
Una etiqueta para un parámetro. La etiqueta define una descripción o un nombre fácil de recordar que la consola de CloudFormation muestra en la página **Specify Parameters (Especificar parámetros)** cuando se crea o actualiza una pila. La etiqueta de parámetro debe ser el ID lógico que distingue entre mayúsculas y minúsculas de un parámetro válido declarado en la sección `Parameters` de la plantilla.  
*Obligatorio*: no  
`default`  
La etiqueta predeterminada que la consola de CloudFormation utiliza para denominar un parámetro.  
*Obligatorio*: no  
*Tipo:* cadena

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

El siguiente ejemplo define dos grupos de parámetros: `Network Configuration` y `Amazon EC2 Configuration`. El grupo `Network Configuration` incluye los parámetros `VPCID`, `SubnetId` y `SecurityGroupID` que se definen en la sección `Parameters` de la plantilla (no se muestra). El orden en el que la consola muestra estos parámetros se define por el orden en el que se enumeran los parámetros, empezando por el parámetro `VPCID`. El ejemplo agrupa y ordena de manera parecida los parámetros `Amazon EC2 Configuration`.

El ejemplo también define una etiqueta para el parámetro `VPCID`. La consola mostrará **Which VPC should this be deployed to? (¿En qué VPC debe implementarse esto?)** en lugar del ID lógico del parámetro (`VPCID`).

### JSON
<a name="aws-cloudformation-interface-example.json"></a>

```
"Metadata" : {
  "AWS::CloudFormation::Interface" : {
    "ParameterGroups" : [
      {
        "Label" : { "default" : "Network Configuration" },
        "Parameters" : [ "VPCID", "SubnetId", "SecurityGroupID" ]
      },
      {
        "Label" : { "default":"Amazon EC2 Configuration" },
        "Parameters" : [ "InstanceType", "KeyName" ]
      }
    ],
    "ParameterLabels" : {
      "VPCID" : { "default" : "Which VPC should this be deployed to?" }
    }
  }
}
```

### YAML
<a name="aws-cloudformation-interface-example.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface: 
    ParameterGroups: 
      - Label: 
          default: "Network Configuration"
        Parameters: 
          - VPCID
          - SubnetId
          - SecurityGroupID
      - Label: 
          default: "Amazon EC2 Configuration"
        Parameters: 
          - InstanceType
          - KeyName
    ParameterLabels: 
      VPCID: 
        default: "Which VPC should this be deployed to?"
```

### Grupos de parámetros en la consola
<a name="w2aac11c23c29c17c19c11"></a>

Con la clave de metadatos de este ejemplo, el siguiente gráfico ilustra cómo muestra la consola grupos de parámetros cuando se crea o actualiza una pila: **Grupos de parámetros en la consola** 

![\[La consola muestra los grupos de parámetros para este ejemplo.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/console-create-stack-parameter-groups.png)


# Sintaxis de Rules de la plantilla de CloudFormation
<a name="rules-section-structure"></a>

La sección `Rules` es una parte opcional de una plantilla de CloudFormation que permite una lógica de validación personalizada. Cuando se incluye, esta sección contiene funciones de reglas que validan los valores de los parámetros antes de que CloudFormation cree o actualice cualquier recurso.

Las reglas son útiles cuando las restricciones estándar de los parámetros son insuficientes. 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.

## Sintaxis
<a name="template-constraint-rules-syntax"></a>

La sección `Rules` usa la siguiente sintaxis:

### JSON
<a name="rules-section-structure-syntax.json"></a>

La sección `Rules` de una plantilla consta del nombre de clave `Rules`, seguido de un único signo de dos puntos. Debe utilizar llaves para incluir todas las declaraciones de reglas. Si se declaran varias reglas, deben delimitarse mediante comas. Para cada regla, se declara un nombre lógico entre comillas seguido de un signo de dos puntos y de las llaves que contienen la condición de regla y las declaraciones.

```
{
    "Rules": {
        "LogicalRuleName1": {
            "RuleCondition": {
                "rule-specific intrinsic function": "Value"
            },
            "Assertions": [
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                },
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                }
            ]
        },
        "LogicalRuleName2": {
            "Assertions": [
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                }
            ]
        }
    }
}
```

### YAML
<a name="rules-section-structure-syntax.yaml"></a>

```
Rules:
  LogicalRuleName1:
    RuleCondition:
      rule-specific intrinsic function: Value
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
  LogicalRuleName2:
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
```

### Campos de reglas
<a name="rules-section-fields"></a>

La sección `Rules` puede incluir los siguientes campos.

**ID lógico (también denominado *nombre lógico*)**  
Un identificador único para cada regla.

**`RuleCondition` (opcional)**  
Una propiedad que determina cuándo surte efecto una regla. Si no se define la condición de regla, las declaraciones de la regla surten efecto en todos los casos. Para cada regla, sólo puede definir una condición de regla. 

**`Assertions` (obligatorio)**  
Una o más declaraciones que especifican los valores aceptables para un parámetro determinado.

**`Assert`**  
Una condición que se debe evaluar como `true`.

**`AssertDescription`**  
Un mensaje que se muestra cuando falla una aserción.

## Funciones intrínsecas específicas de la regla
<a name="rules-specific-intrinsic-section-structure"></a>

Para definir sus reglas, debe utilizar *funciones específicas de reglas*, que son funciones que solo se pueden utilizar en la sección `Rules` de una plantilla. Puede anidar funciones, pero el resultado final de una condición de regla o una declaración debe ser `true` o `false`.

Ahora están disponibles las siguientes funciones de reglas:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-contains](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-contains)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberequals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberequals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberin)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-refall](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-refall)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueof](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueof)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueofall](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueofall)

Estas funciones intrínsecas se utilizan en la condición o aserciones de una regla. 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 un producto provisionado. Si el valor de un parámetro no es válido, CloudFormation no crea o actualizar 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.

## Ejemplos
<a name="template-constraint-rules-example"></a>

**Topics**
+ [Comprobación condicional del valor de un parámetro](#template-constraint-rules-example-verify)
+ [Validación de parámetros cruzados](#template-cross-parameter-rules-example)

### Comprobación condicional del valor de un parámetro
<a name="template-constraint-rules-example-verify"></a>

En el siguiente ejemplo, las dos reglas comprueban el valor del `InstanceType` parámetro. En función del valor del parámetro entorno (`test` o `prod`), el usuario debe especificar `t3.medium` o `t3.large` para el parámetro `InstanceType`. Los parámetros `InstanceType` y `Environment` deben declararse en la sección `Parameters` de la misma plantilla.

#### JSON
<a name="rules-section-example-conditionally-verify.json"></a>

```
{
  "Rules": {
    "testInstanceType": {
      "RuleCondition": {
        "Fn::Equals": [
          {"Ref": "Environment"},
          "test"
        ]
      },
      "Assertions": [
        {
          "Assert": {
            "Fn::Contains": [
              ["t3.medium"],
              {"Ref": "InstanceType"}
            ]
          },
          "AssertDescription": "For a test environment, the instance type must be t3.medium"
        }
      ]
    },
    "prodInstanceType": {
      "RuleCondition": {
        "Fn::Equals": [
          {"Ref": "Environment"},
          "prod"
        ]
      },
      "Assertions": [
        {
          "Assert": {
            "Fn::Contains": [
              ["t3.large"],
              {"Ref": "InstanceType"}
            ]
          },
          "AssertDescription": "For a production environment, the instance type must be t3.large"
        }
      ]
    }
  }
}
```

#### YAML
<a name="rules-section-example-conditionally-verify.yaml"></a>

```
Rules:
  testInstanceType:
    RuleCondition: !Equals 
      - !Ref Environment
      - test
    Assertions:
      - Assert:
          'Fn::Contains':
            - - t3.medium
            - !Ref InstanceType
        AssertDescription: 'For a test environment, the instance type must be t3.medium'
  prodInstanceType:
    RuleCondition: !Equals 
      - !Ref Environment
      - prod
    Assertions:
      - Assert:
          'Fn::Contains':
            - - t3.large
            - !Ref InstanceType
        AssertDescription: 'For a production environment, the instance type must be t3.large'
```

### Validación de parámetros cruzados
<a name="template-cross-parameter-rules-example"></a>

Las siguientes plantillas de ejemplo demuestran el uso de reglas para las validaciones entre parámetros. Crean un sitio web de ejemplo que se ejecuta en un grupo de escalado automático detrás de un equilibrador de carga. El sitio web está disponible en los puertos 80 o 443, según los parámetros de entrada. Las instancias del grupo de escalado automático se pueden configurar para que escuchen en cualquier puerto (con 8888 como el valor predeterminado).

Las reglas de esta plantilla validan los parámetros de entrada antes de crear la pila. Comprueban que todas las subredes pertenecen a la VPC especificada y garantizan que, cuando el parámetro `UseSSL` se establece en `Yes`, se proporcionen un ARN de certificado SSL y un nombre de zona alojada.

**nota**  
Se le facturarán los recursos de AWS que utilice si crea una pila a partir de esta plantilla.

#### JSON
<a name="rules-section-example-cross-parameter-validation.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "VpcId": {
      "Type": "AWS::EC2::VPC::Id",
      "Description": "VpcId of your existing Virtual Private Cloud (VPC)",
      "ConstraintDescription": "must be the VPC Id of an existing Virtual Private Cloud."
    },
    "Subnets": {
      "Type": "List<AWS::EC2::Subnet::Id>",
      "Description": "The list of SubnetIds in your Virtual Private Cloud (VPC)",
      "ConstraintDescription": "must be a list of at least two existing subnets associated with at least two different availability zones."
    },
    "InstanceType": {
      "Description": "WebServer EC2 instance type",
      "Type": "String",
      "Default": "t2.micro",
      "AllowedValues": ["t2.micro", "t3.micro"],
      "ConstraintDescription": "must be a valid EC2 instance type."
    },
    "KeyName": {
      "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
      "Type": "AWS::EC2::KeyPair::KeyName",
      "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
    },
    "SSHLocation": {
      "Description": "The IP address range that can be used to SSH to the EC2 instances",
      "Type": "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default": "0.0.0.0/0",
      "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "UseSSL": {
      "AllowedValues": ["Yes", "No"],
      "Default": "No",
      "Description": "Select \"Yes\" to implement SSL, \"No\" to skip (default).",
      "Type": "String"
    },
    "ALBSSLCertificateARN": {
      "Default": "",
      "Description": "[Optional] The ARN of the SSL certificate to be used for the Application Load Balancer",
      "Type": "String"
    },
    "HostedZoneName": {
      "AllowedPattern": "^$|(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$",
      "Default": "",
      "Description": "[Optional] The domain name of a valid Hosted Zone on AWS.",
      "Type": "String"
    }
  },
  "Conditions": {
    "UseALBSSL": {"Fn::Equals": [{"Ref": "UseSSL"}, "Yes"]}
  },
  "Rules": {
    "SubnetsInVPC": {
      "Assertions": [
        {
          "Assert": {"Fn::EachMemberEquals": [{"Fn::ValueOf": ["Subnets", "VpcId"]}, {"Ref": "VpcId"}]},
          "AssertDescription": "All subnets must be in the VPC"
        }
      ]
    },
    "ValidateHostedZone": {
      "RuleCondition": {"Fn::Equals": [{"Ref": "UseSSL"}, "Yes"]},
      "Assertions": [
        {
          "Assert": {"Fn::Not": [{"Fn::Equals": [{"Ref": "ALBSSLCertificateARN"}, ""]}]},
          "AssertDescription": "ACM Certificate value cannot be empty if SSL is required"
        },
        {
          "Assert": {"Fn::Not": [{"Fn::Equals": [{"Ref": "HostedZoneName"}, ""]}]},
          "AssertDescription": "Route53 Hosted Zone Name is mandatory when SSL is required"
        }
      ]
    }
  },
  "Resources": {
    "WebServerGroup": {
      "Type": "AWS::AutoScaling::AutoScalingGroup",
      "Properties": {
        "VPCZoneIdentifier": {"Ref": "Subnets"},
        "LaunchTemplate": {
          "LaunchTemplateId": {"Ref": "LaunchTemplate"},
          "Version": {"Fn::GetAtt": ["LaunchTemplate","LatestVersionNumber"]}
        },
        "MinSize": "2",
        "MaxSize": "2",
        "TargetGroupARNs": [{"Ref": "ALBTargetGroup"}]
      },
      "CreationPolicy": {
        "ResourceSignal": {"Timeout": "PT15M"}
      },
      "UpdatePolicy": {
        "AutoScalingRollingUpdate": {
          "MinInstancesInService": "1",
          "MaxBatchSize": "1",
          "PauseTime": "PT15M",
          "WaitOnResourceSignals": true
        }
      }
    },
    "LaunchTemplate": {
      "Type": "AWS::EC2::LaunchTemplate",
      "Metadata": {
        "Comment": "Install a simple application",
        "AWS::CloudFormation::Init": {
          "config": {
            "packages": {"yum": {"httpd": []}},
            "files": {
              "/var/www/html/index.html": {
                "content": {"Fn::Join": ["\n", ["<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>"]]},
                "mode": "000644",
                "owner": "root",
                "group": "root"
              },
              "/etc/cfn/cfn-hup.conf": {
                "content": {"Fn::Join": ["", [
                  "[main]\n",
                  "stack=", {"Ref": "AWS::StackId"}, "\n",
                  "region=", {"Ref": "AWS::Region"}, "\n"
                ]]},
                "mode": "000400",
                "owner": "root",
                "group": "root"
              },
              "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {
                "content": {"Fn::Join": ["", [
                  "[cfn-auto-reloader-hook]\n",
                  "triggers=post.update\n",
                  "path=Resources.LaunchTemplate.Metadata.AWS::CloudFormation::Init\n",
                  "action=/opt/aws/bin/cfn-init -v ",
                  "         --stack ", {"Ref": "AWS::StackName"},
                  "         --resource LaunchTemplate ",
                  "         --region ", {"Ref": "AWS::Region"}, "\n",
                  "runas=root\n"
                ]]},
                "mode": "000400",
                "owner": "root",
                "group": "root"
              }
            },
            "services": {
              "sysvinit": {
                "httpd": {
                  "enabled": "true",
                  "ensureRunning": "true"
                },
                "cfn-hup": {
                  "enabled": "true",
                  "ensureRunning": "true",
                  "files": [
                    "/etc/cfn/cfn-hup.conf",
                    "/etc/cfn/hooks.d/cfn-auto-reloader.conf"
                  ]
                }
              }
            }
          }
        }
      },
      "Properties": {
        "LaunchTemplateName": {"Fn::Sub": "${AWS::StackName}-launch-template"},
        "LaunchTemplateData": {
          "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
          "SecurityGroupIds": [{"Ref": "InstanceSecurityGroup"}],
          "InstanceType": {"Ref": "InstanceType"},
          "KeyName": {"Ref": "KeyName"},
          "UserData": {
            "Fn::Base64": {"Fn::Join": ["", [
              "#!/bin/bash\n",
              "yum install -y aws-cfn-bootstrap\n",
              "/opt/aws/bin/cfn-init -v ",
              "         --stack ", {"Ref": "AWS::StackName"},
              "         --resource LaunchTemplate ",
              "         --region ", {"Ref": "AWS::Region"}, "\n",
              "/opt/aws/bin/cfn-signal -e $? ",
              "         --stack ", {"Ref": "AWS::StackName"},
              "         --resource WebServerGroup ",
              "         --region ", {"Ref": "AWS::Region"}, "\n"
            ]]}
          }
        }
      }
    },
    "ELBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Allow access to the ELB",
        "VpcId": {"Ref": "VpcId"},
        "SecurityGroupIngress": [{
          "Fn::If": [
            "UseALBSSL",
            {
              "IpProtocol": "tcp",
              "FromPort": 443,
              "ToPort": 443,
              "CidrIp": "0.0.0.0/0"
            },
            {
              "IpProtocol": "tcp",
              "FromPort": 80,
              "ToPort": 80,
              "CidrIp": "0.0.0.0/0"
            }
          ]
        }]
      }
    },
    "ApplicationLoadBalancer": {
      "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties": {
        "Subnets": {"Ref": "Subnets"},
        "SecurityGroups": [{"Ref": "ELBSecurityGroup"}]
      }
    },
    "ALBListener": {
      "Type": "AWS::ElasticLoadBalancingV2::Listener",
      "Properties": {
        "DefaultActions": [{
          "Type": "forward",
          "TargetGroupArn": {"Ref": "ALBTargetGroup"}
        }],
        "LoadBalancerArn": {"Ref": "ApplicationLoadBalancer"},
        "Port": {"Fn::If": ["UseALBSSL", 443, 80]},
        "Protocol": {"Fn::If": ["UseALBSSL", "HTTPS", "HTTP"]},
        "Certificates": [{
          "Fn::If": [
            "UseALBSSL",
            {"CertificateArn": {"Ref": "ALBSSLCertificateARN"}},
            {"Ref": "AWS::NoValue"}
          ]
        }]
      }
    },
    "ALBTargetGroup": {
      "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties": {
        "HealthCheckIntervalSeconds": 30,
        "HealthCheckTimeoutSeconds": 5,
        "HealthyThresholdCount": 3,
        "Port": 80,
        "Protocol": "HTTP",
        "UnhealthyThresholdCount": 5,
        "VpcId": {"Ref": "VpcId"}
      }
    },
    "InstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Enable SSH access and HTTP access on the inbound port",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 80,
            "ToPort": 80,
            "SourceSecurityGroupId": {"Fn::Select": [0, {"Fn::GetAtt": ["ApplicationLoadBalancer", "SecurityGroups"]}]}
          },
          {
            "IpProtocol": "tcp",
            "FromPort": 22,
            "ToPort": 22,
            "CidrIp": {"Ref": "SSHLocation"}
          }
        ],
        "VpcId": {"Ref": "VpcId"}
      }
    },
    "RecordSet": {
      "Type": "AWS::Route53::RecordSetGroup",
      "Condition": "UseALBSSL",
      "Properties": {
        "HostedZoneName": {"Fn::Join": ["", [{"Ref": "HostedZoneName"}, "."]]},
        "RecordSets": [{
          "Name": {"Fn::Join": ["", [
            {"Fn::Select": ["0", {"Fn::Split": [".", {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}]}]},
            ".",
            {"Ref": "HostedZoneName"},
            "."
          ]]},
          "Type": "A",
          "AliasTarget": {
            "DNSName": {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]},
            "EvaluateTargetHealth": true,
            "HostedZoneId": {"Fn::GetAtt": ["ApplicationLoadBalancer", "CanonicalHostedZoneID"]}
          }
        }]
      }
    }
  },
  "Outputs": {
    "URL": {
      "Description": "URL of the website",
      "Value": {"Fn::Join": ["", [
        {"Fn::If": [
          "UseALBSSL",
          {"Fn::Join": ["", [
            "https://",
            {"Fn::Join": ["", [
              {"Fn::Select": ["0", {"Fn::Split": [".", {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}]}]},
              ".",
              {"Ref": "HostedZoneName"},
              "."
            ]]}
          ]]},
          {"Fn::Join": ["", [
            "http://",
            {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}
          ]]}
        ]}
      ]]}
    }
  }
}
```

#### YAML
<a name="rules-section-example-syntax.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VpcId of your existing Virtual Private Cloud (VPC)
    ConstraintDescription: must be the VPC Id of an existing Virtual Private Cloud.
  Subnets:
    Type: List<AWS::EC2::Subnet::Id>
    Description: The list of SubnetIds in your Virtual Private Cloud (VPC)
    ConstraintDescription: >-
      must be a list of at least two existing subnets associated with at least
      two different availability zones. They should be residing in the selected
      Virtual Private Cloud.
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t3.micro
    ConstraintDescription: must be a valid EC2 instance type.
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  UseSSL:
    AllowedValues:
      - 'Yes'
      - 'No'
    ConstraintDescription: Select Yes to create a HTTPS Listener
    Default: 'No'
    Description: 'Select "Yes" to implement SSL, "No" to skip (default).'
    Type: String
  ALBSSLCertificateARN:
    Default: ''
    Description: >-
      [Optional] The ARN of the SSL certificate to be used for the Application
      Load Balancer
    Type: String
  HostedZoneName:
    AllowedPattern: >-
      ^$|(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$
    Default: ''
    Description: '[Optional] The domain name of a valid Hosted Zone on AWS.'
    Type: String
Conditions:
  UseALBSSL: !Equals 
    - !Ref UseSSL
    - 'Yes'
Rules:
  SubnetsInVPC:
    Assertions:
      - Assert:
          'Fn::EachMemberEquals':
            - 'Fn::ValueOf':
                - Subnets
                - VpcId
            - Ref: VpcId
        AssertDescription: All subnets must be in the VPC
  ValidateHostedZone:
    RuleCondition: !Equals 
      - !Ref UseSSL
      - 'Yes'
    Assertions:
      - Assert: !Not 
          - !Equals 
            - !Ref ALBSSLCertificateARN
            - ''
        AssertDescription: ACM Certificate value cannot be empty if SSL is required
      - Assert: !Not 
          - !Equals 
            - !Ref HostedZoneName
            - ''
        AssertDescription: Route53 Hosted Zone Name is mandatory when SSL is required
Resources:
  WebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier: !Ref Subnets
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MinSize: '2'
      MaxSize: '2'
      TargetGroupARNs:
        - !Ref ALBTargetGroup
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: '1'
        MaxBatchSize: '1'
        PauseTime: PT15M
        WaitOnResourceSignals: 'true'
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Metadata:
      Comment: Install a simple application
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          files:
            /var/www/html/index.html:
              content: !Join 
                - |+
                - - >-
                    <h1>Congratulations, you have successfully launched the AWS
                    CloudFormation sample.</h1>
              mode: '000644'
              owner: root
              group: root
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |-
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.LaunchTemplate.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchTemplate --region ${AWS::Region}
                runas=root
              mode: '000400'
              owner: root
              group: root
          services:
            sysvinit:
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              cfn-hup:
                enabled: 'true'
                ensureRunning: 'true'
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    Properties:
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
        SecurityGroupIds:
        - !Ref InstanceSecurityGroup
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        UserData: !Base64
          Fn::Sub: |
            #!/bin/bash
            yum install -y aws-cfn-bootstrap
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchTemplate --region ${AWS::Region}
            /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
  ELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow access to the ELB
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - !If 
          - UseALBSSL
          - IpProtocol: tcp
            FromPort: 443
            ToPort: 443
            CidrIp: 0.0.0.0/0
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: 0.0.0.0/0
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Subnets: !Ref Subnets
      SecurityGroups:
        - !Ref ELBSecurityGroup
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref ALBTargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: !If
        - UseALBSSL
        - 443
        - 80
      Protocol: !If 
        - UseALBSSL
        - HTTPS
        - HTTP
      Certificates:
        - !If 
          - UseALBSSL
          - CertificateArn: !Ref ALBSSLCertificateARN
          - !Ref 'AWS::NoValue'
  ALBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 3
      Port: 80
      Protocol: HTTP
      UnhealthyThresholdCount: 5
      VpcId: !Ref VpcId
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access and HTTP access on the inbound port
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupId: !Select 
            - 0
            - !GetAtt 
              - ApplicationLoadBalancer
              - SecurityGroups
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
      VpcId: !Ref VpcId
  RecordSet:
    Type: AWS::Route53::RecordSetGroup
    Condition: UseALBSSL
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZoneName
          - .
      RecordSets:
        - Name: !Join 
            - ''
            - - !Select 
                - '0'
                - !Split 
                  - .
                  - !GetAtt 
                    - ApplicationLoadBalancer
                    - DNSName
              - .
              - !Ref HostedZoneName
              - .
          Type: A
          AliasTarget:
            DNSName: !GetAtt 
              - ApplicationLoadBalancer
              - DNSName
            EvaluateTargetHealth: true
            HostedZoneId: !GetAtt 
              - ApplicationLoadBalancer
              - CanonicalHostedZoneID
Outputs:
  URL:
    Description: URL of the website
    Value: !Join 
      - ''
      - - !If 
          - UseALBSSL
          - !Join 
            - ''
            - - 'https://'
              - !Join 
                - ''
                - - !Select 
                    - '0'
                    - !Split 
                      - .
                      - !GetAtt 
                        - ApplicationLoadBalancer
                        - DNSName
                  - .
                  - !Ref HostedZoneName
                  - .
          - !Join 
            - ''
            - - 'http://'
              - !GetAtt 
                - ApplicationLoadBalancer
                - DNSName
```

# Sintaxis de Conditions de la plantilla de CloudFormation
<a name="conditions-section-structure"></a>

La sección opcional `Conditions` contiene declaraciones que definen las circunstancias por las que se crean o configuran las entidades. Por ejemplo, puede crear una condición y asociarla a un recurso o salida de manera que CloudFormation cree el recurso o salida solo si la condición es verdadera. Del mismo modo, puede asociar una condición a una propiedad de manera que CloudFormation establezca la propiedad en un valor específico solo si la condición es verdadera. Si la condición es falsa, CloudFormation establece la propiedad en un valor alternativo que especifica.

Puede utilizar condiciones cuando desee reutilizar una plantilla para crear recursos en diferentes contextos, como, por ejemplo, entornos de pruebas frente a entornos de producción. Por ejemplo, en su plantilla, puede agregar un parámetro de entrada `EnvironmentType` que acepte `prod` o `test` como entradas. Para el entorno `prod`, podría incluir instancias de EC2 con determinadas capacidades; sin embargo, para el entorno `test`, podría utilizar capacidades reducidas para ahorrar dinero. La definición de esta condición le permite definir qué recursos se crean y cómo se configuran para cada tipo de entorno.

## Sintaxis
<a name="conditions-section-structure-syntax"></a>

La sección `Conditions` consta del nombre de clave `Conditions`. Cada declaración de condición incluye un ID lógico y una o más funciones intrínsecas. 

### JSON
<a name="conditions-section-structure-syntax.json"></a>

```
"Conditions": {
  "LogicalConditionName1": {
    "Intrinsic function": ...[
  },

  "LogicalConditionName2": {
    "Intrinsic function": ...
  }
}
```

### YAML
<a name="conditions-section-structure-syntax.yaml"></a>

```
Conditions:
  LogicalConditionName1:
    Intrinsic function:
      ...

  LogicalConditionName2:
    Intrinsic function:
      ...
```

## Cómo funcionan las condiciones
<a name="conditions-section-structure-overview"></a>

Para utilizar condiciones, siga estos pasos:

1. **Agregar una definición de parámetro**: defina las entradas que evaluarán sus condiciones en la sección `Parameters` de su plantilla. Las condiciones se evalúan en true o false en función de los valores de estos parámetros de entrada. Tenga en cuenta que los seudoparámetros están disponibles automáticamente y no requieren una definición explícita en la sección `Parameters`. Para obtener más información sobre pseudoparámetros, consulte . [Obtención de valores de AWS mediante pseudoparámetros](pseudo-parameter-reference.md).

1. **Agregar una definición de condición**: defina las condiciones en la sección `Conditions` mediante funciones intrínsecas como `Fn::If` o `Fn::Equals`. Las condiciones determinan cuándo CloudFormation crea los recursos asociados. Las condiciones se pueden basar en lo siguiente:
   + Valores de entrada o de seudoparámetros
   + Otras condiciones
   + Valores de asignación

   Sin embargo, no puede hacer referencia a los ID lógicos de los recursos ni a sus atributos en las condiciones.

1. **Asociar las condiciones a recursos o salidas**: haga referencia a las condiciones en los recursos o las salidas mediante la clave `Condition` y el ID lógico de una condición. También puede usar `Fn::If` en otras partes de la plantilla (como los valores de las propiedades) para establecer valores en función de una condición. Para obtener más información, consulte [Utilización de la clave `Condition`](#using-conditions-in-templates).

CloudFormation evalúa las condiciones al crear o actualizar una pila. CloudFormation crea entidades que se asocian a una condición true e ignora las entidades que están asociadas a una condición false. Además, CloudFormation reevalúa estas condiciones durante las actualizaciones de una pila antes de modificar los recursos. Las entidades que permanecen asociadas a una condición verdadera se actualizan, mientras que las que se asocian a una condición falsa se eliminan.

**importante**  
Durante la actualización de una pila, no se pueden actualizar condiciones por sí mismas. Puede actualizar condiciones solo cuando incluye cambios que añaden, modifican o eliminan recursos.

## Funciones intrínsecas de condiciones
<a name="conditions-section-structure-functions"></a>

Puede utilizar las siguientes funciones intrínsecas para definir condiciones:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)

**nota**  
`Fn::If` solo se admite en el atributo de metadatos, el atributo de la política de actualización y los valores de la propiedad en la sección `Resources` y en la sección `Outputs` de una plantilla.

## Utilización de la clave `Condition`
<a name="using-conditions-in-templates"></a>

Una vez que se define una condición, puede aplicarla en varios lugares de la plantilla, como `Resources` y `Outputs`, mediante la clave `Condition`. La clave `Condition` hace referencia al nombre lógico de una condición y devuelve el resultado evaluado de la condición especificada.

**Topics**
+ [Asociación de condiciones a los recursos](#associate-conditions-with-resources)
+ [Asociación de condiciones a las salidas](#associate-conditions-with-outputs)
+ [Condiciones de referencia en otras condiciones](#reference-conditions-in-other-conditions)
+ [Devuelva condicionalmente los valores de las propiedades mediante `Fn::If`](#conditional-return-property-values-using-fn-if)

### Asociación de condiciones a los recursos
<a name="associate-conditions-with-resources"></a>

Para crear recursos de forma condicional, añada la clave `Condition` y el ID lógico de la condición como un atributo del recurso. CloudFormation crea el recurso únicamente cuando la condición se evalúa como true.

#### JSON
<a name="associate-conditions-with-resources.json"></a>

```
"NewVolume" : {
  "Type" : "AWS::EC2::Volume",
  "Condition" : "IsProduction",
  "Properties" : {
     "Size" : "100",
     "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]}
  }
}
```

#### YAML
<a name="associate-conditions-with-resources.yaml"></a>

```
NewVolume:
  Type: AWS::EC2::Volume
  Condition: IsProduction
  Properties:
    Size: 100
    AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
```

### Asociación de condiciones a las salidas
<a name="associate-conditions-with-outputs"></a>

También puede asociar condiciones a las salidas. CloudFormation crea la salida únicamente cuando la condición asociada se evalúa como verdadera.

#### JSON
<a name="associate-conditions-with-outputs.json"></a>

```
"Outputs" : {
  "VolumeId" : {
    "Condition" : "IsProduction",
    "Value" : { "Ref" : "NewVolume" }
  }
}
```

#### YAML
<a name="associate-conditions-with-outputs.yaml"></a>

```
Outputs:
  VolumeId:
    Condition: IsProduction
    Value: !Ref NewVolume
```

### Condiciones de referencia en otras condiciones
<a name="reference-conditions-in-other-conditions"></a>

Al definir las condiciones en la sección `Conditions`, puede hacer referencia a otras condiciones mediante la clave `Condition`. Esto le permite crear una lógica condicional más compleja mediante la combinación de varias condiciones.

En el siguiente ejemplo, la condición `IsProdAndFeatureEnabled` se evalúa como verdadera solo si las condiciones `IsProduction` y `IsFeatureEnabled` se evalúan como verdaderas.

#### JSON
<a name="reference-conditions-in-other-conditions.json"></a>

```
"Conditions": {
  "IsProduction" : {"Fn::Equals" : [{"Ref" : "Environment"}, "prod"]},
  "IsFeatureEnabled" : { "Fn::Equals" : [{"Ref" : "FeatureFlag"}, "enabled"]},
  "IsProdAndFeatureEnabled" : {
    "Fn::And" : [
      {"Condition" : "IsProduction"},
      {"Condition" : "IsFeatureEnabled"}
    ]
  }
}
```

#### YAML
<a name="reference-conditions-in-other-conditions.yaml"></a>

```
Conditions:
  IsProduction:
    !Equals [!Ref Environment, "prod"]
  IsFeatureEnabled:
    !Equals [!Ref FeatureFlag, "enabled"]
  IsProdAndFeatureEnabled: !And
    - !Condition IsProduction
    - !Condition IsFeatureEnabled
```

### Devuelva condicionalmente los valores de las propiedades mediante `Fn::If`
<a name="conditional-return-property-values-using-fn-if"></a>

Para un control más granular, puede utilizar la función intrínseca `Fn::If` para devolver condicionalmente uno de los dos valores de propiedad de los recursos o las salidas. Esta función evalúa una condición y devuelve un valor si la condición es verdadera y otro valor si la condición es falsa.

#### Valores condicionales de la propiedad
<a name="using-fn-if-for-conditional-values"></a>

En el siguiente ejemplo, se muestra la configuración de un tipo de instancia de EC2 en función de una condición del entorno. Si la condición `IsProduction` es verdadera, el tipo de instancia se establece en `c5.xlarge`. De lo contrario, se establece en `t3.small`.

##### JSON
<a name="using-fn-if-for-conditional-values.json"></a>

```
"Properties" : {
  "InstanceType" : {
    "Fn::If" : [
      "IsProduction",
      "c5.xlarge",
      "t3.small"
    ]
  }
}
```

##### YAML
<a name="using-fn-if-for-conditional-values.yaml"></a>

```
Properties:
  InstanceType: !If
    - IsProduction
    - c5.xlarge
    - t3.small
```

#### Eliminación condicional de propiedades
<a name="using-fn-if-with-novalue"></a>

Puede utilizar el pseudoparámetro `AWS::NoValue` como valor devuelto para eliminar la propiedad correspondiente cuando una condición es falsa.

##### JSON
<a name="using-fn-if-with-novalue.json"></a>

```
"DBSnapshotIdentifier" : {
  "Fn::If" : [
    "UseDBSnapshot",
    {"Ref" : "DBSnapshotName"},
    {"Ref" : "AWS::NoValue"}
  ]
}
```

##### YAML
<a name="using-fn-if-with-novalue.yaml"></a>

```
DBSnapshotIdentifier: !If
  - UseDBSnapshot
  - !Ref DBSnapshotName
  - !Ref "AWS::NoValue"
```

## Ejemplos
<a name="conditions-section-structure-examples"></a>

**Topics**
+ [Creación de recursos en función del entorno](#environment-based-resource-creation)
+ [Aprovisionamiento de recursos con varias condiciones](#multi-condition-resource-provisioning)

### Creación de recursos en función del entorno
<a name="environment-based-resource-creation"></a>

En los siguientes ejemplos se aprovisiona una instancia de EC2 y se crea y adjunta condicionalmente un nuevo volumen de EBS solo si el tipo de entorno es `prod`. Si el entorno es `test`, simplemente se crea la instancia de EC2 sin el volumen adicional.

#### JSON
<a name="conditions-section-example-resource-creation.json"></a>

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

#### YAML
<a name="conditions-section-example-resource-creation.yaml"></a>

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

### Aprovisionamiento de recursos con varias condiciones
<a name="multi-condition-resource-provisioning"></a>

En los siguientes ejemplos se crea condicionalmente un bucket de S3 si se proporciona un nombre de bucket y se adjunta una política de bucket solo cuando el entorno está definido como `prod`. Si no se proporciona ningún nombre de bucket o el entorno es `test`, no se crea ningún recurso.

#### JSON
<a name="conditions-section-example-multi-condition.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "EnvType": {
            "Type": "String",
            "AllowedValues": [
                "prod",
                "test"
            ]
        },
        "BucketName": {
            "Default": "",
            "Type": "String"
        }
    },
    "Conditions": {
        "IsProduction": {
            "Fn::Equals": [
                {
                    "Ref": "EnvType"
                },
                "prod"
            ]
        },
        "CreateBucket": {
            "Fn::Not": [
                {
                    "Fn::Equals": [
                        {
                            "Ref": "BucketName"
                        },
                        ""
                    ]
                }
            ]
        },
        "CreateBucketPolicy": {
            "Fn::And": [
                {
                    "Condition": "IsProduction"
                },
                {
                    "Condition": "CreateBucket"
                }
            ]
        }
    },
    "Resources": {
        "Bucket": {
            "Type": "AWS::S3::Bucket",
            "Condition": "CreateBucket",
            "Properties": {
                "BucketName": {
                    "Ref": "BucketName"
                }
            }
        },
        "Policy": {
            "Type": "AWS::S3::BucketPolicy",
            "Condition": "CreateBucketPolicy",
            "Properties": {
                "Bucket": {
                    "Ref": "Bucket"
                },
                "PolicyDocument": { ... }
            }
        }
    }
}
```

#### YAML
<a name="conditions-section-example-multi-condition.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Type: String
    AllowedValues:
      - prod
      - test
  BucketName:
    Default: ''
    Type: String
Conditions:
  IsProduction: !Equals
    - !Ref EnvType
    - prod
  CreateBucket: !Not
    - !Equals
      - !Ref BucketName
      - ''
  CreateBucketPolicy: !And
    - !Condition IsProduction
    - !Condition CreateBucket
Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Condition: CreateBucket
    Properties:
      BucketName: !Ref BucketName
  Policy:
    Type: AWS::S3::BucketPolicy
    Condition: CreateBucketPolicy
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument: ...
```

En este ejemplo, la condición `CreateBucketPolicy` demuestra cómo hacer referencia a otras condiciones mediante la clave `Condition`. La política se crea solo cuando tanto las condiciones `IsProduction` y `CreateBucket` se evalúan como verdaderas.

**nota**  
Para ver ejemplos más complejos del uso de condiciones, consulte el tema de [atributos de Condition](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-condition.html) en la *Guía de referencia de plantillas de CloudFormation*.

# Sección Transform de la plantilla de CloudFormation
<a name="transform-section-structure"></a>

La sección `Transform` opcional especifica una o varias macros que CloudFormation utiliza para procesar su plantilla de alguna manera. 

Las macros pueden llevar a cabo tareas sencillas, como buscar y reemplazar texto o pueden efectuar transformaciones más amplias en toda la plantilla. CloudFormation ejecuta macros en el orden en que se especifican. Cuando se crea un conjunto de cambios, CloudFormation genera un conjunto de cambios que incluyen el contenido de la plantilla procesada. A continuación, puede revisar los cambios y ejecutar el conjunto de cambios. Para obtener más información sobre cómo funcionan las macros, consulte [Procesamientos personalizados en plantillas de CloudFormation con macros de plantillas](template-macros.md).

CloudFormation también admite *transformaciones*, que son macros alojadas en CloudFormation. CloudFormation trata estas transformaciones de la misma manera que cualquier macro que cree en términos de orden de ejecución y ámbito. Para obtener más información, consulte [Referencia de transformación](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-reference.html).

Para declarar varias macros, utilice un formato de lista y especifique una o varias macros.

Por ejemplo, en el ejemplo de plantilla siguiente, CloudFormation evalúa `MyMacro` y, a continuación, `AWS::Serverless`, los cuales pueden procesar el contenido de toda la plantilla porque están incluidos en la sección `Transform`.

```
# Start of processable content for MyMacro and AWS::Serverless
Transform:
  - MyMacro
  - 'AWS::Serverless'
Resources:
  WaitCondition:
    Type: AWS::CloudFormation::WaitCondition
  MyBucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: amzn-s3-demo-bucket
      Tags: [{"key":"value"}]
      CorsConfiguration: []
  MyEc2Instance:
    Type: AWS::EC2::Instance 
    Properties:
      ImageId: ami-1234567890abcdef0
# End of processable content for MyMacro and AWS::Serverless
```

# Sintaxis de la versión del formato de plantilla de CloudFormation
<a name="format-version-structure"></a>

La sección `AWSTemplateFormatVersion` (opcional) identifica la versión del formato de la plantilla a la que se ajusta la plantilla. La última versión de formato de plantilla es `2010-09-09` y es en la actualidad el único valor válido.

La versión del formato de plantilla no es la misma que la versión de la API. La versión del formato de la plantilla puede cambiar de manera independiente a las versiones de la API.

El valor para la declaración de versión de formato de plantilla debe ser una cadena literal. No puede utilizar un parámetro o una función para especificar la versión de formato de plantilla. Si no especifica un valor, CloudFormation asume la última versión de formato de plantilla. El siguiente fragmento de código es un ejemplo de una declaración válida de versión de formato de plantilla:

## JSON
<a name="format-version-structure-example.json"></a>

```
"AWSTemplateFormatVersion" : "2010-09-09"
```

## YAML
<a name="format-version-structure-example.yaml"></a>

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

# Sintaxis de Description de la plantilla de CloudFormation
<a name="template-description-structure"></a>

La sección `Description` (opcional) permite incluir una cadena de texto que describe la plantilla. Esta sección debe seguir siempre la sección de la versión de formato de plantilla.

El valor de la declaración de la descripción debe ser una cadena literal de entre 0 y 1024 bytes de longitud. No puede utilizar un parámetro o función para especificar la descripción. El siguiente fragmento de código es un ejemplo de una declaración de descripción:

**importante**  
Durante la actualización de una pila, no puede actualizar la sección `Description` por sí misma. Puede actualizarla solo cuando incluye cambios que añaden, modifican o eliminan recursos.

## JSON
<a name="template-description-structure-example.json"></a>

```
"Description" : "Here are some details about the template."
```

## YAML
<a name="template-description-structure-example.yaml"></a>

```
Description: > Here are some details about the template.
```

# Creación de plantillas visualmente con Infrastructure Composer
<a name="infrastructure-composer-for-cloudformation"></a>

AWS Infrastructure Composer (anteriormente conocido como **Application Composer**) lo ayuda a componer y configurar visualmente aplicaciones modernas en AWS. En lugar de escribir código, puede arrastrar y soltar diferentes recursos para crear su aplicación de forma visual. 

*Infrastructure Composer en el modo de consola de CloudFormation* es la herramienta recomendada para trabajar visualmente con plantillas de CloudFormation. Esta versión de Infrastructure Composer, a la que puede acceder desde la consola de CloudFormation, es una mejora con respecto a una herramienta anterior denominada CloudFormation Designer. 

Con Infrastructure Composer en el modo de consola de CloudFormation, puede arrastrar, soltar, configurar y conectar una variedad de recursos, denominados *tarjetas*, en un lienzo visual. Este enfoque visual facilita el diseño y la edición de la arquitectura de la aplicación sin tener que trabajar directamente con las plantillas. Para acceder a este modo desde la [consola de CloudFormation](https://console.aws.amazon.com/cloudformation/), seleccione **Infrastructure Composer** en el menú de navegación de la izquierda.

Para obtener más información, consulte [Cómo componer en AWS Infrastructure Composer](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/using-composer-basics.html) en la *Guía del usuario de AWS Infrastructure Composer*.

## ¿Por qué utilizar Infrastructure Composer en el modo de consola de CloudFormation?
<a name="app-composer-for-cloudformation-why-use"></a>

Visualizar plantillas en Infrastructure Composer lo ayuda a identificar brechas y áreas de mejora en las plantillas y en la arquitectura de las aplicaciones de CloudFormation. Infrastructure Composer mejora la experiencia de desarrollo con la facilidad y la eficiencia de crear y modificar visualmente las pilas de CloudFormation. Puede empezar con un borrador inicial, crear un código implementable e incorporar los flujos de trabajo de desarrollador con el diseñador visual de Infrastructure Composer.

## ¿En qué se diferencia este modo de la consola de Infrastructure Composer?
<a name="app-composer-for-cloudformation-differences"></a>

Si bien la versión de consola de CloudFormation de Infrastructure Composer tiene características similares a las de la consola estándar de Infrastructure Composer, existen algunas diferencias. Las tarjetas relacionadas con Lambda (la **función de Lambda** y la **capa de Lambda**) requieren conjuntos de códigos y soluciones de empaquetado que no están disponibles en Infrastructure Composer en el modo de consola de CloudFormation. La sincronización local tampoco está disponible en este modo.

Sin embargo, puede utilizar estas tarjetas relacionadas con Lambda y la característica de sincronización local en la [consola de Infrastructure Composer](https://console.aws.amazon.com/composer/home) o en el AWS Toolkit for Visual Studio Code. Para más información, consulte [Guía de desarrolladores de AWS Infrastructure Composer](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/what-is-composer.html) e [Infrastructure Composer](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/appcomposer.html) en la *Guía del usuario de AWS Toolkit for Visual Studio Code*.

# Servidor de lenguaje de AWS CloudFormation
<a name="ide-extension"></a>

El servidor de lenguaje de AWS CloudFormation ofrece capacidades para acelerar la creación de la Infraestructura como código (IaC) y la implementación de recursos de AWS de forma segura y confiable. Sigue el [protocolo de servidor de lenguaje](https://microsoft.github.io/language-server-protocol/) (LSP) para proporcionar documentación sobre cómo pasar el ratón, completar automáticamente, realizar diagnósticos mediante validación estática, ir a la definición y codificar acciones. Además de estas capacidades de servidor de lenguaje tradicional, el servidor añade características en línea para explorar e implementar recursos de AWS a través de CloudFormation. Esto incluye la capacidad de validar e implementar plantillas mediante conjuntos de cambios; ver las diferencias, los eventos, los recursos y las salidas de las pilas; enumerar las pilas y buscar los recursos por tipo, e insertar el estado de los recursos en tiempo real directamente en las plantillas de CloudFormation.

**Topics**
+ [Los IDE se integran con el servidor de lenguaje de AWS CloudFormation](#ide-extension-supported-ides)
+ [Introducción](#ide-extension-getting-started)
+ [Inicialización de un proyecto de CloudFormation en el IDE (solo VS Code)](#ide-extension-initialize-project)
+ [Código abierto](#ide-extension-open-source)
+ [¿Necesita ayuda?](#ide-extension-need-help)

## Los IDE se integran con el servidor de lenguaje de AWS CloudFormation
<a name="ide-extension-supported-ides"></a>

AWS ofrece una integración disponible con el servidor de lenguaje de CloudFormation mediante el Kit de herramientas de AWS para los siguientes IDE:
+ [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode)
+ [Los IDE de JetBrains](https://plugins.jetbrains.com/plugin/11349-aws-toolkit) (versión 2025.3 o posterior), como IntelliJ IDEA, WebStorm y PyCharm

Los siguientes IDE también son compatibles con el servidor de lenguaje de CloudFormation:
+ [Kiro](https://kiro.dev/downloads/)
+ [Cursor](https://cursor.com/)
+ La mayoría de los forks y las distribuciones de VS Code

El servidor de lenguaje de CloudFormation se adhiere al [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) y, por lo tanto, se pueden configurar otras integraciones. Para obtener instrucciones sobre cómo integrar el servidor de lenguaje con otros editores, consulte la [guía de instalación](https://github.com/aws-cloudformation/cloudformation-languageserver/blob/main/INSTALLATION.md).

## Introducción
<a name="ide-extension-getting-started"></a>

**Topics**
+ [Requisitos previos](#ide-extension-prerequisites)
+ [Paso 1: instalar o actualizar el Kit de herramientas de AWS](#ide-extension-install-toolkit)
+ [Paso 2: acceder a CloudFormation en el Kit de herramientas de AWS](#ide-extension-access-toolkit-panel)
+ [Paso 3: validar, probar y refinar la plantilla](#ide-extension-validate-test-refine)
+ [Paso 4: navegar por la plantilla](#ide-extension-navigate-template)
+ [Paso 5: validar e implementar](#ide-extension-validate-deploy)

### Requisitos previos
<a name="ide-extension-prerequisites"></a>

Antes de comenzar, asegúrese de que:
+ Está utilizando un IDE compatible con un sistema operativo (macOS, Windows o Linux).
+ Ha instalado o actualizado a la última versión del Kit de herramientas de AWS para su IDE.

Algunas características del servidor de lenguaje de AWS CloudFormation requieren una Cuenta de AWS activa y credenciales configuradas. Debe iniciar sesión en su Cuenta de AWS a través del Kit de herramientas de AWS con credenciales válidas.

### Paso 1: instalar o actualizar el Kit de herramientas de AWS
<a name="ide-extension-install-toolkit"></a>

Instale o actualice a la última versión del Kit de herramientas de AWS desde el administrador de extensiones o complementos de su IDE y luego reinicie el IDE.

Tras la instalación, el Kit de herramientas de AWS habilita automáticamente la compatibilidad con el IDE de CloudFormation. La primera vez que instale o actualice el Kit de herramientas de AWS con la extensión de servidor de lenguaje de AWS CloudFormation, se le solicitará que conceda permiso a AWS para recopilar datos de uso anónimos. Estos datos ayudan a que AWS mejore el servidor de lenguaje de CloudFormation y mejoran la experiencia de creación. No se recopila información confidencial y AWS no registra ni almacena el contenido de las plantillas, las configuraciones de los recursos ni ningún dato identificable del cliente. Puede cambiar las preferencias de telemetría en cualquier momento desde la configuración del IDE. Reinicie el IDE para que los cambios surtan efecto. Los datos de uso recopilados se centran únicamente en las interacciones de las características y las métricas de rendimiento. Esta información ayuda a AWS a identificar y priorizar mejoras, como una validación más rápida, un mejor autocompletado y un mejor diagnóstico de errores.

### Paso 2: acceder a CloudFormation en el Kit de herramientas de AWS
<a name="ide-extension-access-toolkit-panel"></a>

Luego de instalar el Kit de herramientas de AWS, abra el panel de CloudFormation en su IDE. En VS Code, abra el panel del Kit de herramientas de AWS desde la barra de actividades y seleccione **CLOUDFORMATION**. En los IDE de JetBrains, abra la ventana de herramientas del **Kit de herramientas de AWS** desde la barra lateral y seleccione la pestaña **CloudFormation**.

El panel de CloudFormation contiene las siguientes secciones:
+ **Región**: muestra la Región de AWS actual. En VS Code, puede cambiarla seleccionando el nombre de la región o utilizando el comando **AWS CloudFormation: seleccionar región** de la paleta de comandos. En los IDE de JetBrains, la región se configura mediante los ajustes de conexión del Kit de herramientas de AWS.
+ **Pilas**: muestra una lista paginada de las pilas de CloudFormation de su cuenta. Expanda una pila para ver su nodo de **Conjuntos de cambios**, que muestra los conjuntos de cambios asociados. Utilice la acción Ver detalles de la pila para abrir la vista de detalles de la pila, que muestra su descripción general, eventos, resultados y recursos.
+ **Recursos**: Después de agregar un tipo de recurso, el panel muestra los recursos de AWS de ese tipo en su cuenta. Puede verlos, actualizarlos, copiarlos o importarlos a su plantilla.

En los IDE de JetBrains, la barra de herramientas situada sobre el árbol otorga un acceso rápido a las acciones habituales, como **Validar e implementar**, **Volver a ejecutar, validar e implementar**, **Agregar tipo de recurso** y **Actualizar**. Las acciones también están disponibles en los menús contextuales que se abren al hacer clic derecho en los nodos del árbol.

### Paso 3: validar, probar y refinar la plantilla
<a name="ide-extension-validate-test-refine"></a>

A medida que redacta la plantilla de CloudFormation, el IDE proporciona asistencia de creación inteligente para ayudarle a crear una infraestructura precisa y compatible con mayor rapidez. El servidor de lenguaje de CloudFormation se ejecuta en segundo plano y proporciona las siguientes características de creación:
+ Finalización de código: sugiere tipos de recursos, parámetros y propiedades en función de los esquemas de CloudFormation.
+ Añadir recursos de AWS existentes: le permite importar los recursos existentes de su Cuenta de AWS a su plantilla. El IDE usa el [API de control de nube de AWS (CCAPI)](https://docs.aws.amazon.com/cloudcontrolapi/latest/userguide/what-is-cloudcontrolapi.html) para recuperar la configuración activa y las propiedades del recurso, lo que le ayuda a clonar o reutilizar la infraestructura existente en su plantilla.
+ Extraer a parámetro: cuando el cursor está sobre un valor literal de una plantilla (por ejemplo, una cadena similar a `t2.micro`), el IDE ofrece una acción de refactorización para extraer el valor en la sección `Parameters` y reemplazar el literal por `!Ref` para el nuevo parámetro. Si el mismo valor literal aparece en diversos lugares, puede optar por extraer todas las apariciones a la vez.

#### Adición de recursos a una plantilla
<a name="ide-extension-add-resources-to-template"></a>
+ **Agregue un tipo de recurso**: En el panel de CloudFormation de Kit de herramientas de AWS, en **Recursos**, agregue un tipo de recurso para consultarlo. En VS Code, haga clic en el icono **Agregar \$1** o utilice el comando **AWS CloudFormation: Agregar tipos de recursos** de la paleta de comandos. En JetBrains, haga clic en el botón **Agregar tipo de recurso** de la barra de herramientas o haga clic derecho en el nodo de **Recursos**.
+ **Busque un tipo de recurso**: En el cuadro de diálogo de búsqueda, escriba el tipo de recurso de AWS que desee agregar. Ejemplo:
  + `AWS::S3::Bucket`
  + `AWS::Lambda::Function`
+ **Explore los recursos**: En la sección **Recursos**, se muestra una lista paginada de los recursos de AWS detectados en su cuenta. Si tiene muchos recursos, solo se muestra la primera página. Use los controles de navegación para desplazarse por páginas adicionales y ver todos los recursos disponibles.
+ Elija el recurso que desea incluir en la plantilla.
+ Puede insertar un recurso en la plantilla en dos formas, en función de su objetivo:
  + **Clonar un recurso existente**: para crear un recurso nuevo en su plantilla, utilice la configuración activa y las propiedades de un recurso de AWS existente.
  + **Importar un recurso existente**: para insertar el recurso real en su pila, añádalo a su plantilla utilizando su estado activo.

**Consejos**
+ Puede actualizar la sección **Recursos** en cualquier momento para ver la lista más reciente de recursos disponibles en su cuenta o región.
+ Si va a importar recursos, no añada un recurso que ya pertenezca a una pila de CloudFormation existente en la misma cuenta.
+ Para confirmar si CloudFormation ya administra un recurso, utilice la acción de información disponible junto al recurso. En VS Code, haga clic en el icono **i**. En los IDE de JetBrains, haga clic derecho en el recurso y seleccione **Obtener información de administración de la pila**.

##### Adición de recursos relacionados
<a name="ide-extension-add-related-resources"></a>

En VS Code, puede agregar recursos relacionados al recurso seleccionado mediante el comando **AWS CloudFormation: Agregar recursos relacionados por tipo**. Una vez que haya seleccionado un tipo de recurso entre los que ya están definidos en la plantilla, el IDE muestra una lista de los recursos que normalmente están asociados a ese tipo o que dependen de él. Por ejemplo, si selecciona `AWS::EC2::Instance`, el IDE puede sugerirle que añada recursos relacionados, como `AWS::EC2::SecurityGroup` o `AWS::EC2::Subnet`. Esta característica le ayuda a crear rápidamente componentes de infraestructura conectados sin tener que buscar manualmente los tipos de recursos compatibles. Esta característica no se admite actualmente en los IDE de JetBrains.

#### Validación estática
<a name="ide-extension-static-validation"></a>

El servicio de lenguaje de CloudFormation proporciona una validación estática integrada con la tecnología de [AWS CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint) y [AWS CloudFormation Guard](https://docs.aws.amazon.com/cfn-guard/latest/ug/what-is-guard.html). Estas validaciones se llevan a cabo en segundo plano a medida que crea plantillas, lo que le ayuda a identificar los errores de sintaxis, las brechas de conformidad y los problemas relacionados con las prácticas recomendadas antes de la implementación.

**Descripción general de la validación estática**

Verá dos tipos de validaciones estáticas en tiempo real en el IDE:
+ CloudFormation Linter (`cfn-lint`): valida la plantilla según las especificaciones de recursos y las reglas del esquema de CloudFormation.
+ Guard (`cfn-guard`): valida la plantilla según las normas de cumplimiento y los paquetes de políticas organizacionales.

##### CloudFormation Linter (cfn-lint)
<a name="ide-extension-cfn-linter-details"></a>

CloudFormation Linter está integrado en el IDE para comprobar automáticamente la sintaxis y la estructura de la plantilla a medida que escribe.
+ **Validación de esquemas**: detecta errores de sintaxis y esquema para garantizar que las plantillas se ajusten al esquema de recursos de CloudFormation.
+ **Resaltado de error**: muestra marcadores en línea debajo de los problemas, que representan advertencias o bloqueos de implementación.
+ **Pase el cursor sobre la ayuda**: al pasar el cursor por encima de un error, el IDE muestra el mensaje de diagnóstico asociado a ese problema. También estará disponible una solución rápida, de haber alguna. 

##### Integración de CI/CD
<a name="ide-extension-cfn-guard-integration"></a>

Guard valida sus plantillas comparándolas con los conjuntos de reglas que definen las políticas de cumplimiento y seguridad. El IDE ejecuta las validaciones de Guard en tiempo real a través del servidor de lenguaje de CloudFormation, lo que le proporciona comentarios inmediatos mientras crea plantillas.
+ **Paquetes de reglas predeterminados**: el IDE incluye un conjunto de reglas de Guard previamente registradas que se centran en las prácticas recomendadas fundamentales para la seguridad de los recursos y la higiene de la configuración. Para obtener más información, consulte [el registro de reglas de Guard](https://github.com/aws-cloudformation/aws-guard-rules-registry).
+ **Cómo agregar paquetes de reglas**: para agregar o modificar conjuntos de reglas, abra los ajustes de su IDE y diríjase a la sección de configuración de Guard para seleccionar o cargar paquetes de reglas de Guard adicionales.

**Consejos**: Comprensión de los indicadores de diagnóstico
+ Indicadores azules: sugerencias de prácticas recomendadas o recomendaciones de optimización.
+ Indicadores amarillos: advertencias sobre problemas no relacionados con el bloqueo (por ejemplo, falta de etiquetas o parámetros).
+ Indicadores rojos: bloquean la implementación, como nombres de propiedades no válidos, campos obligatorios que faltan o discordancias en los esquemas.

### Paso 4: navegar por la plantilla
<a name="ide-extension-navigate-template"></a>

El IDE ofrece una vista jerárquica y estructurada de la plantilla de CloudFormation, organizada en secciones como `Parameters`, `Resources`, `Outputs` y `Mappings` que muestran cada tipo de recurso e ID lógico. Esto facilita la búsqueda rápida de recursos o parámetros específicos dentro de plantillas grandes y la navegación a ellos. En VS Code, el panel **Esquema** de la barra lateral del **Explorador** muestra esta estructura. En los IDE de JetBrains, abra la ventana de herramientas **Estructura** para ver la estructura de la plantilla del archivo que está abierto.

Puede utilizar **Ir a la definición** para funciones intrínsecas, como `GetAtt` y `Ref`, que le permite ir directamente al recurso o parámetro al que se hace referencia en la plantilla. Esto le ayuda a rastrear las dependencias, comprender las relaciones entre los recursos y realizar modificaciones de manera más eficiente.

### Paso 5: validar e implementar
<a name="ide-extension-validate-deploy"></a>

Cuando tenga todo listo para implementar la plantilla de CloudFormation, utilice la característica Validar e implementar para crear un conjunto de cambios. El IDE valida la plantilla y, si no se encuentra ningún error de bloqueo, crea un [conjunto de cambios con reconocimiento de desviación](drift-aware-change-sets.md). Luego, el IDE muestra una vista de diferencias para que pueda revisar todos los cambios propuestos antes de ejecutar el conjunto de cambios.

En VS Code, abra la paleta de comandos y ejecute **AWS CloudFormation: Validar e implementar**. La paleta de comandos permite seleccionar una plantilla, el nombre de la pila, los parámetros, las capacidades y otras opciones de implementación. En los IDE de JetBrains, utilice el botón de la barra de herramientas **Validar e implementar**, haga clic derecho en un archivo de plantilla del editor o en una pila del árbol. JetBrains presenta un cuadro de diálogo con un asistente en el que se pueden configurar todas las opciones de implementación, entre ellas la selección de plantillas, el nombre de la pila, los parámetros, las capacidades, las etiquetas y las opciones avanzadas.

#### Cómo funciona la validación
<a name="ide-extension-how-validation-works"></a>

El IDE realiza automáticamente una [comprobación de validación antes de la implementación](validate-stack-deployments.md) y valida la plantilla en función de las causas de error más comunes, entre las que se incluyen las siguientes:
+ Discordancias entre esquemas o sintaxis de propiedades no válidas: estos problemas suele detectarlos `cfn-lint` durante la creación, pero si continúa con la implementación sin solucionarlos, la validación de CloudFormation en el momento de la implementación mostrará los mismos errores antes de que se cree o actualice la pila.
+ El nombre del recurso entra en conflicto con los recursos existentes en su cuenta.
+ Restricciones específicas del servicio, como conflictos en el nombre del bucket de S3 o falta de cifrado.

Si la validación detecta errores, el IDE resalta los problemas directamente en la plantilla y enumera los errores en el panel de diagnóstico. Cada problema incluye la propiedad o el recurso específico que causó el error, junto con una sugerencia de solución. Si no hay errores de bloqueo, puede pasar a la fase de implementación.

Si se encuentran advertencias (problemas no relacionados con el bloqueo), aparece un cuadro de diálogo que le permite continuar con la implementación o cancelar y realizar las correcciones necesarias.

El IDE abre un [conjunto de cambios con reconocimiento de desviación](drift-aware-change-sets.md) en el que se muestran las diferencias entre la plantilla actual y la configuración de la pila implementada. Esto le permite revisar, confirmar o cancelar el conjunto de cambios antes de su ejecución. Si se cancela la implementación, se elimina el conjunto de cambios.

Los conjuntos de cambios con reconocimiento de desviación mejoran el proceso de implementación de CloudFormation al permitirle gestionar la desviación de la pila de forma segura. La desviación de la pila se produce cuando el estado real de los recursos difiere del definido en la plantilla de CloudFormation, a menudo debido a cambios manuales realizados mediante la Consola de administración de AWS, la CLI o el SDK. Los [conjuntos de cambios con reconocimiento de desviación](drift-aware-change-sets.md) de CloudFormation compara la configuración de la pila procesada con el estado actual de los recursos, y el IDE muestra estas diferencias para que pueda hacer que los recursos vuelvan a cumplir con las normas antes de la implementación.

#### Visualización de eventos de pilas
<a name="ide-extension-view-stack-events"></a>

Cuando comience la implementación, puede supervisar el progreso en tiempo real desde el panel de CloudFormation. En **Eventos de la pila**, verá una lista de las operaciones realizadas durante la implementación. Cada evento incluye detalles como:
+ **Marca temporal**: la hora en que ocurrió el evento.
+ **Recurso**: el recurso de AWS específico que se crea, actualiza o elimina
+ **Estado**: el estado actual de la operación (por ejemplo, `CREATE_IN_PROGRESS`, `UPDATE_COMPLETE` o `ROLLBACK_IN_PROGRESS`)
+ **Motivo**: mensajes de contexto o de error adicionales, si corresponde

También puede ver los **recursos** y las **salidas** de la pila desde este panel. La vista **Eventos de la pila** le ayuda a realizar un seguimiento del progreso de la implementación, identificar posibles problemas y confirmar si la pila se ha completado correctamente.

## Inicialización de un proyecto de CloudFormation en el IDE (solo VS Code)
<a name="ide-extension-initialize-project"></a>

La inicialización de un proyecto de CloudFormation en el IDE le ayuda a configurar un espacio de trabajo estructurado con las carpetas, la configuración del entorno y las credenciales de AWS correctas para que pueda validar e implementar sus plantillas de forma fiable. Puede inicializar un nuevo proyecto de CloudFormation directamente desde el IDE para crear la configuración recomendada. Esta característica solo está disponible en VS Code y no es compatible con los IDE de JetBrains.

**Para inicializar un proyecto de CloudFormation:**
+ **Abra la paleta de comandos**
  + Desde VS Code, abra la paleta de comandos (`Ctrl+Shift+P` o `Cmd+Shift+P` en macOS).
  + Elija **AWS CloudFormation: CFN Init: inicializar proyecto**.
+ **Elija un directorio de proyectos**
  + El IDE utiliza su directorio de trabajo actual de forma predeterminada.
  + Puede cambiar esta ruta a cualquier carpeta en la que desea almacenar las plantillas de CloudFormation.
+ **Seleccione su perfil de credenciales de AWS**
  + Se le pedirá que elija un perfil de credencial de AWS. El perfil seleccionado se utiliza para la detección, las validaciones y las implementaciones del entorno.
+ **Configure el entorno**
  + Se le pedirá que cree o seleccione un entorno.
  + Los entornos definen dónde y cómo se implementan o validan las plantillas (por ejemplo, desarrollo, versión beta o producción). Puede usar **AWS CloudFormation: CFN Init: añadir entorno** para seleccionar o cambiar su entorno.
  + Puede usar **AWS CloudFormation: CFN Init: eliminar entorno** para eliminar el entorno que ha seleccionado.
+ **(Opcional) Importe archivos de parámetros**
  + Si ya tiene archivos de parámetros existentes, el IDE le permite importarlos durante la inicialización.
  + El IDE detecta automáticamente los archivos compatibles y los vincula a su proyecto para utilizarlos en la validación y la implementación de la plantilla.
+ **Asigne un nombre al proyecto y finalícelo**
  + Proporcione un nombre de proyecto, como un entorno beta, y complete la configuración.
  + El IDE crea automáticamente la estructura inicial del proyecto y el archivo de configuración.

Puede ejecutar validaciones, previsualizar las implementaciones o cambiar de un entorno a otro directamente desde el IDE.

## Código abierto
<a name="ide-extension-open-source"></a>

El servidor de lenguaje de AWS CloudFormation es de código abierto bajo la licencia de Apache-2.0, lo que brinda a los clientes total transparencia sobre cómo se realizan el diagnóstico de las plantillas, la validación de esquemas y el análisis estático. Esto reduce los problemas de seguridad y cumplimiento para los clientes que requieren visibilidad a nivel de origen antes de adoptar las herramientas.

La base de código está disponible públicamente en GitHub: [https://github.com/aws-cloudformation/cloudformation-languageserver/](https://github.com/aws-cloudformation/cloudformation-languageserver/).

## ¿Necesita ayuda?
<a name="ide-extension-need-help"></a>

Pruebe la [comunidad de CloudFormation](https://repost.aws/tags/TAm3R3LNU3RfSX9L23YIpo3w) en AWS re:Post.

# Generar plantillas de los recursos existentes con el generador IaC
<a name="generate-IaC"></a>

Con la infraestructura de CloudFormation como generador de código (generador de IaC), puede generar una plantilla con los recursos de AWS aprovisionados en su cuenta que CloudFormation aún no administra. 

Los siguientes son los beneficios del generador de IaC:
+ Administre aplicaciones enteras en CloudFormation o mígrelas a una aplicación de AWS CDK.
+ Genere plantillas sin tener que describir un recurso propiedad por propiedad y, a continuación, tradúzcalas a la sintaxis de JSON o YAML.
+ Use la plantilla para replicar recursos en una nueva cuenta o región.

El proceso de generación de IaC consta de los siguientes pasos:

1. **Escaneo de recursos**: el primer paso es iniciar un escaneo de los recursos. Este escaneo se lleva a cabo en toda la región y vence a los 30 días. Durante este tiempo, puede crear varias plantillas a partir del mismo escaneo.

1. **Creación de la plantilla**: para crear la plantilla, tiene dos opciones:
   + Cree una plantilla nueva desde cero y agregue los recursos escaneados y los recursos relacionados.
   + Utilice una pila de CloudFormation existente como punto de partida y agregue los recursos escaneados y los recursos relacionados a su plantilla.

1. **Importación de recursos**: utilice la plantilla para importar los recursos como una pila de CloudFormation o para migrarlos a una aplicación de AWS CDK.

La característica de generador de IaC está disponible en todas las regiones comerciales y es compatible con muchos tipos de recursos comunes de AWS. Para obtener una lista completa de recursos admitidos, consulte [Tipo de recurso compatible](resource-import-supported-resources.md).

**Topics**
+ [Consideraciones](#iac-generator-considerations)
+ [Permisos de IAM necesarios para escanear recursos](#iac-generator-permissions)
+ [Comandos utilizados con frecuencia para la generación, administración y eliminación de plantillas](#iac-generator-commonly-used-commands)
+ [Migración de una plantilla al AWS CDK](#iac-generator-cdk-migrate)
+ [Cómo iniciar un escaneo de recursos con el generador de IaC de CloudFormation](iac-generator-start-resource-scan.md)
+ [Ver el resumen de análisis en la consola de CloudFormation](generate-IaC-view-scan-summary.md)
+ [Creación de una plantilla de CloudFormation a partir de recursos escaneados con el generador de IaC](iac-generator-create-template-from-scanned-resources.md)
+ [Creación de una pila de CloudFormation a partir de recursos escaneados](iac-generator-create-stack-from-scanned-resources.md)
+ [Resolución de propiedades de solo escritura](generate-IaC-write-only-properties.md)

## Consideraciones
<a name="iac-generator-considerations"></a>

Puede generar plantillas JSON o YAML para los recursos de AWS a los que tenga acceso de lectura. Las plantillas para la función del generador de IaC modelan los recursos en la nube de forma fiable y rápida sin tener que describir un recurso propiedad por propiedad.

En la siguiente tabla, se enumeran las cuotas disponibles para la característica de generación de IaC.


| Nombre | Escaneo completo | Escaneo parcial | 
| --- | --- | --- | 
|  Cantidad máxima de recursos que se pueden procesar en un escaneo  |  100 000  |  100 000  | 
|  Cantidad de escaneos por día (para escaneos con menos de 10 000 recursos)  |  10  |  10  | 
|  Cantidad de escaneos por día (para escaneos con más de 10 000 recursos)  |  1  |  1  | 
|  Número simultáneo de plantillas generadas por cuenta  |  5  |  5  | 
|  Cantidad simultánea de recursos modelados para la generación de una plantilla  |  5  |  5  | 
|  Número total de recursos que se pueden modelar en una plantilla  |  500  |  500  | 
|  Número máximo de plantillas generadas por cuenta  |  1 000  |  1 000  | 

**importante**  
El generador de IaC solo admite los recursos de AWS compatibles con la API de Cloud Control en su región. Para obtener más información, consulte [Tipo de recurso compatible](resource-import-supported-resources.md).

## Permisos de IAM necesarios para escanear recursos
<a name="iac-generator-permissions"></a>

Para escanear los recursos con el generador de IaC, su entidad principal de IAM (usuario, rol o grupo) debe tener:
+ Permisos de escaneo de CloudFormation
+ Permisos de lectura para los servicios de destino de AWS

El alcance del escaneo se limita a los recursos a los que tiene acceso de lectura. Si faltan permisos, el escaneo no generará un error, pero excluirá esos recursos.

Para ver una política de IAM de ejemplo que concede permisos de escaneo y de gestión de plantillas, consulte [Permitir todas las operaciones del generador de IaC](security_iam_id-based-policy-examples.md#iam-policy-example-for-iac-generator).

## Comandos utilizados con frecuencia para la generación, administración y eliminación de plantillas
<a name="iac-generator-commonly-used-commands"></a>

Los comandos utilizados con frecuencia para trabajar con políticas de escalado incluyen los siguientes: 
+ [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html) para iniciar un escaneo de los recursos de la cuenta en una Región de AWS. 
+ [describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html) para supervisar el progreso de un escaneo de recursos. 
+ [list-resource-scans](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scans.html) para enumerar los escaneos de recursos en una Región de AWS.
+ [list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html) para enumerar los recursos que se encuentran durante el escaneo de recursos.
+  [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html) para enumerar los recursos relacionados con los recursos escaneados.
+ [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html) para generar una plantilla de CloudFormation a partir de un conjunto de recursos escaneados.
+ [update-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-generated-template.html) para actualizar la plantilla generada.
+ [describe-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-generated-template.html) para devolver información sobre una plantilla generada.
+ [list-generated-templates](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-generated-templates.html) para enumerar todas las plantillas generadas en su cuenta y región actual.
+ [delete-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/delete-generated-template.html) para eliminar una plantilla generada.

## Migración de una plantilla al AWS CDK
<a name="iac-generator-cdk-migrate"></a>

El AWS Cloud Development Kit (AWS CDK) es un marco de desarrollo de software de código abierto que puede utilizar para desarrollar, administrar e implementar los recursos de CloudFormation mediante lenguajes de programación populares.

La CLI de AWS CDK proporciona una integración con el generador de IaC. Use el comando `cdk migrate` de la CLI del AWS CDK para generar una plantilla de CloudFormation y crear una nueva aplicación del CDK que contenga los recursos. A continuación, puede utilizar el AWS CDK para administrar los recursos y las implementaciones para CloudFormation.

Para obtener más información, consulte [Migrar a AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/migrate.html) en la *Guía para desarrolladores de AWS Cloud Development Kit (AWS CDK)*.

# Cómo iniciar un escaneo de recursos con el generador de IaC de CloudFormation
<a name="iac-generator-start-resource-scan"></a>

Antes de crear una plantilla a partir de recursos existentes, primero debe iniciar un escaneo de recursos para descubrir los recursos actuales y sus relaciones.

Puede iniciar un escaneo de recursos a través de una de las siguientes opciones. Recomendamos la primera opción para quienes utilizan el generador de IaC por primera vez.
+ **Escanear todos los recursos (escaneo completo)**: escanea todos los recursos existentes en la cuenta y región actuales. Este proceso de escaneo puede tardar hasta 10 minutos para 1000 recursos.
+ **Escanear recursos específicos (escaneo parcial)**: seleccione manualmente qué tipos de recursos escanear en la cuenta y la región actuales. Esta opción ofrece un proceso de escaneo más rápido y enfocado, lo que la hace ideal para el desarrollo iterativo de plantillas.

Una vez que se completa el escaneo, puede elegir qué recursos y sus recursos relacionados incluir al generar la plantilla. Al utilizar el escaneo parcial, los recursos relacionados solo estarán disponibles durante la generación de la plantilla si se cumple alguna de las siguientes condiciones:
+ Los seleccionó específicamente antes de iniciar el escaneo, o
+ Fueron necesarios para detectar los tipos de recursos que seleccionó. 

Por ejemplo, si selecciona un `AWS::EKS::Nodegroup` sin seleccionar el `AWS::EKS::Cluster`, el generador de IaC incluye automáticamente los recursos del `AWS::EKS::Cluster` en el escaneo, ya que para detectar el grupo de nodos es necesario detectar primero el clúster. En todos los demás casos, el escaneo solo incluirá los recursos que seleccione específicamente.

**nota**  
Antes de continuar, confirme que cuenta con los permisos necesarios para trabajar con el generador de IaC. Para obtener más información, consulte [Permisos de IAM necesarios para escanear recursos](generate-IaC.md#iac-generator-permissions).

**Topics**
+ [Inicio de un escaneo de recursos (consola)](#start-resource-scan-console)
+ [Inicio de un escaneo de recursos (AWS CLI)](#start-resource-scan-cli)

## Inicio de un escaneo de recursos (consola)
<a name="start-resource-scan-console"></a>

**Para iniciar un escaneo de recursos de todos los tipos de recursos (escaneo completo)**

1. Abra la [página del generador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) de la consola de CloudFormation.

1. En la barra de navegación de la parte superior de la pantalla, elija la Región de AWS que contenga los recursos que desea escanear.

1. En el panel **Escaneos**, elija **Iniciar un nuevo escaneo** y, a continuación, elija **Escanear todos los recursos**. 

**Para iniciar un escaneo de recursos de tipos de recursos específicos (escaneo parcial)**

1. Abra la [página del generador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) de la consola de CloudFormation.

1. En la barra de navegación de la parte superior de la pantalla, elija la Región de AWS que contenga los recursos que desea escanear.

1. En el panel **Escaneos**, elija **Iniciar un nuevo escaneo** y, a continuación, elija **Escanear recursos específicos**. 

1. En el cuadro de diálogo **Iniciar escaneo parcial**, seleccione hasta 100 tipos de recursos y, a continuación, elija **Iniciar escaneo**. 

## Inicio de un escaneo de recursos (AWS CLI)
<a name="start-resource-scan-cli"></a>

**Para iniciar un escaneo de recursos de todos los tipos de recursos (escaneo completo)**  
Utilice el siguiente comando [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html). Sustituya *us-east-1* por la Región de AWS que contenga los recursos que desea escanear.

```
aws cloudformation start-resource-scan --region us-east-1
```

Si se ejecuta correctamente, este comando devolverá el ARN del escaneo. Tenga en cuenta el ARN de la propiedad `ResourceScanId`. Lo necesita para crear la plantilla.

```
{
    "ResourceScanId":
      "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60"
}
```

**Para iniciar un escaneo de recursos de tipos de recursos específicos (escaneo parcial)**

1. Use el comando [cat](https://en.wikipedia.org/wiki/Cat_(Unix)) para almacenar los tipos de recursos que desea escanear en un archivo JSON con el nombre `config.json` en el directorio principal. A continuación se muestra un ejemplo de configuración de escaneo que busca instancias de Amazon EC2, grupos de seguridad y todos los recursos de Amazon S3.

   ```
   $ cat > config.json
   [
     {
       "Types":[
         "AWS::EC2::Instance",
         "AWS::EC2::SecurityGroup",
         "AWS::S3::*"
       ]
     }
   ]
   ```

1. Utilice el comando [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html) con la opción `--scan-filters`, junto con el archivo `config.json` que creó, para iniciar el análisis parcial. Sustituya *us-east-1* por la Región de AWS que contenga los recursos que desea escanear.

   ```
   aws cloudformation start-resource-scan --scan-filters file://config.json --region us-east-1
   ```

   Si se ejecuta correctamente, este comando devolverá el ARN del escaneo. Tenga en cuenta el ARN de la propiedad `ResourceScanId`. Lo necesita para crear la plantilla.

   ```
   {
       "ResourceScanId":
         "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60"
   }
   ```

**Para monitorear el progreso de un análisis de recursos**  
Utilice el comando [describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html). Para la opción `--resource-scan-id`, reemplace el ARN de muestra por el ARN real.

```
aws cloudformation describe-resource-scan --region us-east-1 \
  --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60
```

Si se ejecuta correctamente, este comando proporciona información similar a la siguiente: 

```
{
    "ResourceScanId": "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60",
    "Status": "COMPLETE",
    "StartTime": "2023-08-21T03:10:38.485000+00:00",
    "EndTime": "2023-08-21T03:20:28.485000+00:00",
    "PercentageCompleted": 100.0,
    "ResourceTypes": [
        "AWS::CloudFront::CachePolicy",
        "AWS::CloudFront::OriginRequestPolicy",
        "AWS::EC2::DHCPOptions",
        "AWS::EC2::InternetGateway",
        "AWS::EC2::KeyPair",
        "AWS::EC2::NetworkAcl",
        "AWS::EC2::NetworkInsightsPath",
        "AWS::EC2::NetworkInterface",
        "AWS::EC2::PlacementGroup",
        "AWS::EC2::Route",
        "AWS::EC2::RouteTable",
        "AWS::EC2::SecurityGroup",
        "AWS::EC2::Subnet",
        "AWS::EC2::SubnetCidrBlock",
        "AWS::EC2::SubnetNetworkAclAssociation",
        "AWS::EC2::SubnetRouteTableAssociation",
        ...
    ],
    "ResourcesRead": 676
}
```

Así luce la salida generada por un escaneo parcial: 

```
{
    "ResourceScanId": "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60",
    "Status": "COMPLETE",
    "StartTime": "2025-03-06T18:24:19.542000+00:00",
    "EndTime": "2025-03-06T18:25:23.142000+00:00",
    "PercentageCompleted": 100.0,
    "ResourceTypes": [
        "AWS::EC2::Instance",
        "AWS::EC2::SecurityGroup",
        "AWS::S3::Bucket",
        "AWS::S3::BucketPolicy"
    ],
    "ResourcesRead": 65,
    "ScanFilters": [
        {
            "Types": [
                "AWS::EC2::Instance",
                "AWS::EC2::SecurityGroup",
                "AWS::S3::*"
            ]
        }
    ]
}
```

Para obtener una descripción de los campos de la salida, consulte [DescribeResourceScan](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeResourceScan.html) en la *Referencia de la API de AWS CloudFormation*.

# Ver el resumen de análisis en la consola de CloudFormation
<a name="generate-IaC-view-scan-summary"></a>

Una vez finalizado el análisis, puede ver una visualización de los recursos encontrados durante el análisis para ayudarse a identificar la concentración de recursos en los diferentes tipos de productos.

**Para ver la información de los recursos encontrados durante el análisis**

1. Abra la [página del generador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) de la consola de CloudFormation.

1. En la barra de navegación de la parte superior de la pantalla, elija la Región de AWS que contenga los recursos que desea escanear para ver.

1. Elija **Generador de IaC** en el panel de navegación.

1. En el **Desglose de recursos analizados**, encontrará un desglose visual de los recursos escaneados por tipo de producto, por ejemplo, **Computación** y **Almacenamiento**. 

1. Para personalizar la cantidad de tipos de productos que se muestran, seleccione **Filtrar los datos mostrados**. Esto ayuda a personalizar la visualización para centrarse en los tipos de productos que más le interesan.

1. En el lado derecho de la página está el panel **Setalles del resumen de análisis**. Para abrir el panel, seleccione el icono **abrir panel**.

![\[La consola del generador IaC proporciona un desglose visual de los recursos escaneados.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/IaC-generator-scan-summary.png)


# Creación de una plantilla de CloudFormation a partir de recursos escaneados con el generador de IaC
<a name="iac-generator-create-template-from-scanned-resources"></a>

En este tema se explica cómo crear una plantilla a partir de los recursos escaneados con la característica de generación de IaC. 

## Creación de una plantilla a partir de recursos escaneados (consola)
<a name="create-template-from-scanned-resources-console"></a>

**Creación de una plantilla de pila a partir de recursos escaneados**

1. Abra la [página del generador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) de la consola de CloudFormation.

1. En la barra de navegación de la parte superior de la pantalla, elija la Región de AWS que contenga los recursos escaneados.

1. En la sección **Plantillas**, elija **Crear plantilla**. 

1. Elija **Empezar desde una plantilla nueva**.

   1. En **Nombre de plantilla**, proporcione un nombre para la plantilla.

   1. (Opcional) Configure la **Política de eliminación** y **Actualice la política de reemplazo**.

   1. Seleccione **Siguiente** para añadir los recursos escaneados a la plantilla.

1. En **Agregar recursos analizados**, navegue por la lista de recursos escaneados y seleccione los recursos que desee agregar a la plantilla. Puede filtrar los recursos por identificador de recurso, tipo de recurso o etiquetas. Los filtros se incluyen entre sí.

1. Cuando haya agregado todos los recursos necesarios a la plantilla, elija **Siguiente** para salir de la página **Agregar recursos analizados** y pasar a la página **Agregar recursos relacionados**.

1. Revise una lista recomendada de recursos relacionados. Los recursos relacionados, como las instancias de Amazon EC2 y los grupos de seguridad, son interdependientes y, por lo general, pertenecen a la misma carga de trabajo. Seleccione los recursos relacionados que desee incluir en la plantilla de generada.
**nota**  
Le sugerimos que añada todos los recursos relacionados a esta plantilla.

1. Revise los detalles de la plantilla, los recursos escaneados y los recursos relacionados. 

1. Seleccione **Crear plantilla** para salir de la página **Revisar y crear** y crear la plantilla.

## Creación de una plantilla a partir de recursos escaneados (AWS CLI)
<a name="create-template-from-scanned-resources-cli"></a>

**Creación de una plantilla de pila a partir de recursos escaneados**

1. Para enumerar los recursos encontrados durante el escaneo, use el comando [list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html) y, si lo desea, especifique la opción `--resource-identifier` para limitar las salidas. Para la opción `--resource-scan-id`, reemplace el ARN de muestra por el ARN real.

   ```
   aws cloudformation list-resource-scan-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resource-identifier MyApp
   ```

   A continuación, se muestra una respuesta de ejemplo, en la que `ManagedByStack` indica si CloudFormation ya administra el recurso. Copie la salida. Lo necesita para el siguiente paso.

   ```
   {
       "Resources": [
           {
               "ResourceType": "AWS::EKS::Cluster",
               "ResourceIdentifier": {
                   "ClusterName": "MyAppClusterName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
               "ResourceIdentifier": {
                   "AutoScalingGroupName": "MyAppASGName"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   Para obtener una descripción de los campos de la salida, consulte [ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html) en la *Referencia de la API de AWS CloudFormation*.

1. Use el comando `cat` para almacenar los tipos de recursos y los identificadores en un archivo JSON con el nombre `resources.json` en su directorio principal. El siguiente es un JSON de ejemplo que se basa en la salida del ejemplo del paso anterior.

   ```
   $ cat > resources.json
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       }
   ]
   ```

1. Para enumerar los recursos encontrados durante el escaneo, use el comando [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html), junto con el archivo `resources.json` que creó.

   ```
   aws cloudformation list-resource-scan-related-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resources file://resources.json
   ```

   A continuación, se muestra una respuesta de ejemplo, en la que `ManagedByStack` indica si CloudFormation ya administra el recurso. Agregue estos recursos al archivo JSON que creó en el paso anterior. Lo necesitará para crear la plantilla.

   ```
   {
       "RelatedResources": [
           {
               "ResourceType": "AWS::EKS::Nodegroup",
               "ResourceIdentifier": {
                   "NodegroupName": "MyAppNodegroupName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::IAM::Role",
               "ResourceIdentifier": {
                   "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   Para obtener una descripción de los campos de la salida, consulte [ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html) en la *Referencia de la API de AWS CloudFormation*.
**nota**  
La lista de recursos de entrada no puede superar una longitud de 100. Para enumerar los recursos relacionados de más de 100 recursos, ejecute el comando **list-resource-scan-related-resources** en lotes de 100 y consolide los resultados.  
Tenga en cuenta que el resultado puede contener recursos duplicados en la lista.

1. Para crear una plantilla de pila nueva, use el comando [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html) como se muestra a continuación y con estas modificaciones:
   + Sustituya `us-east-1` por la Región de AWS que contenga los recursos escaneados.
   + Sustituya `MyTemplate` por el nombre de la plantilla a crear.

   ```
   aws cloudformation create-generated-template --region us-east-1 \
    --generated-template-name MyTemplate \
     --resources file://resources.json
   ```

   A continuación se muestra un ejemplo de un archivo `resources.json`.

   ```
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "LogicalResourceId":"MyCluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "LogicalResourceId":"MyASG",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       },
       {
           "ResourceType": "AWS::EKS::Nodegroup",
           "LogicalResourceId":"MyNodegroup",
           "ResourceIdentifier": {
               "NodegroupName": "MyAppNodegroupName"
           }
       },
       {
           "ResourceType": "AWS::IAM::Role",
           "LogicalResourceId":"MyRole",
           "ResourceIdentifier": {
               "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
           }
       }
   ]
   ```

   Si se ejecuta correctamente, este comando devuelve lo siguiente.

   ```
   {
     "Arn":
       "arn:aws:cloudformation:region:account-id:generatedtemplate/7fc8512c-d8cb-4e02-b266-d39c48344e48",
     "Name": "MyTemplate"
   }
   ```

# Creación de una pila de CloudFormation a partir de recursos escaneados
<a name="iac-generator-create-stack-from-scanned-resources"></a>

Después de crear la plantilla, puede obtener una vista previa de la plantilla generada con Infrastructure Composer antes de crear la pila e importar los recursos escaneados. Esto ayuda a visualizar la arquitectura completa de la aplicación con los recursos y sus relaciones. Para obtener más información acerca de Infrastructure Composer, consulte [Creación de plantillas visualmente con Infrastructure Composer](infrastructure-composer-for-cloudformation.md).

**Creación de la pila e importación de los recursos escaneados**

1. Abra la [página del generador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) de la consola de CloudFormation.

1. En la barra de navegación de la parte superior de la pantalla, elija la Región de AWS para la plantilla.

1. Seleccione la pestaña **Plantillas** y, a continuación, elija el nombre de la plantilla para ver más información.

1. En la pestaña **Definición de plantillas**, en la parte superior de la sección **Plantillas**, puede cambiar la plantilla de la sintaxis YAML a la JSON según stus preferencias. 

1. Revise los detalles de la plantilla para confirmar que todo está configurado correctamente. Para facilitar la revisión y la comprensión de la plantilla, puede cambiar de la vista de código predeterminada a una vista gráfica de la infraestructura descrita en la plantilla mediante Infrastructure Composer. Para ello, en **Plantilla**, elija **Lienzo** en lugar de **Plantilla**.

    **Acciones del lienzo** 
   + Para centrarse en los detalles de un recurso específico de su plantilla, haga doble clic en una tarjeta para que aparezca el panel **Propiedades del recurso**.
   + Para disponer y organizar visualmente las tarjetas en el lienzo, seleccione **Organizar** en la parte superior izquierda del lienzo. 
   + Para acercar y alejar el lienzo, usa los controles de zoom de la parte inferior derecha del lienzo. 

1. Para ver un recurso específico en la consola, seleccione la pestaña **Recursos de plantilla** y, a continuación, eliga el ID físico del recurso que desea consultar. Esto le lleva a la consola de ese recurso específico. También puede añadir, eliminar y resincronizar los recursos de la definición de plantilla desde la pestaña **Recursos de plantilla**. 

1. En la pestaña **Definición de plantilla**, el generador de IaC puede emitir advertencias sobre los recursos que contienen propiedades de solo escritura. Tras revisar las advertencias, puede descargar la plantilla generada y hacer los cambios necesarios. Para obtener más información, consulte [Resolución de propiedades de solo escritura](generate-IaC-write-only-properties.md).

1. Cuando esté satisfecho con la definición de la plantilla, en la plantilla **Definición de plantilla**, elija **Importar a la pila** y, a continuación, elija **Siguiente**.

1. En el panel **Especificar pila** de la página **Especificar los detalles de la pila**, ingrese el nombre de la pila y, a continuación, elija **Siguiente**.

1. Revise e introduzca los parámetros de la pila. Elija **Siguiente**.

1. Revise sus opciones en la página **Revisar cambios** y seleccione **Siguiente**.

1. Revise los detalles en la página **Revisar e importar** y seleccione **Importar recursos**. 

# Resolución de propiedades de solo escritura
<a name="generate-IaC-write-only-properties"></a>

Con el generador de IaC de CloudFormation, puede generar una plantilla con los recursos aprovisionados en su cuenta que CloudFormation aún no administra. Sin embargo, algunas propiedades de recursos se designan como de *solo escritura*, lo que significa que CloudFormation puede escribirlas, pero no leerlas; por ejemplo, una contraseña de base de datos. 

Al generar plantillas de CloudFormation a partir de los recursos existentes, las propiedades de solo escritura representan un desafío. En la mayoría de los casos, CloudFormation convierte estas propiedades en parámetros en la plantilla generada. Esto le permite introducir las propiedades como valores de parámetros durante las operaciones de importación. Sin embargo, hay situaciones en las que esta conversión no es posible y CloudFormation gestiona estos casos de forma diferente.

## Propiedades que se excluyen mutuamente
<a name="write-only-mutually-exclusive-properties"></a>

Algunos recursos tienen varios conjuntos de propiedades exclusivos y al menos algunos de estos son de solo escritura. El generador de IaC no puede determinar qué conjunto de propiedades exclusivas se aplicó al recurso durante la creación. Por ejemplo, puede proporcionar el código para [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) al utilizar uno de estos conjuntos de propiedades. 
+ `Code/S3Bucket`, `Code/S3Key`, y en forma opcional `Code/S3ObjectVersion`
+ `Code/ImageUri`
+ `Code/ZipFile`

Todas estas propiedades son de solo escritura. El generador de IaC selecciona uno de los conjuntos exclusivos de propiedades y lo añade a la plantilla generada. Se añaden parámetros para cada una de las propiedades de solo escritura. Los nombres de los parámetros incluyen `OneOf` y las descripciones de los parámetros indican que la propiedad correspondiente se puede reemplazar por otras propiedades exclusivas. El generador de IaC establece un tipo de advertencia de `MUTUALLY_EXCLUSIVE_PROPERTIES` para las propiedades incluidas.

## Tipos que se excluyen mutuamente
<a name="write-only-mutually-exclusive-types"></a>

En algunos casos, una propiedad de solo escritura puede ser de varios tipos de datos. Por ejemplo, la propiedad `Body` de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html) puede ser un `object` o una `string`. Cuando este es el caso, el generador de IaC incluye la propiedad en la plantilla generada mediante el tipo de `string` y establece un tipo de advertencia de `MUTUALLY_EXCLUSIVE_TYPES`.

## Propiedades de Array
<a name="write-only-array-properties"></a>

Si una propiedad de solo escritura tiene un tipo de `array`, el generador de IaC no puede incluirla en la plantilla generada porque los parámetros solo pueden ser valores escalares. En este caso, la propiedad se omite en la plantilla y se establece un tipo de advertencia de `UNSUPPORTED_PROPERTIES`.

## Propiedades opcionales
<a name="write-only-optional-properties"></a>

En el caso de las propiedades de solo escritura opcionales, el generador de IaC no puede detectar si la propiedad se utilizó al configurar el recurso. En este caso, la propiedad se omite de la plantilla generada y se establece un tipo de advertencia de `UNSUPPORTED_PROPERTIES`.

## Advertencias y próximos pasos
<a name="write-only-properties-warnings-and-next-steps"></a>

Para determinar qué propiedades son de solo escritura, debe observar las advertencias devueltas por la consola del generador de IaC. La [Referencia de tipos de recursos y propiedades de AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html) no indica si una propiedad es de solo escritura o si admite varios tipos.

Como alternativa, puede ver qué propiedades son de solo escritura desde los esquemas del proveedor de recursos. Para descargar los esquemas del proveedor de recursos, consulte los [Esquemas de proveedores de recursos de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html). 

**Resolución de problemas relacionados con las propiedades de solo**

1. Abra la [página del generador de IaC](https://console.aws.amazon.com/cloudformation/home?#iac-generator) de la consola de CloudFormation.

1. En la barra de navegación de la parte superior de la pantalla, elija la Región de AWS para la plantilla.

1. Seleccione la pestaña **Plantillas** y, a continuación, elija el nombre de la plantilla que creó.

1. En la pestaña **Definición de plantilla** cuando la plantilla generada incluye recursos con propiedades de solo escritura, la consola del generador de IaC muestra una advertencia con un resumen del tipo de problema. Por ejemplo:  
![\[La consola del generador de IaC advierte sobre las propiedades de solo escritura en la plantilla generada\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-warning.png)

1. Elija **Ver detalles de la advertencia** para conocer más detalles. Los recursos con propiedades de solo escritura se identifican mediante el ID lógico utilizado en la plantilla generada y en el tipo de recurso.

   Utilice la lista de advertencias para identificar los recursos con propiedades de solo escritura y observe cada recurso para determinar qué cambios (si los hay) deben realizarse en la plantilla generada.  
![\[La consola del generador de IaC detalla las advertencias sobre las propiedades de solo escritura en la plantilla generada\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-resource-warning.png)

1. Si la plantilla debe actualizarse para resolver problemas con las propiedades de solo escritura, haga lo siguiente: 

   1. Seleccione **Descargar** para descargar una copia de la plantilla.

   1. Edite la plantilla.

   1. Una vez finalizados los cambios, puede pulsar el botón **Importar plantilla editada** para continuar con el proceso de importación.

# Resolución de problemas relacionados con las propiedades de solo escritura en recursos de AWS::ApiGateway::RestAPI
<a name="generate-IaC-apigateway-restapi"></a>

En este tema se explica cómo resolver los problemas relacionados con las propiedades de solo escritura de los recursos de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html) cuando se utiliza el generador de IaC.

## Problema
<a name="apigateway-restapi-write-only-properties-issue"></a>

Cuando una plantilla generada contiene recursos `AWS::ApiGateway::RestApi`, se generan advertencias que indican que las propiedades de `Body`, `BodyS3Location` y `CloneFrom` se identifican como `UNSUPPORTED_PROPERTIES`. Esto se debe a que son propiedades de solo escritura opcionales. El generador de IaC no sabe si estas propiedades se aplicaron alguna vez al recurso. Por lo tanto, omite estas propiedades en la plantilla generada.

## Resolución
<a name="apigateway-restapi-write-only-properties-resolution"></a>

Para establecer la propiedad `Body` de la API de REST, actualice la plantilla generada.

1. Utilice la acción de la API de [https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html](https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html) de Amazon API Gateway para descargar la API. Por ejemplo, al utilizar el comando [https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html) de la AWS CLI. Para obtener más información, consulte [Exportar una API de REST desde API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html) en la *Guía para desarrolladores de API Gateway*.

1. Recupere la propiedad `Body` de la respuesta a la acción de la API de `GetExport`. Cárguela en un bucket de Amazon S3.

1. Descargue la plantilla generada.

1. Añada las propiedades de `BodyS3Location/Bucket` y `BodyS3Location/Key` a la plantilla y especifique el nombre y la clave del bucket donde se almacena `Body`.

1. Abra la plantilla generada en la consola del generador de IaC y seleccione **Importar plantilla editada**.

# Resolución de problemas relacionados con las propiedades de solo escritura en recursos de AWS::Lambda::Function
<a name="generate-IaC-lambda-function"></a>

En este tema se explica cómo resolver los problemas relacionados con las propiedades de solo escritura de los recursos de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) cuando se utiliza el generador de IaC.

## Problema
<a name="lambda-function-mutually-exclusive-properties-issue"></a>

El recurso de `AWS::Lambda::Function` tiene tres conjuntos de propiedades que se excluyen mutuamente para especificar el código de Lambda:
+ Propiedades `Code/S3Bucket` y `Code/S3Key` y, de manera opcional, la propiedad `Code/S3ObjectVersion`
+ Propiedad `Code/ImageUri`
+ Propiedad `Code/ZipFile`

Solo se puede usar uno de estos conjuntos para un recurso de `AWS::Lambda::Function` determinado.

El generador de IaC no puede determinar qué conjunto de propiedades exclusivas de solo escritura se utilizó para crear o actualizar el recurso. Como resultado, incluye solo el primer conjunto de propiedades de la plantilla generada. Se omiten las propiedades `Code/ImageUri` y `Code/ZipFile`. 

Además, el generador de IaC emite las siguientes advertencias:
+ **`MUTUALLY_EXCLUSIVE_PROPERTIES`**: advierte que `Code/S3Bucket` y `Code/S3Key` se identifican como propiedades que se excluyen mutuamente.
+ **`UNSUPPORTED_PROPERTIES`**: advierte que la propiedad `Code/S3ObjectVersion` no es compatible.

Para incluir recursos de `AWS::Lambda::Function` en una plantilla generada, debe descargar y actualizar la plantilla con las propiedades de código correctas.

## Resolución
<a name="lambda-function-mutually-exclusive-properties-resolution"></a>

**Si almacena el código Lambda en un bucket de Amazon S3 y no utiliza la propiedad `S3ObjectVersion`**, puede importar la plantilla generada sin ninguna modificación. El generador de IaC le pedirá el bucket de Amazon S3 y la clave como parámetros de plantilla durante la operación de importación.

****Si almacena el código Lambda como un repositorio de Amazon ECR**, puede actualizar la plantilla de acuerdo con las siguientes instrucciones:**

1. Descargue la plantilla generada.

1. Elimine las propiedades y los parámetros correspondientes de las propiedades de `Code/S3Bucket` y `Code/S3Key` de la plantilla generada.

1. Sustituya las propiedades eliminadas de la plantilla generada por la propiedad `Code/ImageUri` y especifique la URL del repositorio de Amazon ECR.

1. Abra la plantilla generada en la consola del generador de IaC y pulse el botón **Importar plantilla editada**.

****Si almacena el código Lambda en un archivo zip**, puede actualizar la plantilla de acuerdo con las siguientes instrucciones:**

1. Descargue la plantilla generada.

1. Elimine las propiedades y los parámetros correspondientes de las propiedades de `Code/S3Bucket` y `Code/S3Key` de la plantilla generada.

1. Sustituya las propiedades eliminadas de la plantilla generada por la propiedad `Code/ZipFile`.

1. Abra la plantilla generada en la consola del generador de IaC y pulse el botón **Importar plantilla editada**.

****Si no tiene una copia del código Lambda**, puede actualizar la plantilla según las siguientes instrucciones:**

1. Utilice la acción de la API de AWS Lambda [https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) (por ejemplo, mediante el comando [https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html) de la AWS CLI).

1. En la respuesta, el parámetro `RepositoryType` indica `S3` si el código está en un bucket de Amazon S3 o `ECR` si el código se encuentra en un repositorio de Amazon ECR.

1. En la respuesta, el parámetro `Location` contiene una URL prefirmada que puede usar para descargar el paquete de implementación durante 10 minutos. Descargue el código.

1. Cargue el archivo en un bucket de Amazon S3.

1. Ejecute una operación de importación con la plantilla generada y proporcione el nombre y la clave del bucket como valores de parámetro.

# Obtención de valores almacenados en otros servicios con referencias dinámicas
<a name="dynamic-references"></a>

Las referencias dinámicas ofrecen una forma cómoda de especificar valores externos almacenados y administrados en otros servicios y de separar la información confidencial de sus plantillas de infraestructura como código. CloudFormation recupera el valor de la referencia especificada cuando es necesario durante las operaciones de pila y de conjunto de cambios.

Con las referencias dinámicas, puede:
+ **Usar cadenas seguras**: en el caso de los datos confidenciales, use siempre parámetros de cadenas seguras en el Almacén de datos de AWS Systems Manager o secretos en AWS Secrets Manager para garantizar que sus datos estén cifrados en reposo.
+ **Limitar el acceso**: restrinja el acceso a los parámetros del Almacén de parámetros o a los secretos de Secrets Manager solo a las entidades principales y roles autorizados.
+ **Rotar las credenciales**: rote periódicamente los datos confidenciales almacenados en el Almacén de parámetros o Secrets Manager para mantener un alto nivel de seguridad.
+ **Automatizar la rotación**: aproveche la característica de rotación automática de Secrets Manager para actualizar y distribuir periódicamente sus datos confidenciales en sus aplicaciones y entornos.

## Consideraciones generales
<a name="dynamic-references-considerations"></a>

A continuación, se ofrecen consideraciones generales para que tenga en cuenta antes de especificar referencias dinámicas en sus plantillas de CloudFormation:
+ No incluya referencias dinámicas ni ningún dato confidencial en las propiedades de los recursos que formen parte del identificador principal de un recurso. CloudFormation puede usar el valor real de texto sin formato en el identificador del recurso principal, lo que podría suponer un riesgo para la seguridad. Este ID de recurso puede aparecer en cualquier destino o salida derivada.

  Para determinar qué propiedades de recursos comprenden el identificador principal de un tipo de recurso, consulte la documentación de referencia de recursos para ese recurso en [Referencia de tipos de recursos y propiedades de AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html). En la sección **Return values** (Valores de devolución), el valor de devolución de la función `Ref` representa las propiedades del recurso que comprenden el identificador principal del tipo de recurso.
+ Puede incluir hasta 60 referencias dinámicas en una plantilla de pila.
+ Si utiliza transformaciones (como `AWS::Include` o `AWS::Serverless`), CloudFormation no resuelve las referencias dinámicas antes de aplicar la transformación. En su lugar, pasa la cadena literal de la referencia dinámica a la transformación y resuelve las referencias al ejecutar el conjunto de cambios usando la plantilla.
+ No se pueden utilizar referencias dinámicas para valores protegidos (como los almacenados en el Almacén de parámetros o Secrets Manager) en recursos personalizados. 
+ Las referencias dinámicas tampoco se admiten en los metadatos de `AWS::CloudFormation::Init` ni en las propiedades de `UserData` de Amazon EC2.
+ No cree una referencia dinámica que termine con una barra invertida (\$1). CloudFormation no puede resolver estas referencias, lo que provocará un error en las operaciones de apilado.

Los siguientes temas brindan información y otras consideraciones sobre el uso de referencias dinámicas.

**Topics**
+ [Consideraciones generales](#dynamic-references-considerations)
+ [Obtención de un valor de texto sin formato del Almacén de parámetros de Systems Manager](dynamic-references-ssm.md)
+ [Obtención de un valor de cadena segura del Almacén de parámetros de Systems Manager](dynamic-references-ssm-secure-strings.md)
+ [Obtención de un secreto o un valor secreto de Secrets Manager](dynamic-references-secretsmanager.md)

# Obtención de un valor de texto sin formato del Almacén de parámetros de Systems Manager
<a name="dynamic-references-ssm"></a>

Al crear una plantilla de CloudFormation, es posible que desee utilizar valores de texto sin formato almacenados en el Almacén de parámetros. Parameter Store es una función de AWS Systems Manager. Para obtener una introducción al Almacén de parámetros, consulte [Almacén de parámetros de AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) en la *Guía del usuario de AWS Systems Manager*. 

Para utilizar un valor de texto sin formato del Almacén de parámetros en la plantilla, debe usar una referencia dinámica `ssm`. Esta referencia permite acceder a valores de parámetros de tipo `String` o `StringList` del Almacén de parámetros. 

Para verificar qué versión de una referencia dinámica `ssm` se utilizará en una operación de pila, cree un conjunto de cambios para la operación de pila. A continuación, revise la plantilla procesada en la pestaña **Plantilla**. Para obtener más información, consulte [Creación de un conjunto de cambios para una pila de CloudFormation](using-cfn-updating-stacks-changesets-create.md).

Al utilizar referencias dinámicas `ssm`, debe tener en cuenta varios aspectos:
+ CloudFormation no es compatible con la detección de desviaciones en referencias dinámicas. Para las referencias dinámicas de `ssm` en las que no se ha especificado la versión del parámetro, se recomienda que, si actualiza la versión del parámetro en Systems Manager, también lleve a cabo una operación de actualización de la pila en cualquier pila que incluya la referencia dinámica de `ssm`, con el fin de obtener la versión más reciente del parámetro.
+ Para usar una referencia dinámica `ssm` en la sección `Parameters` de la plantilla de CloudFormation, debe incluir un número de versión. CloudFormation no permite referenciar un valor del Almacén de parámetros sin un número de versión en esta sección. Como alternativa, puede definir el parámetro como un tipo de parámetro de Systems Manager en la plantilla. Al hacerlo, puede especificar una clave de parámetro de Systems Manager como valor predeterminado. A continuación, CloudFormation obtendrá la última versión del valor del parámetro del Almacén de parámetros, sin que tenga que especificar un número de versión. Esto puede hacer que sus plantillas sean más sencillas y fáciles de mantener. Para obtener más información, consulte [Definición de recursos existentes en tiempo de ejecución con tipos de parámetros proporcionados por CloudFormation](cloudformation-supplied-parameter-types.md).
+ En el caso de recursos personalizados, CloudFormation resuelve las referencias dinámicas `ssm` antes de enviar la solicitud al recurso personalizado.
+ CloudFormation no admite el uso de referencias dinámicas para hacer referencia a un parámetro compartido desde otra Cuenta de AWS.
+ CloudFormation no admite el uso de etiquetas de parámetros de Systems Manager en las referencias dinámicas.

## Permisos
<a name="dynamic-references-ssm-permissions"></a>

Para especificar un parámetro guardado en el Almacén de parámetros de Systems Manager, debe tener permiso para llamar a [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html) para el parámetro especificado. Para obtener información sobre cómo crear políticas de IAM que proporcionen acceso a parámetros específicos de Systems Manager, consulte [Restricción del acceso a los parámetros de Systems Manager mediante políticas de IAM](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-access.html) en la *Guía del usuario de AWS Systems Manager*.

## Patrón de referencia
<a name="dynamic-references-ssm-pattern"></a>

Para referenciar un valor de texto sin formato guardado en el Almacén de parámetros de Systems Manager en una plantilla de CloudFormation, utilice el siguiente patrón de referencia `ssm`.

```
{{resolve:ssm:parameter-name:version}}
```

Su referencia debe cumplir el siguiente patrón de expresión regular para nombre-parámetro y versión:

```
{{resolve:ssm:[a-zA-Z0-9_.\-/]+(:\d+)?}}
```

`parameter-name`  
El nombre del parámetro en el almacén de parámetros de . El nombre de parámetro distingue entre mayúsculas y minúsculas.  
Obligatorio.

`version`  
Un número entero que especifica la versión del parámetro que se va a utilizar. Si no especifica la versión exacta, CloudFormation utiliza la última versión del parámetro cada vez que cree o actualice la pila. Para obtener más información, consulte [Trabajo con versiones de parámetros](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html) en la *Guía del usuario de AWS Systems Manager*.  
Opcional.

## Ejemplos
<a name="dynamic-references-ssm-examples"></a>

**Topics**
+ [Parámetro de ID de AMI públicas](#dynamic-references-ssm-public-ami-example)
+ [Parámetro de ID de AMI personalizado](#dynamic-references-ssm-custom-ami-example)

### Parámetro de ID de AMI públicas
<a name="dynamic-references-ssm-public-ami-example"></a>

En el siguiente ejemplo, se crea una instancia de EC2 que refiere a un parámetro de AMI público. La referencia dinámica recupera el ID de AMI de Amazon Linux 2023 del parámetro público. Para obtener más información acerca de parámetros públicos, consulte [Descubrir parámetros públicos en el Almacén de parámetros](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) en la *Guía del usuario de AWS Systems Manager*.

#### JSON
<a name="dynamic-references-ssm-public-ami-example.json"></a>

```
{
    "Resources": {
        "MyInstance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
                "InstanceType": "t2.micro"
            }
        }
    }
}
```

#### YAML
<a name="dynamic-references-ssm-public-ami-example.yaml"></a>

```
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      InstanceType: t2.micro
```

### Parámetro de ID de AMI personalizado
<a name="dynamic-references-ssm-custom-ami-example"></a>

En el siguiente ejemplo, se crea una plantilla de lanzamiento de EC2 que refiere a un ID de AMI personalizado almacenado en el Almacén de parámetros. La referencia dinámica recupera el ID de AMI de la versión *`2`* del parámetro `golden-ami` en el momento en que se lanza una instancia desde la plantilla de lanzamiento.

#### JSON
<a name="dynamic-references-ssm-custom-ami-example.json"></a>

```
{
    "Resources": {
        "MyLaunchTemplate": {
            "Type": "AWS::EC2::LaunchTemplate",
            "Properties": {
                "LaunchTemplateName": {
                    "Fn::Sub": "${AWS::StackName}-launch-template"
                },
                "LaunchTemplateData": {
                    "ImageId": "{{resolve:ssm:golden-ami:2}}",
                    "InstanceType": "t2.micro"
                }
            }
        }
    }
}
```

#### YAML
<a name="dynamic-references-ssm-custom-ami-example.yaml"></a>

```
Resources:
  MyLaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: '{{resolve:ssm:golden-ami:2}}'
        InstanceType: t2.micro
```

# Obtención de un valor de cadena segura del Almacén de parámetros de Systems Manager
<a name="dynamic-references-ssm-secure-strings"></a>

En CloudFormation, puede usar datos confidenciales, como contraseñas o claves de licencia, sin exponerlos directamente en sus plantillas al almacenar los datos confidenciales como una “cadena segura” en el Almacén de parámetros de AWS Systems Manager. Para obtener una introducción al Almacén de parámetros, consulte [Almacén de parámetros de AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) en la *Guía del usuario de AWS Systems Manager*.

Para utilizar una cadena segura del Almacén de parámetros en la plantilla, debe usar una referencia dinámica `ssm-secure`. CloudFormation no almacena nunca el valor real de cadena segura. En su lugar, solo almacena la referencia dinámica literal, que contiene el nombre de parámetro en texto sin formato de la cadena segura. 

Durante la creación o las actualizaciones de la pila, CloudFormation accede al valor de cadena segura según sea necesario, sin exponer el valor real. Las cadenas seguras solo se pueden usar para las propiedades de recursos que admiten el patrón de referencia dinámica `ssm-secure`. Para obtener más información, consulte [Recursos que admiten patrones de parámetros dinámicos para SecureStrings o cadenas seguras](#template-parameters-dynamic-patterns-resources).

CloudFormation no devuelve el valor del parámetro real para las cadenas seguras en ninguna llamada a la API. Solo devuelve la referencia dinámica literal. Al comparar los cambios con el conjunto de cambios, CloudFormation solo compara la cadena de referencia dinámica literal. No resuelve ni compara los valores reales de la cadena segura.

Al utilizar referencias dinámicas `ssm-secure`, debe tener en cuenta varios aspectos:
+ CloudFormation no puede acceder a los valores del Almacén de parámetros desde otras Cuentas de AWS.
+ CloudFormation no es compatible con el uso de etiquetas de parámetros de Systems Manager o parámetros públicos en las referencias dinámicas.
+ En las regiones `cn-north-1` y `cn-northwest-1`, las cadenas seguras no son compatibles con Systems Manager.
+ Las referencias dinámicas de valores seguros, como, por ejemplo, `ssm-secure`, no son compatibles actualmente con los recursos personalizados.
+ Si CloudFormation necesita reversionar la actualización de la pila, y la versión especificada anteriormente de un parámetro de cadena segura ya no está disponible, se producirá un error en dicha operación de reversión. En esos casos, existen dos opciones:
  + Use `CONTINUE_UPDATE_ROLLBACK` para omitir el recurso.
  + Vuelva a crear el parámetro SecureString o de cadena segura en el almacén de parámetros de Administrador de sistemas y actualícelo hasta que la versión del parámetro llegue a la versión que se utiliza en la plantilla. Luego use `CONTINUE_UPDATE_ROLLBACK` sin omitir el recurso.

## Recursos que admiten patrones de parámetros dinámicos para SecureStrings o cadenas seguras
<a name="template-parameters-dynamic-patterns-resources"></a>

Los recursos compatibles con el patrón de referencia dinámica `ssm-secure` son:


| Recurso | Tipo de propiedad | Propiedades | 
| --- | --- | --- | 
| [AWS::DirectoryService::MicrosoftAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html) |  | `Password` | 
| [AWS::DirectoryService::SimpleAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-simplead.html) |  | `Password` | 
| [AWS::ElastiCache::ReplicationGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticache-replicationgroup.html) |  | `AuthToken` | 
| [AWS::IAM::User](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) | [LoginProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html) | `Password` | 
| [AWS::KinesisFirehose::DeliveryStream](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-kinesisfirehose-deliverystream.html) | [RedshiftDestinationConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html) | `Password` | 
| [AWS::OpsWorks::App](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-app.html) | [Origen](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-app-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [CustomCookbooksSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [RdsDbInstances](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-rdsdbinstance.html) | `DbPassword` | 
| [AWS::RDS::DBCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html) |  | `MasterUserPassword` | 
| [AWS::RDS::DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) |  | `MasterUserPassword`  | 
| [AWS::Redshift::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html) |  | `MasterUserPassword` | 

## Patrón de referencia
<a name="dynamic-references-ssm-secure-pattern"></a>

Para referenciar un valor de cadena segura del Almacén de parámetros de Systems Manager en una plantilla de CloudFormation, utilice el siguiente patrón de referencia `ssm-secure`.

```
{{resolve:ssm-secure:parameter-name:version}}
```

Su referencia debe cumplir el siguiente patrón de expresión regular para nombre-parámetro y versión:

```
{{resolve:ssm-secure:[a-zA-Z0-9_.\-/]+(:\d+)?}}
```

`parameter-name`  
El nombre del parámetro en el almacén de parámetros de . El nombre de parámetro distingue entre mayúsculas y minúsculas.  
Obligatorio.

`version`  
Un número entero que especifica la versión del parámetro que se va a utilizar. Si no especifica la versión exacta, CloudFormation utiliza la última versión del parámetro cada vez que cree o actualice la pila. Para obtener más información, consulte [Trabajo con versiones de parámetros](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html) en la *Guía del usuario de AWS Systems Manager*.  
Opcional.

## Ejemplo
<a name="dynamic-references-ssm-secure-example"></a>

En el siguiente ejemplo, se utiliza una referencia dinámica `ssm-secure` para establecer la contraseña de un usuario de IAM para una cadena segura almacenada en el Almacén de parámetros. Tal y como se especifica, CloudFormation usará la versión *`10`* del parámetro `IAMUserPassword` para las operaciones de pila y de conjunto de cambios.

### JSON
<a name="dynamic-references-ssm-secure-example.json"></a>

```
  "MyIAMUser": {
    "Type": "AWS::IAM::User",
    "Properties": {
      "UserName": "MyUserName",
      "LoginProfile": {
        "Password": "{{resolve:ssm-secure:IAMUserPassword:10}}"
      }
    }
  }
```

### YAML
<a name="dynamic-references-ssm-secure-example.yaml"></a>

```
  MyIAMUser:
    Type: AWS::IAM::User
    Properties:
      UserName: 'MyUserName'
      LoginProfile:
        Password: '{{resolve:ssm-secure:IAMUserPassword:10}}'
```

# Obtención de un secreto o un valor secreto de Secrets Manager
<a name="dynamic-references-secretsmanager"></a>

Secrets Manager es un servicio que permite almacenar y administrar de forma segura un secreto, como credenciales de base de datos, contraseñas y claves de API de terceros. Con Secrets Manager, puede almacenar y controlar el acceso a estos secretos de forma centralizada, de modo que pueda reemplazar las credenciales codificadas en su código (incluidas las contraseñas), con una llamada API a Secrets Manager para recuperar el secreto mediante programación. Para obtener más información, consulte [¿Qué es AWS Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) en la *Guía del usuario de AWS Secrets Manager*.

Para utilizar secretos completos o valores secretos que están almacenados en Secrets Manager en las plantillas de CloudFormation, debe utilizar referencias dinámicas `secretsmanager`.

## Prácticas recomendadas
<a name="dynamic-references-secretsmanager-best-practices"></a>

Siga estas prácticas recomendadas cuando use las referencias dinámicas de Secrets Manager en las plantillas de CloudFormation:
+ **Utilice referencias sin versión para sus plantillas de CloudFormation**: almacene las credenciales en Secrets Manager y utilice referencias dinámicas sin los parámetros `version-stage` o `version-id` para respaldar los flujos de trabajo de rotación de secretos adecuados.
+ **Aproveche la rotación automática**: utilice la característica de rotación automática de Secrets Manager con referencias dinámicas sin versiones para la administración de credenciales. Esto garantiza que sus credenciales se actualicen periódicamente sin necesidad de cambiar la plantilla. Para obtener más información, consulte [Rotar secretos de AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html).
+ **Utilice las referencias versionadas con moderación**: especifique únicamente parámetros `version-stage` o `version-id` explícitos para situaciones específicas, como situaciones de prueba o reversión.

## Consideraciones
<a name="dynamic-references-secretsmanager-considerations"></a>

Al utilizar referencias dinámicas de `secretsmanager`, hay algunas consideraciones importantes que se deben tener en cuenta:
+ CloudFormation no rastrea qué versión de un secreto se usó en implementaciones anteriores. Planifique cuidadosamente su estrategia de administración de secretos antes de implementar referencias dinámicas. Use referencias sin versión siempre que sea posible para aprovechar la rotación automática de secretos. Supervise y valide las actualizaciones de los recursos al realizar cambios en las configuraciones de las referencias dinámicas, por ejemplo, al pasar de referencias dinámicas no versionadas a referencias dinámicas versionadas, y viceversa.
+ Cuando se actualiza únicamente el valor secreto en Secrets Manager, CloudFormation recupera automáticamente el nuevo valor. CloudFormation recupera el valor secreto solo durante la creación del recurso o las actualizaciones que modifican el recurso que contiene la referencia dinámica. 

  Por ejemplo, supongamos que la plantilla incluye un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)en el que la propiedad `MasterPassword` está configurada como una referencia dinámica de Secrets Manager. Tras crear una pila a partir de esta plantilla, se actualiza el valor del secreto en Secrets Manager. Sin embargo, la propiedad `MasterPassword` conserva el valor de la contraseña anterior. 

  Para aplicar el nuevo valor secreto, tendrá que modificar el recurso `AWS::RDS::DBInstance` en la plantilla de CloudFormation y realizar una actualización de la pila. 

  Considere la posibilidad de utilizar Secrets Manager para que cambie automáticamente el secreto. 
+ Las referencias dinámicas de valores seguros, como, por ejemplo, `secretsmanager`, no son compatibles actualmente con los recursos personalizados.
+ La referencia dinámica `secretsmanager` se pueden utilizar en todas las propiedades de recursos. El uso de la referencia dinámica `secretsmanager` indica que ni Secrets Manager ni CloudFormation registren o mantengan valores de secretos resueltos. Sin embargo, el valor del secreto puede mostrarse en el servicio donde se está usando el recurso. Debe revisar el uso para evitar fugas de datos secretos.

## Permisos
<a name="dynamic-references-secretsmanager-permissions"></a>

Para especificar un secreto almacenado en Secrets Manager, debe tener permiso para llamar a [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) para el secreto.

## Patrón de referencia
<a name="dynamic-references-secretsmanager-pattern"></a>

Para referenciar secretos de Secrets Manager en una plantilla de CloudFormation, utilice el siguiente patrón de referencia `secretsmanager`.

```
{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
```

`secret-id`  
El nombre o el ARN del secreto.  
Para obtener acceso a un secreto de su Cuenta de AWS, solo debe especificar el nombre del secreto. Para obtener acceso a un secreto de otra Cuenta de AWS, especifique el ARN completo del secreto.  
Obligatorio.

`secret-string`  
El único valor admitido es `SecretString`. El valor predeterminado es `SecretString`.

`json-key`  
El nombre de la clave del par clave-valor cuyo valor desea recuperar. Si no se especifica una `json-key`, CloudFormation recupera todo el texto secreto.  
Este segmento no puede incluir el signo de dos puntos ( `:`).

`version-stage`  
La etiqueta de fase de la versión del secreto que se usará. Secrets Manager utiliza etiquetas provisionales para realizar un seguimiento de las diferentes versiones durante el proceso de rotación. Si usa `version-stage`, no especifique `version-id`. Si no especifica `version-stage` ni `version-id`, la versión predeterminada es la `AWSCURRENT`.  
Este segmento no puede incluir el signo de dos puntos ( `:`).

`version-id`  
El identificador único de la versión del secreto a utilizar. Si especifica `version-id`, no especifique `version-stage`. Si no especifica `version-stage` ni `version-id`, la versión predeterminada es la `AWSCURRENT`.  
Este segmento no puede incluir el signo de dos puntos ( `:`).

## Ejemplos
<a name="dynamic-references-secretsmanager-examples"></a>

**Topics**
+ [Recuperación de valores de nombre de usuario y contraseña de un secreto](#dynamic-references-secretsmanager-examples-user-name-and-password)
+ [Recuperación de la totalidad de SecretString](#dynamic-references-secretsmanager-examples-entire-secretstring)
+ [Recuperación de un valor de una versión específica de un secreto](#dynamic-references-secretsmanager-examples-specific-version)
+ [Recuperación de secretos de otra Cuenta de AWS](#dynamic-references-secretsmanager-examples-secrets-from-another-account)

### Recuperación de valores de nombre de usuario y contraseña de un secreto
<a name="dynamic-references-secretsmanager-examples-user-name-and-password"></a>

El siguiente ejemplo de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) recupera los valores de nombre de usuario y contraseña almacenados en el secreto `MySecret`. En este ejemplo se muestra el patrón recomendado para las referencias dinámicas sin versión, que utiliza automáticamente la versión `AWSCURRENT` y admite los flujos de trabajo de rotación de Secrets Manager sin necesidad de cambiar la plantilla.

#### JSON
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.json"></a>

```
{
    "MyRDSInstance": {
        "Type": "AWS::RDS::DBInstance",
        "Properties": {
            "DBName": "MyRDSInstance",
            "AllocatedStorage": "20",
            "DBInstanceClass": "db.t2.micro",
            "Engine": "mysql",
            "MasterUsername": "{{resolve:secretsmanager:MySecret:SecretString:username}}",
            "MasterUserPassword": "{{resolve:secretsmanager:MySecret:SecretString:password}}"
        }
    }
}
```

#### YAML
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.yaml"></a>

```
  MyRDSInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MyRDSInstance
      AllocatedStorage: '20'
      DBInstanceClass: db.t2.micro
      Engine: mysql
      MasterUsername: '{{resolve:secretsmanager:MySecret:SecretString:username}}'
      MasterUserPassword: '{{resolve:secretsmanager:MySecret:SecretString:password}}'
```

### Recuperación de la totalidad de SecretString
<a name="dynamic-references-secretsmanager-examples-entire-secretstring"></a>

La siguiente referencia dinámica recupera el valor de `SecretString` para `MySecret`.

```
{{resolve:secretsmanager:MySecret}}
```

Otra opción:

```
{{resolve:secretsmanager:MySecret::::}}
```

### Recuperación de un valor de una versión específica de un secreto
<a name="dynamic-references-secretsmanager-examples-specific-version"></a>

La siguiente referencia dinámica recupera el valor de `password` para la versión `AWSPREVIOUS` de `MySecret`.

```
{{resolve:secretsmanager:MySecret:SecretString:password:AWSPREVIOUS}}
```

### Recuperación de secretos de otra Cuenta de AWS
<a name="dynamic-references-secretsmanager-examples-secrets-from-another-account"></a>

La siguiente referencia dinámica recupera el valor de `SecretString` para `MySecret` que hay en otra Cuenta de AWS. Debe especificar el ARN del secreto completo para obtener acceso a otra Cuenta de AWS.

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}
```

La siguiente referencia dinámica recupera el valor de `password` para `MySecret` que hay en otra Cuenta de AWS. Debe especificar el ARN del secreto completo para obtener acceso a otra Cuenta de AWS.

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}
```

# Obtención de valores de AWS mediante pseudoparámetros
<a name="pseudo-parameter-reference"></a>

Los seudoparámetros son variables integradas que proporcionan acceso a información importante del entorno de AWS, como los ID de las cuentas, los nombres de las regiones y los detalles de las pilas, que pueden cambiar de una implementación a otra o de un entorno a otro.

Puede usar seudoparámetros en lugar de valores codificados de forma rígida para que sus plantillas sean más portátiles y fáciles de reutilizar en diferentes regiones y Cuentas de AWS.

## Sintaxis
<a name="pseudo-parameter-syntax"></a>

Puede hacer referencia a los seudoparámetros mediante la función intrínseca `Ref` o la función intrínseca `Fn::Sub`. 

### Ref.
<a name="pseudo-parameter-ref-syntax"></a>

La función intrínseca `Ref` utiliza la siguiente sintaxis general. Para obtener más información, consulte [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html).

#### JSON
<a name="pseudo-parameter-ref-syntax.json"></a>

```
{ "Ref" : "AWS::PseudoParameter" }
```

#### YAML
<a name="pseudo-parameter-ref-syntax.yaml"></a>

```
!Ref AWS::PseudoParameter
```

### Fn::Sub
<a name="pseudo-parameter-sub-syntax"></a>

La función intrínseca `Fn::Sub` utiliza un formato diferente que incluye la sintaxis `${}` alrededor del seudoparámetro. Para obtener más información, consulte [Fn::Sub](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html).

#### JSON
<a name="pseudo-parameter-sub-syntax.json"></a>

```
{ "Fn::Sub" : "${AWS::PseudoParameter}" }
```

#### YAML
<a name="pseudo-parameter-sub-syntax.yaml"></a>

```
!Sub '${AWS::PseudoParameter}'
```

## Pseudoparámetros disponibles
<a name="available-pseudo-parameters"></a>

### `AWS::AccountId`
<a name="cfn-pseudo-param-accountid"></a>

Devuelve el ID de Cuenta de AWS de la cuenta en la que se está creando la pila como, por ejemplo `123456789012`.

Este seudoparámetro se suele utilizar al definir los roles de IAM, las políticas y otras políticas de recursos que implican ARN específicos de la cuenta.

### `AWS::NotificationARNs`
<a name="cfn-pseudo-param-notificationarns"></a>

Devuelve la lista de Nombres de recursos de Amazon (ARN) de los temas de Amazon SNS que reciben notificaciones de eventos de pilas. Puede especificar estos ARN mediante la opción `--notification-arns` en la AWS CLI o a través de la consola mientras crea o actualiza la pila.

A diferencia de otros seudoparámetros que devuelven un único valor, `AWS::NotificationARNs` devuelve una lista de ARN. Para acceder a un ARN específico de la lista, utilice la función intrínseca `Fn::Select`. Para obtener más información, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-select.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-select.html).

### `AWS::NoValue`
<a name="cfn-pseudo-param-novalue"></a>

Elimina la propiedad de recurso correspondiente cuando se especifica como valor devuelto en la función intrínseca `Fn::If`. Para obtener más información, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if).

Este seudoparámetro es particularmente útil para crear propiedades de recursos condicionales que solo deberían incluirse en determinadas condiciones.

### `AWS::Partition`
<a name="cfn-pseudo-param-partition"></a>

Devuelve la partición en la que se encuentra el recurso. Para las Regiones de AWS estándar, la partición es `aws`. Para recursos en otras particiones, la partición es `aws-`*partitionname*. Por ejemplo, la partición de los recursos de la región China (Pekín y Ningxia) es `aws-cn` y la partición de los recursos en la región AWS GovCloud (Oeste de EE. UU.) es `aws-us-gov`.

La partición forma parte del ARN de los recursos. El uso de `AWS::Partition` garantiza que las plantillas funcionen correctamente en diferentes particiones de AWS.

### `AWS::Region`
<a name="cfn-pseudo-param-region"></a>

Devuelve una cadena que representa la región en la que se crea el recurso que abarca, como por ejemplo `us-west-2`.

Este es uno de los seudoparámetros más utilizados, ya que permite que las plantillas se adapten a diferentes Regiones de AWS sin modificaciones.

### `AWS::StackId`
<a name="cfn-pseudo-param-stackid"></a>

Devuelve el ID (ARN) de la pila, como `arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123`.

### `AWS::StackName`
<a name="cfn-pseudo-param-stackname"></a>

Devuelve el nombre de la pila, como `teststack`.

El nombre de la pila se suele utilizar para crear nombres de recursos únicos que se puedan identificar fácilmente como pertenecientes a una pila específica.

### `AWS::URLSuffix`
<a name="cfn-pseudo-param-urlsuffix"></a>

Devuelve el sufijo del dominio AWS en la Región de AWS donde se implementa la pila. El sufijo normalmente es `amazonaws.com`, pero para la región China (Pekín), el sufijo es `amazonaws.com.cn`.

Este parámetro resulta especialmente útil a la hora de crear direcciones URL para los puntos de conexión de servicios de AWS.

## Ejemplos
<a name="pseudo-parameter-examples"></a>

**Topics**
+ [Uso básico](#pseudo-parameter-basic-example)
+ [Uso de AWS::NotificationARNs](#pseudo-parameter-notification-example)
+ [Propiedades condicionales con AWS::NoValue](#pseudo-parameter-novalue-example)

### Uso básico
<a name="pseudo-parameter-basic-example"></a>

En los siguientes ejemplos se crean dos recursos: un tema de Amazon SNS y una alarma de CloudWatch que envía notificaciones a ese tema. Se utiliza `AWS::StackName`, `AWS::Region` y `AWS::AccountId` para insertar dinámicamente el nombre de la pila, la Región de AWS actual y el ID de la cuenta en los nombres, las descripciones y los ARN de los recursos.

#### JSON
<a name="pseudo-parameter-basic-example.json"></a>

```
{
    "Resources": {
        "MyNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "DisplayName": { "Fn::Sub": "Notifications for ${AWS::StackName}" }
            }
        },
        "CPUAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": { "Fn::Sub": "Alarm for high CPU in ${AWS::Region}" },
                "AlarmName": { "Fn::Sub": "${AWS::StackName}-HighCPUAlarm" },
                "MetricName": "CPUUtilization",
                "Namespace": "AWS/EC2",
                "Statistic": "Average",
                "Period": 300,
                "EvaluationPeriods": 1,
                "Threshold": 80,
                "ComparisonOperator": "GreaterThanThreshold",
                "AlarmActions": [{ "Fn::Sub": "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}" }]
            }
        }
    }
}
```

#### YAML
<a name="pseudo-parameter-basic-example.yaml"></a>

```
Resources:
  MyNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: !Sub Notifications for ${AWS::StackName}
  CPUAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: !Sub Alarm for high CPU in ${AWS::Region}
      AlarmName: !Sub ${AWS::StackName}-HighCPUAlarm
      MetricName: CPUUtilization
      Namespace: AWS/EC2
      Statistic: Average
      Period: 300
      EvaluationPeriods: 1
      Threshold: 80
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}
```

### Uso de AWS::NotificationARNs
<a name="pseudo-parameter-notification-example"></a>

En los siguientes ejemplos se configura un grupo de escalado automático para enviar notificaciones de eventos de lanzamiento de instancias y errores de lanzamiento. La configuración usa el seudoparámetro `AWS::NotificationARNs`, que proporciona una lista de los ARN de los temas de Amazon SNS que se especificaron al crear la pila. La función `Fn::Select` elige el primer ARN de esa lista.

#### JSON
<a name="pseudo-parameter-notification-example.json"></a>

```
"myASG": {
   "Type": "AWS::AutoScaling::AutoScalingGroup",
   "Properties": {
      "LaunchTemplate": {
         "LaunchTemplateId": { "Ref": "myLaunchTemplate" },
         "Version": { "Fn::GetAtt": [ "myLaunchTemplate", "LatestVersionNumber" ] }
       },
       "MaxSize": "1",
       "MinSize": "1",
       "VPCZoneIdentifier": [
          "subnetIdAz1",
          "subnetIdAz2",
          "subnetIdAz3"
      ],
      "NotificationConfigurations" : [{
         "TopicARN" : { "Fn::Select" : [ "0", { "Ref" : "AWS::NotificationARNs" } ] },
         "NotificationTypes" : [ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR" ]
      }]
   }
}
```

#### YAML
<a name="pseudo-parameter-notification-example.yaml"></a>

```
myASG:
  Type: AWS::AutoScaling::AutoScalingGroup
  Properties:
    LaunchTemplate:
      LaunchTemplateId: !Ref myLaunchTemplate
      Version: !GetAtt myLaunchTemplate.LatestVersionNumber
    MinSize: '1'
    MaxSize: '1'
    VPCZoneIdentifier:
      - subnetIdAz1
      - subnetIdAz2
      - subnetIdAz3
    NotificationConfigurations:
      - TopicARN:
          Fn::Select:
          - '0'
          - Ref: AWS::NotificationARNs
        NotificationTypes:
        - autoscaling:EC2_INSTANCE_LAUNCH
        - autoscaling:EC2_INSTANCE_LAUNCH_ERROR
```

### Propiedades condicionales con AWS::NoValue
<a name="pseudo-parameter-novalue-example"></a>

En el siguiente ejemplo se crea una instancia de base de datos de Amazon RDS que utiliza una instantánea 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`. 

#### JSON
<a name="pseudo-parameter-novalue-example.json"></a>

```
"MyDB" : {
  "Type" : "AWS::RDS::DBInstance",
  "Properties" : {
    "AllocatedStorage" : "5",
    "DBInstanceClass" : "db.t2.small",
    "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="pseudo-parameter-novalue-example.yaml"></a>

```
MyDB:
  Type: AWS::RDS::DBInstance
  Properties:
    AllocatedStorage: '5'
    DBInstanceClass: db.t2.small
    Engine: MySQL
    EngineVersion: '5.5'
    MasterUsername:
      Ref: DBUser
    MasterUserPassword:
      Ref: DBPassword
    DBParameterGroupName:
      Ref: MyRDSParamGroup
    DBSnapshotIdentifier:
      Fn::If:
        - UseDBSnapshot
        - Ref: DBSnapshotName
        - Ref: AWS::NoValue
```

# Obtención de salidas exportadas de una pila implementada de CloudFormation
<a name="using-cfn-stack-exports"></a>

Si tiene varias pilas en la misma Cuenta de AWS y región, es posible que desee compartir información entre ellas. Esto resulta útil cuando una pila necesita usar recursos creados por otra pila.

Por ejemplo, puede tener una pila que cree recursos de red, como subredes y grupos de seguridad, para sus servidores web. Luego, otras pilas que crean los servidores web reales pueden utilizar los recursos de red creados por la primera pila. No es necesario codificar de forma rígida los IDs de recursos en la plantilla de la pila ni pasar los IDs como parámetros de entrada.

Para compartir información entre pilas, *exporta* los valores de salida de una pila y los *importa* a otra pila. Así es como funciona:

1. En la plantilla de la primera pila (p. ej., la pila de redes), se definen determinados valores para la exportación mediante el campo `Export` de la sección `Outputs`. Para obtener más información, consulte [Sintaxis de Outputs de la plantilla de CloudFormation](outputs-section-structure.md).

1. Al crear o actualizar esa pila, CloudFormation exporta los valores de salida y los pone a disposición de otras pilas de la misma Cuenta de AWS y región.

1. En la plantilla de la otra pila, se utiliza la función [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html) para importar los valores exportados de la primera pila.

1. Al crear o actualizar la segunda pila (p. ej., la pila del servidor web), CloudFormation recupera automáticamente los valores exportados de la primera pila y los utiliza.

Para obtener un tutorial y plantillas de ejemplo, consulte [Consulta de las salidas de recursos en otra pila de CloudFormation](walkthrough-crossstackref.md).

## Exportación de valores de salida de pilas en comparación con el uso de pilas anidadas
<a name="output-vs-nested"></a>

Una pila anidada es un pila que crea en otra pila con el recurso `AWS::CloudFormation::Stack`. Con pilas anidadas, se implementan y administran todos los recursos desde una sola pila. Se pueden usar salidas desde una pila en el grupo de pilas anidadas como entradas a otra pila del grupo. Esto difiere de la exportación de valores.

Si desea que solo se intercambie información dentro de un grupo de pilas anidadas, le sugerimos que utilice pilas anidadas. Para compartir información con otras pilas (no solo dentro del grupo de pilas anidadas), exporte valores. Por ejemplo, puede crear una sola pila con una subred y, a continuación, exportar su ID. Otras pilas pueden utilizar dicha subred importando su ID. Cada pila no tiene por qué crear su propia subred. Mientras las pilas importen el ID de la subred, no se puede cambiar ni eliminar.

Para obtener más información sobre las pilas anidadas, consulte [División de una plantilla en piezas reutilizables utilizando pilas anidadas](using-cfn-nested-stacks.md).

## Consideraciones
<a name="using-cfn-stack-exports-considerations"></a>

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.

## Listado de valores de salida exportados
<a name="using-cfn-stack-exports-listing"></a>

Si necesita ver los valores de las salidas exportadas de sus pilas, utilice uno de los siguientes métodos:

**Para obtener una lista de valores de salida exportados (consola)**

1. Abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. En la barra de navegación de la parte superior de la pantalla, elija la Región de AWS.

1. En el panel de navegación izquierdo, seleccione **Exportaciones**.

**Para obtener una lista de los valores de salida exportados (AWS CLI)**  
Use el siguiente comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html). Sustituya *us-east-1* por su Región de AWS.

```
aws cloudformation list-exports --region us-east-1
```

A continuación, se muestra un ejemplo del resultado.

```
{
    "Exports": [
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-a",
            "Value": "subnet-07b410xmplddcfa03"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-b",
            "Value": "subnet-075ed3xmplebd2fb1"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-vpcid",
            "Value": "vpc-011d7xmpl100e9841"
        }
    ]
}
```

CloudFormation muestra los nombres y los valores de las salidas exportadas para la región actual y la pila desde la que se esperaban. Para usar un valor de salida exportado en otra plantilla de pila, puede referenciarla con el nombre de exportación y la función `Fn::ImportValue`.

## Enumeración de pilas que importan un valor de salida exportado
<a name="using-cfn-stack-imports"></a>

Para eliminar o cambiar los valores de salida exportados, primero debe averiguar qué pilas los importan.

Para ver las pilas que importan un valor de salida exportado, utilice uno de los siguientes métodos:

**Enumeración de pilas que importan un valor de salida exportado (consola)**

1. Abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. En el panel de navegación izquierdo, seleccione **Exportaciones**.

1. Para ver qué pilas importan un valor de exportación determinado, elija **Export Name** (Nombre de la exportación) para ese valor de exportación. CloudFormation muestra la página de detalles de exportación, que enumera todas las pilas que están importando el valor.

**Para obtener una lista de pilas que importan un valor de salida exportado (AWS CLI)**  
Utilice el comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html). Sustituya *us-east-1* por su Región de AWS y `private-vpc-vpcid` por el nombre del valor de salida exportado.

```
aws cloudformation list-imports --region us-east-1 \
    --export-name private-vpc-vpcid
```

CloudFormation devuelve una lista de pilas que están importando el valor.

```
{
    "Imports": [
        "my-app-stack"
    ]
}
```

Una vez que sepa qué pilas importan un valor exportado en particular, debe modificar esas pilas para eliminar las funciones `Fn::ImportValue` que refieren a los valores de salida. Debe eliminar todas las importaciones que hacen referencia a valores de salida exportados antes de poder eliminar o modificar los valores de salida exportados. 

# Definición de recursos existentes en tiempo de ejecución con tipos de parámetros proporcionados por CloudFormation
<a name="cloudformation-supplied-parameter-types"></a>

Al crear la plantilla, puede crear parámetros que requieran que los usuarios introduzcan identificadores de los recursos de AWS existentes o parámetros de Systems Manager mediante tipos de parámetros especializados proporcionados por CloudFormation. 

**Topics**
+ [Descripción general](#cloudformation-supplied-parameter-types-overview)
+ [Ejemplo](#cloudformation-supplied-parameter-types-example)
+ [Consideraciones](#cloudformation-supplied-parameter-types-considerations)
+ [Tipos de parámetros específicos de AWS compatibles](#aws-specific-parameter-types-supported)
+ [Tipos de parámetros de Systems Manager admitidos](#systems-manager-parameter-types-supported)
+ [Tipos de parámetros de Systems Manager no admitidos](#systems-manager-parameter-types-unsupported)

## Descripción general
<a name="cloudformation-supplied-parameter-types-overview"></a>

En CloudFormation, puede usar parámentros para personalizar las pilas al proporcionar valores de entrada durante la creación o actualización de la pila. Esta característica hace que sus plantillas sean reutilizables y flexibles en diferentes escenarios. 

Los parámetros se definen en la sección `Parameters` de una plantilla de CloudFormation. Cada parámetro tiene un nombre y un tipo, y se puede tener varias configuraciones adicionales, como un valor predeterminado y valores permitidos. Para obtener más información, consulte [Sintaxis de Parameters de la plantilla de CloudFormation](parameters-section-structure.md). 

El tipo de parámetro determina el tipo de valor de entrada que el parámetro puede aceptar. Por ejemplo, `Number` solo acepta valores numéricos, mientras que `String` acepta la entrada de texto. 

CloudFormation proporciona varios tipos de parámetros adicionales que puede usar en sus plantillas para hacer referencia a los recursos de AWS existentes y a los parámetros de Systems Manager. 

Estos tipos de parámetro se dividen en dos categorías:
+ **tipos de parámetros específicos de AWS**: CloudFormation proporciona un conjunto de tipos de parámetros que ayudan a atrapar valores no válidos al crear o actualizar una pila. Al utilizar estos tipos de parámetros, cualquier persona que utilice la plantilla debe especificar valores válidos de la Cuenta de AWS y la región en la que van a crear la pila.

  Si utilizan la Consola de administración de AWS, CloudFormation proporciona una lista rellenada previamente de los valores existentes de su cuenta y región. De esta forma el usuario no tiene que recordar y escribir correctamente un nombre específico o ID. En su lugar, simplemente seleccionan valores de una lista desplegable. En algunos casos, pueden incluso buscar valores por ID, nombre o el valor `Name` de la etiqueta.
+ **Tipos de parámetros de Systems Manager**CloudFormation también proporciona tipos de parámetros que corresponden a parámetros existentes en el Almacén de parámetros de Systems Manager. Cuando se usan estos tipos de parámetros, cualquier persona que use la plantilla debe especificar una clave de Almacén de parámetros como el valor del tipo de parámetro de Systems Manager y, a continuación, CloudFormation recupera el valor más reciente del Almacén de parámetros que se usará para su pila. Esto puede resultar útil cuando necesite actualizar con frecuencia las aplicaciones con nuevos valores de propiedad, como los ID de Imagen de máquina de Amazon (AMI). Para obtener más información acerca del Almacén de parámetros, consulte [Almacén de parámetros de Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html).

Una vez definidos los parámetros en la sección `Parameters`, puede hacer referencia a los valores de los parámetros en toda la plantilla de CloudFormation mediante la función `Ref`.

## Ejemplo
<a name="cloudformation-supplied-parameter-types-example"></a>

El siguiente ejemplo muestra una plantilla que usa los siguientes tipos de parámetros. 
+ `AWS::EC2::VPC::Id`
+ `AWS::EC2::Subnet::Id`
+ `AWS::EC2::KeyPair::KeyName`
+ `AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>`

Para crear una pila a partir de esta plantilla, debe especificar un ID de VPC, un ID de subred y un nombre de par de claves existentes en su cuenta. También puede especificar una clave del Almacén de parámetros existente que haga referencia al ID de AMI deseado o mantener el valor predeterminado de `/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2`. Este parámetro público es un alias del ID de AMI regional de la AMI más reciente de Amazon Linux 2. Para obtener más información acerca de parámetros públicos, consulte [Descubrir parámetros públicos en el Almacén de parámetros](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) en la *Guía del usuario de AWS Systems Manager*.

### JSON
<a name="cloudformation-supplied-parameter-types-example.json"></a>

```
{
    "Parameters": {
        "VpcId": {
            "Description": "ID of an existing Virtual Private Cloud (VPC).",
            "Type": "AWS::EC2::VPC::Id"
        },
        "PublicSubnetId": {
            "Description": "ID of an existing public subnet within the specified VPC.",
            "Type": "AWS::EC2::Subnet::Id"
        },
        "KeyName": {
            "Description": "Name of an existing EC2 key pair to enable SSH access to the instance.",
            "Type": "AWS::EC2::KeyPair::KeyName"
        },
        "AMIId": {
            "Description": "Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).",
            "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
            "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
        }
    },
    "Resources": {
        "InstanceSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable SSH access via port 22",
                "VpcId": { "Ref": "VpcId" },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        },
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "KeyName": { "Ref": "KeyName" },
                "ImageId": { "Ref": "AMIId" },
                "NetworkInterfaces": [
                    {
                        "AssociatePublicIpAddress": "true",
                        "DeviceIndex": "0",
                        "SubnetId": { "Ref": "PublicSubnetId" },
                        "GroupSet": [{ "Ref": "InstanceSecurityGroup" }]
                    }
                ]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Value": { "Ref": "Ec2Instance" }
        }
    }
}
```

### YAML
<a name="cloudformation-supplied-parameter-types-example.yaml"></a>

```
Parameters:
  VpcId:
    Description: ID of an existing Virtual Private Cloud (VPC).
    Type: AWS::EC2::VPC::Id
  PublicSubnetId:
    Description: ID of an existing public subnet within the specified VPC.
    Type: AWS::EC2::Subnet::Id
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance.
    Type: AWS::EC2::KeyPair::KeyName
  AMIId:
    Description: Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: !Ref KeyName
      ImageId: !Ref AMIId
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnetId
          GroupSet:
            - !Ref InstanceSecurityGroup
Outputs:
  InstanceId:
    Value: !Ref Ec2Instance
```

### Comando AWS CLI para crear una pila
<a name="cloudformation-supplied-parameter-types-cli-command"></a>

El siguiente comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) crea una pila basada en la plantilla de ejemplo. 

```
aws cloudformation create-stack --stack-name MyStack \
  --template-body file://sampletemplate.json \
  --parameters \
ParameterKey="VpcId",ParameterValue="vpc-a123baa3" \
ParameterKey="PublicSubnetId",ParameterValue="subnet-123a351e" \
ParameterKey="KeyName",ParameterValue="MyKeyName" \
ParameterKey="AMIId",ParameterValue="MyParameterKey"
```

Para utilizar un tipo de parámetro que acepte una lista de cadenas, por ejemplo `List<AWS::EC2::Subnet::Id>`, debe evitar las comas del interior del `ParameterValue` con una doble barra invertida, como se muestra en el siguiente ejemplo.

```
--parameters ParameterKey="SubnetIDs",ParameterValue="subnet-5ea0c127\\,subnet-6194ea3b\\,subnet-c87f2be0"
```

## Consideraciones
<a name="cloudformation-supplied-parameter-types-considerations"></a>

Recomendamos que use referencias dinámicas para restringir el acceso a las definiciones de configuración confidenciales, como las credenciales de terceros. Para obtener más información, consulte [Obtención de valores almacenados en otros servicios con referencias dinámicas](dynamic-references.md).

Si quiere permitir a los usuarios de la plantilla especificar valores de distintas Cuentas de AWS, no utilice tipos de parámetros específicos de AWS. En su lugar, defina los parámetros de tipo `String` o `CommaDelimitedList`. 

Hay algunas cosas que se deben tener en cuenta con los tipos de parámetros de Systems Manager:
+ Puede ver los valores resueltos de los parámetros [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html) en la pestaña **Parámetros** de la pila de la consola o mediante la ejecución de o [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html). Tenga en cuenta que estos valores se establecen al crearse o actualizarse la pila, por lo que pueden diferir de los valores más recientes del Almacén de parámetros.
+ En el caso de las actualizaciones de pilas, si se utiliza la opción **Usar un valor existente** (o se establece `UsePreviousValue` como verdadero), significa que se quiere seguir utilizando la misma clave del Almacén de parámetros, no su valor. CloudFormation siempre recupera el valor más reciente.
+ Si especifica cualquier valor permitido u otras restricciones, CloudFormation los valida con las claves de parámetros que especifique, pero no con sus valores. Debe validar los valores en el propio Almacén de parámetros.
+ Al crear o actualizar pilas y crear conjuntos de cambios, CloudFormation usa los valores que existan en al Almacén de parámetros en ese momento. Si un parámetro especificado no existe en el Almacén de parámetros con la Cuenta de AWS del intermediario, CloudFormation devuelve un error de validación.
+ Al ejecutar un conjunto de cambios, CloudFormation usa los valores que es especifican en el conjunto de cambios. Debe revisar estos valores antes de ejecutar el conjunto de cambios porque pueden cambiar en el almacén de parámetros entre el momento de la creación del conjunto de cambios y su ejecución.
+ Para los parámetros almacenados en el mismo Cuenta de AWS, debe proporcionar el nombre del parámetro. Para los parámetros del almacén de parámetros compartidos por otra Cuenta de AWS, debe proporcionar el ARN completo del parámetro.

## Tipos de parámetros específicos de AWS compatibles
<a name="aws-specific-parameter-types-supported"></a>

CloudFormation es compatible con los siguientes tipos específicos de AWS:

`AWS::EC2::AvailabilityZone::Name`  
Una zona de disponibilidad, como por ejemplo `us-west-2a`.

`AWS::EC2::Image::Id`  
Un ID de imagen de Amazon EC2, como por ejemplo `ami-0ff8a91507f77f867`. Tenga en cuenta que la consola de CloudFormation no muestra una lista desplegable de valores para este tipo de parámetro.

`AWS::EC2::Instance::Id`  
Un ID de instancia Amazon EC2, como por ejemplo `i-1e731a32`.

`AWS::EC2::KeyPair::KeyName`  
Un nombre del par de claves de Amazon EC2.

`AWS::EC2::SecurityGroup::GroupName`  
Un nombre del grupo de seguridad de VPC predeterminado; por ejemplo, `my-sg-abc`.

`AWS::EC2::SecurityGroup::Id`  
Un ID de grupo de seguridad, como por ejemplo `sg-a123fd85`.

`AWS::EC2::Subnet::Id`  
Un ID de subred, como por ejemplo `subnet-123a351e`.

`AWS::EC2::Volume::Id`  
Un ID de volumen de Amazon EBS, como por ejemplo `vol-3cdd3f56`.

`AWS::EC2::VPC::Id`  
Un ID de VPC, como por ejemplo `vpc-a123baa3`.

`AWS::Route53::HostedZone::Id`  
Un ID de zona alojada de Amazon Route 53, como por ejemplo `Z23YXV4OVPL04A`.

`List<AWS::EC2::AvailabilityZone::Name>`  
Una matriz de las zonas de disponibilidad de una región, como por ejemplo `us-west-2a, us-west-2b`.

`List<AWS::EC2::Image::Id>`  
Una matriz de ID de imagen de Amazon EC2, como por ejemplo `ami-0ff8a91507f77f867, ami-0a584ac55a7631c0c`. Tenga en cuenta que la consola de CloudFormation no muestra una lista desplegable de valores para este tipo de parámetro.

`List<AWS::EC2::Instance::Id>`  
Una matriz de ID de instancia Amazon EC2, como por ejemplo `i-1e731a32, i-1e731a34`.

`List<AWS::EC2::SecurityGroup::GroupName>`  
Una matriz de los nombres de los grupos de seguridad de VPC predeterminados; por ejemplo, `my-sg-abc, my-sg-def`.

`List<AWS::EC2::SecurityGroup::Id>`  
Una matriz de los ID de grupos de seguridad, como por ejemplo `sg-a123fd85, sg-b456fd85`.

`List<AWS::EC2::Subnet::Id>`  
Una matriz de los IDs de subred, como por ejemplo `subnet-123a351e, subnet-456b351e`.

`List<AWS::EC2::Volume::Id>`  
Una matriz de ID de volumen de Amazon EBS, como por ejemplo `vol-3cdd3f56, vol-4cdd3f56`.

`List<AWS::EC2::VPC::Id>`  
Una matriz de los ID de VPC, como por ejemplo `vpc-a123baa3, vpc-b456baa3`.

`List<AWS::Route53::HostedZone::Id>`  
Una matriz de ID de zonas alojadas de Amazon Route 53, como por ejemplo `Z23YXV4OVPL04A, Z23YXV4OVPL04B`.

## Tipos de parámetros de Systems Manager admitidos
<a name="systems-manager-parameter-types-supported"></a>

CloudFormation admite los siguientes tipos de parámetros de Systems Manager:

`AWS::SSM::Parameter::Name`  
El nombre de una clave de parámetro de Systems Manager. Utilice este tipo de parámetro únicamente para comprobar que existe un parámetro obligatorio. CloudFormation no recuperará el valor real asociado con el parámetro. 

`AWS::SSM::Parameter::Value<String>`  
Un parámetro de Systems Manager cuyo valor es una cadena. Esto corresponde al tipo de parámetro `String` en Parameter Store.

`AWS::SSM::Parameter::Value<List<String>>` o `AWS::SSM::Parameter::Value<CommaDelimitedList>`  
Un parámetro de Administrador de sistemas cuyo valor es una lista de cadenas. Esto corresponde al tipo de parámetro `StringList` en Parameter Store.

`AWS::SSM::Parameter::Value<AWS-specific parameter type>`  
Un parámetro de Systems Manager cuyo valor es un tipo de parámetro específico de AWS.   
Por ejemplo, lo siguiente especifica el tipo `AWS::EC2::KeyPair::KeyName`:  
+ `AWS::SSM::Parameter::Value<AWS::EC2::KeyPair::KeyName>`

`AWS::SSM::Parameter::Value<List<AWS-specific parameter type>>`  
Un parámetro de Systems Manager cuyo valor es una lista de tipos de parámetros específicos de AWS.   
Por ejemplo, lo siguiente especifica una lista de tipos `AWS::EC2::KeyPair::KeyName`:  
+ `AWS::SSM::Parameter::Value<List<AWS::EC2::KeyPair::KeyName>>`

## Tipos de parámetros de Systems Manager no admitidos
<a name="systems-manager-parameter-types-unsupported"></a>

CloudFormation no admite los siguientes tipos de parámetros de Systems Manager:
+ Listas de tipos de parámetros de Systems Manager; por ejemplo: `List<AWS::SSM::Parameter::Value<String>>`

Además, CloudFormation no es compatible con la definición de parámetros de plantillas como tipos de parámetros de Systems Manager `SecureString`. Sin embargo, también puede especificar cadenas seguras como *valores* de parámetros para algunos recursos. Para obtener más información, consulte [Obtención de valores almacenados en otros servicios con referencias dinámicas](dynamic-references.md).

# Tutoriales de CloudFormation
<a name="walkthroughs"></a>

Esta documentación proporciona una colección de tutoriales diseñados para que pueda practicar de forma práctica con las implementaciones de pilas.
+ [Consulta de las salidas de recursos en otra pila de CloudFormation](walkthrough-crossstackref.md): en este tutorial, se muestra cómo hacer referencia a los resultados de una pila de CloudFormation dentro de otra pila. En lugar de incluir todos los recursos en una sola pila, puede crear recursos de AWS en pilas independientes para crear plantillas más modulares y reutilizables.
+ [Implementación de aplicaciones en Amazon EC2](deploying.applications.md): obtenga información sobre cómo usar CloudFormation para instalar, configurar e iniciar automáticamente su aplicación en instancias de Amazon EC2. De esta manera, puede duplicar fácilmente implementaciones y actualizar instalaciones existentes sin conectarse directamente a la instancia.
+ [Actualización de una pila de CloudFormation](updating.stacks.walkthrough.md): consulte una serie sencilla de actualizaciones a una pila en ejecución con CloudFormation.
+ [Creación de una aplicación con escalado y equilibrio de carga](walkthrough-autoscaling.md): descubra cómo usar CloudFormation para crear una aplicación escalable y con equilibrio de carga. En este tutorial se explica cómo crear un grupo de escalado automático, un equilibrador de carga y otros recursos relacionados para garantizar que la aplicación pueda gestionar cargas de tráfico variables y mantener una alta disponibilidad.
+ [Emparejamiento con una VPC en otra Cuenta de AWS](peer-with-vpc-in-another-account.md): este tutorial le guía a través del proceso de creación de una conexión de emparejamiento de nube privada virtual (VPC) entre dos VPC en diferentes Cuentas de AWS. El emparejamiento de VPC le ayuda a dirigir el tráfico entre las VPC y acceder a los recursos como si formaran parte de la misma red.
+ [Implementaciones azul/verde de ECS a través de CodeDeploy con CloudFormation](blue-green.md): descubra cómo usar CloudFormation para realizar implementaciones azul/verde AWS CodeDeploy en Amazon ECS. Las implementaciones azul/verde son una forma de actualizar sus aplicaciones o servicios con un tiempo de inactividad mínimo.

# Consulta de las salidas de recursos en otra pila de CloudFormation
<a name="walkthrough-crossstackref"></a>

En este tutorial, se muestra cómo hacer referencia a los resultados de una pila de CloudFormation dentro de otra pila para crear plantillas más modulares y reutilizables. 

En lugar de incluir todos los recursos en una sola pila, debe crear recursos de AWS en pilas independientes. A continuación, puede consultar salidas de recursos necesarios de otras pilas. Al restringir referencias de pila cruzadas a salidas, usted controla las partes de una pila referenciadas por otras pilas.

Por ejemplo, podría tener una pila de red con una VPC, un grupo de seguridad, y una subred para aplicaciones web públicas y una pila de aplicaciones web públicas independientes. Para garantizar que las aplicaciones web utilicen el grupo de seguridad y la subred de la pila de la red, debe crear una referencia de pila cruzada que permita a la pila de aplicaciones web hacer referencia a resultados de recursos desde la pila de red. Con una referencia de pila cruzada, los propietarios de las pilas de aplicaciones web no necesitan crear ni mantener reglas de red o activos.

Para crear una referencia de pila cruzada, utilice el campo de campo de salida `Export` para marcar el valor de la salida de un recurso para exportar. A continuación, utilice la función intrínseca `Fn::ImportValue` para importar el valor. Para obtener más información, consulte [Obtención de salidas exportadas de una pila implementada de CloudFormation](using-cfn-stack-exports.md).

**nota**  
CloudFormation es un servicio gratuito. Sin embargo, se le cobrará por los recursos de AWS que incluya en sus pilas a la tarifa actual para cada una. Para obtener más información sobre los precios de AWS, consulte [la página de detalles de cada producto](https://aws.amazon.com/).

**Topics**
+ [Uso de una plantilla de ejemplo para crear una pila de red](#walkthrough-crossstackref-create-vpc-stack)
+ [Uso de una plantilla de ejemplo para crear una pila de aplicaciones web](#walkthrough-crossstackref-create-ec2-stack)
+ [Verificación de que la pila funcione según lo esperado](#walkthrough-crossstackref-verify)
+ [Solución de problemas de asignación de AMI](#walkthrough-crossstackref-troubleshooting-ami)
+ [Eliminación de sus recursos](#walkthrough-crossstackref-clean-up)

## Uso de una plantilla de ejemplo para crear una pila de red
<a name="walkthrough-crossstackref-create-vpc-stack"></a>

Antes de empezar este tutorial, compruebe que tiene permisos de IAM para utilizar todos los siguientes servicios: Amazon VPC, Amazon EC2 y CloudFormation.

La pila de red contiene la VPC, el grupo de seguridad y la subred que utilizará en la pila de aplicaciones web. Además de estos recursos, la pila de red crea una gateway de Internet y las tablas de ruteo para permitir el acceso público.

Debe crear esta pila antes de crear la pila de aplicaciones web. Si crea la pila de aplicaciones web primero, no tendrá un grupo de seguridad ni una subred.

La plantilla de pila está disponible a través de la siguiente URL: [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template). Para ver los recursos que creará la pila, elija el enlace, que abre la plantilla. En la sección `Outputs`, puede ver los recursos de red que la plantilla de ejemplo exporta. Los nombres de los recursos exportados están prefijados con el nombre de la pila en caso de que se exporten recursos de red de otras pilas. Cuando los usuarios importan recursos de red, pueden especificar de qué pilas se importan los recursos.

**Para crear la pila de la red**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. En la página **Pilas**, elija **Crear pila** en la parte superior derecha y, a continuación, elija **Con recursos nuevos (estándar)**.

1. Elija **Seleccione una plantilla existente** y, en la sección **Especificar plantilla**, seleccione **Amazon S3 URL**.

1. En **Amazon S3 URL**, pegue la siguiente URL: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template**.

1. Elija **Siguiente**.

1. En **Stack name (Nombre de pila)**, escriba **SampleNetworkCrossStack** y, a continuación, elija **Next (Siguiente)**.
**nota**  
Registre el nombre de esta pila. Necesitará el nombre de la pila al lanzar la pila de aplicaciones web.

1. Elija **Siguiente**. Para este tutorial, no tiene que añadir etiquetas ni especificar una configuración avanzada.

1. Asegúrese de que el nombre de la pila y la URL de la plantilla sean correctos y elija **Create stack (Crear pila)**.

   CloudFormation puede tardar varios minutos en crear la pila. Espere hasta que todos los recursos se hayan creado correctamente antes de proceder a crear la pila de aplicaciones web.

1. Para monitorizar el progreso, vea los eventos de la pila. Para obtener más información, consulte [Monitorizar el progreso de la pila](monitor-stack-progress.md).

## Uso de una plantilla de ejemplo para crear una pila de aplicaciones web
<a name="walkthrough-crossstackref-create-ec2-stack"></a>

La pila de aplicaciones web crea una instancia de EC2 que utiliza el grupo de seguridad y la subred desde la pila de la red. 

Debe crear esta pila en la misma Región de AWS que la pila de la red.

La plantilla de pila está disponible a través de la siguiente URL: [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template). Para ver los recursos que creará la pila, elija el enlace, que abrirá la plantilla. En la sección `Resources`, vea las propiedades de la instancia de EC2. Puede ver cómo se importan los recursos de red de otra pila usando la función `Fn::ImportValue`.

**Para crear la pila de aplicaciones web**

1. En la página **Pilas**, seleccione **Crear pila** en la parte superior derecha y, a continuación, seleccione **Con recursos nuevos (estándar)**.

1. Elija **Seleccione una plantilla existente** y, en la sección **Especificar plantilla**, seleccione **Amazon S3 URL**.

1. En **Amazon S3 URL**, pegue la siguiente URL: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template**.

1. Elija **Siguiente**.

1. Para **Stack name (Nombre de pila)**, escriba **SampleWebAppCrossStack**. En la sección **Parameters (Parámetros)**, utilice el valor predeterminado para el parámetro **NetworkStackName** y, a continuación, elija **Next (Siguiente)**.

   La plantilla de ejemplo utiliza el valor del parámetro para especificar en cada pila para importar valores.

1. Elija **Siguiente**. Para este tutorial, no tiene que añadir etiquetas ni especificar una configuración avanzada.

1. Asegúrese de que el nombre de la pila y la URL de la plantilla sean correctos y elija **Create stack (Crear pila)**.

   CloudFormation puede tardar varios minutos en crear la pila.

## Verificación de que la pila funcione según lo esperado
<a name="walkthrough-crossstackref-verify"></a>

Después de haber creado la pila, vea sus recursos y tenga en cuenta el ID de instancia. Para obtener más información acerca de la visualización de recursos de la pila, consulte [Visualización de la información de la pila desde la consola de CloudFormation](cfn-console-view-stack-data-resources.md).

Para verificar la subred y el grupo de seguridad de la instancia, vea las propiedades de la instancia en la [consola de Amazon EC2](https://console.aws.amazon.com/ec2/). Si la instancia utiliza el grupo de seguridad y la subred en la pila `SampleNetworkCrossStack`, se ha creado correctamente una referencia de pila cruzada.

Utilice la consola para ver los resultados de pila y la URL del sitio web de ejemplo para comprobar que se ejecuta la aplicación web. Para obtener más información, consulte [Visualización de la información de la pila desde la consola de CloudFormation](cfn-console-view-stack-data-resources.md).

## Solución de problemas de asignación de AMI
<a name="walkthrough-crossstackref-troubleshooting-ami"></a>

Si recibe el error `Template error: Unable to get mapping for AWSRegionArch2AMI::[region]::HVM64`, la plantilla no incluye ninguna asignación de AMI para su Región de AWS. En lugar de actualizar la asignación, recomendamos utilizar los parámetros públicos de Systems Manager para hacer referencia a las AMI más recientes de forma dinámica:

1. Descargue la plantilla `SampleWebAppCrossStack` en su máquina local desde [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template).

1. Elimine toda la sección de asignación de `AWSRegionArch2AMI`.

1. Agregue el siguiente parámetro de Systems Manager:

   ```
   "LatestAmiId": {
     "Description": "The latest Amazon Linux 2 AMI from the Parameter Store",
       "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
       "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
     }
   ```

1. Reemplace la referencia a `ImageId` existente:

   ```
   "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" } , "HVM64" ] }, 
   ```

   Por:

   ```
   "ImageId": { "Ref": "LatestAmiId" },
   ```

   Este parámetro se resuelve automáticamente en la AMI de Amazon Linux 2 más reciente para la región donde se implementa la pila. 

   Para otras distribuciones de Linux, utilice la ruta de parámetros apropiada. Para obtener más información, consulte [Descubrir parámetros públicos en Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) en la *Guía del usuario de AWS Systems Manager*.

1. Cargue la plantilla modificada en un bucket de Amazon S3 de su cuenta:

   ```
   aws s3 cp SampleWebAppCrossStack.template s3://amzn-s3-demo-bucket/
   ```

1. Al crear la pila, especifique la URL de la plantilla de S3 en lugar de la URL de ejemplo.

## Eliminación de sus recursos
<a name="walkthrough-crossstackref-clean-up"></a>

Para asegurarse de que no se le cobra por servicios no deseados, elimine las pilas.

**Para eliminar las pilas**

1. En la consola de CloudFormation, seleccione la pila `SampleWebAppCrossStack`.

1. Elija **Actions (Acciones)** y, a continuación, elija **Delete Stack (Eliminar pila)**.

1. En el mensaje de confirmación, elija **Delete (Eliminar)**.

1. Una vez que se haya eliminado la pila, repita los mismos pasos con la pila `SampleNetworkCrossStack`.
**nota**  
Espere hasta que CloudFormation elimine por completo la pila `SampleWebAppCrossStack`. Si la instancia de EC2 sigue ejecutándose en la VPC, CloudFormation no eliminará la VPC en la pila `SampleNetworkCrossStack`.

# Implementación de aplicaciones en Amazon EC2
<a name="deploying.applications"></a>

Puede usar CloudFormation para instalar, configurar e iniciar automáticamente aplicaciones en instancias de Amazon EC2. Esto le permite duplicar fácilmente implementaciones y actualizar instalaciones existentes sin conectarse directamente a la instancia, lo que permite ahorrar mucho tiempo y esfuerzo.

CloudFormation incluye un conjunto de scripts auxiliares (`cfn-init`, `cfn-signal`, `cfn-get-metadata` y `cfn-hup`) que se basan en `cloud-init`. Se llama a estos scripts auxiliares desde las plantillas de CloudFormation para instalar, configurar y actualizar aplicaciones en instancias Amazon EC2 que se encuentran en la misma plantilla. Para obtener más información, consulte [Referencia de scripts auxiliares de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) en la *Guía de referencia de plantillas de CloudFormation*.

En el [tutorial de introducción](gettingstarted.walkthrough.md), creó un servidor web sencillo utilizando `UserData` con un script de bash básico. Si bien esto funcionó para una página sencilla de “Hello World”, las aplicaciones reales suelen necesitar una configuración más sofisticada, que incluya:
+ Varios paquetes de software instalados en el orden correcto.
+ Archivos de configuración complejos creados con contenido específico.
+ Servicios iniciados y configurados para iniciarse automáticamente.
+ Gestión de errores y validación del proceso de configuración.

Los scripts auxiliares de CloudFormation proporcionan una forma más sólida y sostenible de configurar las instancias de EC2 en comparación con los scripts de bash básicos en `UserData`. El script auxiliar `cfn-init` lee los datos de configuración de los metadatos de la plantilla y los aplica sistemáticamente a la instancia.

En este tutorial, aprenderá a utilizar el script auxiliar `cfn-init` y a supervisar el proceso de arranque.

**nota**  
CloudFormation es gratuito, pero se le cobrarán los recursos de Amazon EC2 que cree. Sin embargo, si es la primera vez que utiliza AWS, puede aprovechar el [nivel gratuito](https://aws.amazon.com/free/) para minimizar o eliminar los costos durante este proceso de aprendizaje.

**Topics**
+ [Requisitos previos](#bootstrapping-tutorial-prerequisites)
+ [Descripción de los conceptos de arranque](#bootstrapping-tutorial-understand-concepts)
+ [Inicio con un ejemplo sencillo de arranque](#bootstrapping-tutorial-simple-example)
+ [Cómo agregar archivos y comandos](#bootstrapping-tutorial-add-complexity)
+ [Cómo agregar la seguridad a la red](#bootstrapping-tutorial-security-group)
+ [La plantilla de arranque completa](#bootstrapping-tutorial-complete-template)
+ [Creación de la pila con la consola](#bootstrapping-tutorial-create-stack)
+ [Supervisión del proceso de arranque](#bootstrapping-tutorial-validate-bootstrap)
+ [Prueba del servidor web arrancado](#bootstrapping-tutorial-test-web-server)
+ [Solución de problemas de arranque](#bootstrapping-tutorial-troubleshooting)
+ [Eliminar recursos](#bootstrapping-tutorial-clean-up)
+ [Siguientes pasos](#bootstrapping-tutorial-next-steps)

## Requisitos previos
<a name="bootstrapping-tutorial-prerequisites"></a>
+ Debe haber completado el tutorial [Creación de su primera pila](gettingstarted.walkthrough.md) o una experiencia equivalente con los conceptos básicos de CloudFormation.
+ Debe tener acceso a una Cuenta de AWS con un usuario o rol de IAM que tenga permisos para usar Amazon EC2 y CloudFormation, o acceso de usuario administrativo.
+ Debe tener una nube privada virtual (VPC) que tenga acceso a Internet. Esta plantilla de tutorial requiere una VPC predeterminada, que se incluye automáticamente con las Cuentas de AWS más recientes. Si no tiene una VPC predeterminada o si se ha eliminado, consulte la sección de solución de problemas en el tutorial [Creación de su primera pila](gettingstarted.walkthrough.md) para ver soluciones alternativas.

## Descripción de los conceptos de arranque
<a name="bootstrapping-tutorial-understand-concepts"></a>

Vamos a describir los conceptos clave que hacen que el arranque funcione antes de crear la plantilla.

### El script auxiliar `cfn-init`
<a name="bootstrapping-tutorial-cfn-init-overview"></a>

CloudFormation proporciona scripts auxiliares de Python que puede utilizar para instalar software e iniciar servicios en una instancia de Amazon EC2. El script `cfn-init` lee los metadatos de los recursos de su plantilla y aplica la configuración a su instancia.

El proceso funciona de la siguiente manera:

1. Define la configuración en la sección `Metadata` de su recurso de EC2.

1. Llama a `cfn-init` desde el script `UserData`.

1. `cfn-init` lee los metadatos y aplica la configuración.

1. La instancia se configura de acuerdo con sus especificaciones.

### Estructura de los metadatos
<a name="bootstrapping-tutorial-metadata-structure"></a>

La configuración se define en una estructura específica dentro de su instancia de EC2.

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:                       # Metadata section for the resource
      AWS::CloudFormation::Init:    # Required key that cfn-init looks for
        config:                     # Configuration name (you can have multiple)
          packages:                 # Install packages
          files:                    # Create files
          commands:                 # Run commands
          services:                 # Start/stop services
```

El script `cfn-init` procesa estas secciones en un orden específico: paquetes, grupos, usuarios, orígenes, archivos, comandos y, a continuación, servicios.

## Inicio con un ejemplo sencillo de arranque
<a name="bootstrapping-tutorial-simple-example"></a>

Comencemos con un ejemplo mínimo de arranque que simplemente instale e inicie Apache.

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:                 # Install Apache web server
            yum:
              httpd: []
          services:                 # Start Apache and enable it to start on boot
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      UserData: !Base64             # Script that runs when instance starts
        Fn::Sub: |
          #!/bin/bash
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}
```

En este ejemplo sencillo se ilustran los conceptos básicos:
+ La sección `packages` instala el paquete `httpd` usando yum. Esto funciona en Amazon Linux y en otras distribuciones de Linux que utilizan yum.
+ La sección `services` garantiza que `httpd` se inicie y ejecute automáticamente.
+ `UserData` instala las herramientas de arranque más recientes y llama a `cfn-init`.

## Cómo agregar archivos y comandos
<a name="bootstrapping-tutorial-add-complexity"></a>

Ahora, para mejorar nuestro ejemplo, vamos a agregar una página web personalizada y un archivo de registro en el directorio `/var/log` de la instancia de EC2.

### Creación de archivos
<a name="bootstrapping-tutorial-files-section"></a>

La sección `files` le permite crear archivos en la instancia con contenido específico. La barra vertical (`|`) le permite pasar un bloque literal de texto (código HTML) como contenido del archivo (`/var/www/html/index.html`).

```
files:
  /var/www/html/index.html:
    content: |
      <body>
        <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>
      </body>
```

### Ejecución de comandos
<a name="bootstrapping-tutorial-commands-section"></a>

La sección `commands` le permite ejecutar comandos del intérprete de comandos durante el proceso de arranque. Este comando crea un archivo de registro en `/var/log/welcome.txt` en la instancia de EC2. Para verlo, necesita un par de claves de Amazon EC2 que utilizará para el acceso mediante SSH y un rango de direcciones IP que se pueda utilizar para acceder mediante SSH a la instancia (no se trata aquí).

```
commands:
  createWelcomeLog:
    command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
```

## Cómo agregar la seguridad a la red
<a name="bootstrapping-tutorial-security-group"></a>

Como vamos a configurar un servidor web, debemos permitir que el tráfico web (HTTP) llegue a nuestra instancia de EC2. Para ello, crearemos un grupo de seguridad que permita el tráfico entrante en el puerto 80 desde su dirección IP. Las instancias de EC2 también tienen que enviar tráfico a Internet, por ejemplo, para instalar actualizaciones de paquetes. De forma predeterminada, los grupos de seguridad permiten el tráfico saliente. A continuación, asociaremos este grupo de seguridad a nuestra instancia de EC2 mediante la propiedad `SecurityGroupIds`.

```
WebServerSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Allow HTTP access from my IP address
    SecurityGroupIngress:
      - IpProtocol: tcp
        Description: HTTP
        FromPort: 80
        ToPort: 80
        CidrIp: !Ref MyIP
```

## La plantilla de arranque completa
<a name="bootstrapping-tutorial-complete-template"></a>

Ahora vamos a juntar todas las partes. Esta es la plantilla completa en la que se combinan todos los conceptos que hemos tratado.

```
AWSTemplateFormatVersion: 2010-09-09
Description: Bootstrap an EC2 instance with Apache web server using cfn-init

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t3.micro
      - t2.micro
    ConstraintDescription: must be a valid EC2 instance type.

  MyIP:
    Description: Your IP address in CIDR format (e.g. 203.0.113.1/32)
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.

Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP access from my IP address
      SecurityGroupIngress:
        - IpProtocol: tcp
          Description: HTTP
          FromPort: 80
          ToPort: 80
          CidrIp: !Ref MyIP

  WebServer:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          files:
            /var/www/html/index.html:
              content: |
                <body>
                  <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>
                </body>
          commands:
            createWelcomeLog:
              command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData: !Base64
        Fn::Sub: |
          #!/bin/bash
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region}
      Tags:
        - Key: Name
          Value: Bootstrap Tutorial Web Server

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServer.PublicDnsName}'
    Description: EC2 instance public DNS name
```

## Creación de la pila con la consola
<a name="bootstrapping-tutorial-create-stack"></a>

El siguiente procedimiento implica cargar la plantilla de pila de ejemplo desde un archivo. Abra un editor de texto en su equipo local y agregue la plantilla. Guarde el archivo con el nombre `samplelinux2stack.template`.

**Para lanzar la plantilla de pila**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Elija **Create stack (Crear pila)**, **With new resources (standard) (Con nuevos recursos [estándar])**.

1. En **Especificar plantilla**, seleccione **Cargar un archivo de plantilla** y, a continuación, seleccione **Elegir archivo** para cargar el archivo `samplelinux2stack.template`. 

1. Elija **Siguiente**.

1. En la página **Especificar los detalles de la pila**, ingrese **BootstrapTutorialStack** como nombre de la pila.

1. En **Parámetros**, haga lo siguiente.
   + **LatestAmiId**: deje el valor predeterminado.
   + **InstanceType**: elija **t2.micro** o **t3.micro** para el tipo de instancia de EC2.
   + **MyIP**: ingrese su dirección IP pública real con el sufijo `/32`.

1. Elija **Siguiente** dos veces y, luego, **Enviar** para crear la pila.

## Supervisión del proceso de arranque
<a name="bootstrapping-tutorial-validate-bootstrap"></a>

Los procesos de arranque tardan más que los lanzamientos sencillos de EC2 porque se instala y configura software adicional.

**Supervisión del progreso del arranque**

1. En la consola de CloudFormation, seleccione su pila y abra la pestaña **Eventos**.

1. Preste atención al evento `WebServer CREATE_IN_PROGRESS`. El proceso de arranque comienza después del lanzamiento de la instancia.

1. El proceso de arranque normalmente dura unos minutos. Verá `WebServer CREATE_COMPLETE` cuando haya terminado.

Si quiere ver lo que ocurre durante el proceso de arranque, puede consultar los registros de la instancia.

**Visualización de los registros de arranque (opcional)**

1. Abra la [consola de EC2](https://console.aws.amazon.com/ec2/) y busque su instancia.

1. Seleccione la instancia y, luego, elija **Acciones**, **Monitoreo y solución de problemas**, **Obtener registro del sistema** para ver el progreso del arranque.

1. Si no ve los registros inmediatamente, espere y actualice la página. 

## Prueba del servidor web arrancado
<a name="bootstrapping-tutorial-test-web-server"></a>

Cuando la pila muestre `CREATE_COMPLETE`, pruebe su servidor web.

**Prueba del servidor web**

1. En la consola de CloudFormation, vaya a la pestaña **Salidas** de su pila.

1. Haga clic en el valor de **WebsiteURL** para abrir su servidor web en una pestaña nueva.

1. Debería ver la página web personalizada con el mensaje `Congratulations, you have successfully launched the AWS CloudFormation sample`.

**nota**  
Si la página no se carga inmediatamente, espere un minuto e inténtelo de nuevo. Es posible que el proceso de arranque aún se esté completando incluso después de que la pila muestre `CREATE_COMPLETE`.

## Solución de problemas de arranque
<a name="bootstrapping-tutorial-troubleshooting"></a>

Si el proceso de arranque falla o el servidor web no funciona, aquí tiene algunos problemas y soluciones comunes.

### Problemas comunes
<a name="bootstrapping-tutorial-common-issues"></a>
+ **No se puede crear la pila**: consulte la pestaña **Eventos** para ver mensajes de error específicos.
+ **No se puede acceder al servidor web**: compruebe que la dirección IP sea correcta en el parámetro `MyIP`. Recuerde incluir `/32` al final.
+ **No se puede completar el proceso de arranque**: es posible que la instancia se lance, pero `cfn-init` falla. Compruebe los registros del sistema tal como se describe en la sección de supervisión.

## Eliminar recursos
<a name="bootstrapping-tutorial-clean-up"></a>

Para evitar cargos continuos, puede llevar a cabo una limpieza eliminando la pila y sus recursos. 

**Eliminación de la pila y sus recursos**

1. Abra la [consola de CloudFormation](https://console.aws.amazon.com/cloudformation/).

1. En la página **Pilas**, seleccione la opción situada junto al nombre de la pila que ha creado (**BootstrapTutorialStack**) y, a continuación, seleccione **Eliminar**.

1. Cuando se le pida confirmación, seleccione **Eliminar**.

1. Supervise el progreso del proceso de eliminación de la pila en la pestaña **Evento**. El estado de **BootstrapTutorialStack** cambia a `DELETE_IN_PROGRESS`. Cuando CloudFormation completa la eliminación de la pila, quita la pila de la lista.

## Siguientes pasos
<a name="bootstrapping-tutorial-next-steps"></a>

¡Enhorabuena\$1 Ha aprendido correctamente a arrancar instancias de EC2 con CloudFormation. Ahora sabe:
+ Cómo usar los scripts auxiliares de `cfn-init`.
+ Cómo estructurar los metadatos para el arranque.
+ Cómo instalar paquetes, crear archivos, ejecutar comandos y administrar servicios.
+ Cómo supervisar si se producen problemas de arranque.

Para seguir aprendiendo:
+ Aprenda a actualizar una pila en ejecución y a usar el script auxiliar `cfn-hup`. Para obtener más información, consulte [Actualización de una pila de CloudFormation](updating.stacks.walkthrough.md).
+ Aprenda a arrancar una pila de Windows. Para obtener más información, consulte [Arranque de pilas de CloudFormation basadas en Windows](cfn-windows-stacks-bootstrapping.md).
+ Explore escenarios de arranque más complejos con varios conjuntos de configuración. Para obtener más información, consulte [cfn-init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-init.html) y [AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html) en la *Guía de referencia de plantillas de CloudFormation*.
+ Obtenga información sobre cómo usar `cfn-signal` para informar sobre el estado de finalización del arranque. Para obtener más información, consulte [cfn-signal](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-signal.html) en la *Guía de referencia de plantillas de CloudFormation*.

# Actualización de una pila de CloudFormation
<a name="updating.stacks.walkthrough"></a>

**nota**  
Este tutorial se basa en los conceptos presentados en el tutorial [Implementación de aplicaciones en Amazon EC2](deploying.applications.md). Si no ha completado ese tutorial, le recomendamos que lo haga primero para comprender el arranque de EC2 con CloudFormation.

En este tema se ilustra una sencilla progresión de actualizaciones a una pila en ejecución. Le explicaremos con detalle los pasos siguientes:

1. **Cree la pila inicial**: cree una pila con una AMI base de Amazon Linux 2 e instale el Apache Web Server y una aplicación PHP sencilla con los scripts auxiliares de CloudFormation.

1. **Actualice la aplicación**: actualice uno de los archivos en la aplicación e implemente el software con CloudFormation.

1. **Añada un par de claves**: añada un par de claves de Amazon EC2 a la instancia y, a continuación, actualice el grupo de seguridad para permitir el acceso de SSH a la instancia.

1. **Actualice el tipo de instancia**: cambie el tipo de instancia de la instancia de Amazon EC2 subyacente.

1. **Actualice la AMI**: cambie la Imagen de máquina de Amazon (AMI) para la instancia de Amazon EC2 en la pila.

**nota**  
CloudFormation es gratuito, pero se le cobrarán los recursos de Amazon EC2 que cree. Sin embargo, si es la primera vez que utiliza AWS, puede aprovechar el [nivel gratuito](https://aws.amazon.com/free/) para minimizar o eliminar los costos durante este proceso de aprendizaje.

**Topics**
+ [Paso 1: crear la pila inicial](#update-stack-initial-stack)
+ [Paso 2: actualizar la aplicación](#update-stack-update-application)
+ [Paso 3: añadir acceso SSH con un par de claves](#update-stack-add-key-pair)
+ [Paso 4: actualizar el tipo de instancia](#update-stack-update-instance-type)
+ [Paso 5: actualizar la AMI](#update-stack-update-ami)
+ [Consideraciones sobre el impacto y la disponibilidad](#update.walkthrough.impact)
+ [Recursos relacionados](#update.walkthrough.related)

## Paso 1: crear la pila inicial
<a name="update-stack-initial-stack"></a>

Empezaremos creando una pila que podemos utilizar a lo largo del resto de este tema. Hemos proporcionado una sencilla plantilla que lanza una aplicación web PHP de una sola instancia alojada en el Apache Web Server y que se ejecuta en una AMI de Amazon Linux 2.

El Apache Web Server, PHP y la aplicación PHP sencilla están instalados por los scripts auxiliares de CloudFormation que vienen instalados de forma predeterminada en la AMI de Amazon Linux 2. El siguiente fragmento de la plantilla muestra los metadatos que describe los paquetes y archivos para instalar, en este caso, el Apache Web Server y la infraestructura PHP desde el repositorio Yum para la AMI de Amazon Linux 2. El fragmento también muestra la sección `Services`, que garantiza que el Apache Web Server se está ejecutando. 

```
WebServerInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      config:
        packages:
          yum:
            httpd: []
            php: []
        files:
          /var/www/html/index.php:
            content: |
              <?php
              echo '<h1>Hello World!</h1>';
              ?>
            mode: '000644'
            owner: apache
            group: apache
        services:
          systemd:
            httpd:
              enabled: true
              ensureRunning: true
```

La aplicación en sí es un ejemplo del tipo “Hola, mundo”, que se define completamente en la plantilla. En el caso de una aplicación real, los archivos pueden almacenarse en Amazon S3, GitHub o en otro repositorio y consultarse desde la plantilla. CloudFormation puede descargar paquetes (como RPM o RubyGems) y los archivos individuales de referencia y expandir archivos `.zip` y `.tar` para crear los artefactos de aplicación en la instancia de Amazon EC2.

La plantilla permite y configura el daemon `cfn-hup` para escuchar los cambios de la configuración definidos en los metadatos de la instancia de Amazon EC2. Al utilizar el daemon `cfn-hup`, puede actualizar el software de la aplicación, como la versión de Apache o PHP, o actualizar el archivo de la aplicación PHP directamente desde CloudFormation. El siguiente fragmento del mismo recurso de Amazon EC2 de la plantilla muestra los elementos necesarios para configurar `cfn-hup` para que llame a `cfn-init` cada dos minutos para detectar y aplicar actualizaciones a los metadatos. De lo contrario, `cfn-init` solo se ejecuta una vez al iniciarse.

```
files:
  /etc/cfn/cfn-hup.conf:
    content: !Sub |
      [main]
      stack=${AWS::StackId}
      region=${AWS::Region}
      # The interval used to check for changes to the resource metadata in minutes. Default is 15
      interval=2
    mode: '000400'
    owner: root
    group: root
  /etc/cfn/hooks.d/cfn-auto-reloader.conf:
    content: !Sub |
      [cfn-auto-reloader-hook]
      triggers=post.update
      path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
      action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
      runas=root
services:
  systemd:
    cfn-hup:
      enabled: true
      ensureRunning: true
      files:
        - /etc/cfn/cfn-hup.conf
        - /etc/cfn/hooks.d/cfn-auto-reloader.conf
```

Para completar la pila, en la sección `Properties` de la definición de la instancia de Amazon EC2, la propiedad `UserData` contiene el script `cloud-init` que llama a `cfn-init` para instalar los paquetes y archivos. Para obtener más información, consulte [Referencia de scripts auxiliares de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) en la *Guía de referencia de plantillas de CloudFormation*. La plantilla también crea un grupo de seguridad de Amazon EC2

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          yum update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

**Lanzamiento de una pila a partir de esta plantilla**

1. Copie la plantilla y guárdela localmente en el sistema como un archivo de texto. Anote la ubicación, porque necesitará usar el archivo en el siguiente paso.

1. Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Elija **Crear pila, Con nuevos recursos (estándar)**.

1. Elija **Elegir una plantilla existente**.

1. En **Especificar plantilla**, elija **Cargar un archivo de plantilla**, busque el archivo que ha creado en el primer paso y, a continuación, seleccione **Siguiente**.

1. En la página **Especificar detalles de pila**, escriba **UpdateTutorial** como nombre de la pila.

1. En **Parámetros**, mantenga todos los parámetros iguales y elija **Siguiente** dos veces.

1. En la pantalla **Revisar y añadir**, elija **Enviar**.

Cuando el estado de la pila sea `CREATE_COMPLETE`, la pestaña **Salidas** mostrará la URL de su sitio web. Si selecciona el valor de salida de `WebsiteURL`, verá su nueva aplicación PHP en marcha.

## Paso 2: actualizar la aplicación
<a name="update-stack-update-application"></a>

Ahora que hemos implementado la pila, vamos a actualizar la aplicación. Haremos un sencillo cambio en el texto impreso por la aplicación. Para ello, agregaremos un comando echo para el archivo index.php tal y como se muestra en este fragmento de la plantilla:

```
files:
  /var/www/html/index.php:
    content: |
      <?php
      echo "<h1>Hello World!</h1>";
      echo "<p>This is an updated version of our application.</p>";
      ?>
    mode: '000644'
    owner: apache
    group: apache
```

Utilice un editor de texto para modificar manualmente el archivo de plantilla que guardó localmente.

Ahora, actualice la pila.

**Actualización de la pila con la plantilla actualizada**

1. En la consola de CloudFormation, seleccione la pila de **UpdateTutorial**.

1. Seleccione **Actualizar y realizar una actualización directa**.

1. Seleccione **Sustituir plantilla existente**.

1. En el panel **Especificar plantilla**, elija **Cargar un archivo de plantilla**, cargue el archivo de plantilla modificado y, a continuación, elija **Siguiente**.

1. En la página **Especificar detalles de pila**, modifique los parámetros y, a continuación, elija **Siguiente**.

1. En la página **Revisar**, revise los cambios. En **Cambios**, debería ver a CloudFormation actualizar el recurso `WebServerInstance`.

1. Elija **Enviar**.

Cuando la pila está en el estado `UPDATE_COMPLETE`, puede seleccionar el valor de salida de `WebsiteURL` de nuevo, para verificar si han entrado en vigor los cambios de la aplicación. El daemon `cfn-hup` se ejecuta cada 2 minutos, por lo que la aplicación puede tardar hasta 2 minutos en cambiar una vez actualizado la pila.

Para ver el conjunto de recursos que se actualizaron, vaya a la consola de CloudFormation. En la pestaña **Events (Eventos)**, examine los eventos de pila. En este caso particular, se actualizaron los metadatos de la instancia `WebServerInstance` de Amazon EC2, lo que provocó que CloudFormation también reevaluara los demás recursos (`WebServerSecurityGroup`) para asegurarse de que no hubiera otros cambios. Ninguno de los otros recursos de la pila fue modificado. CloudFormation solo actualizará aquellos recursos en la pila que se vean afectados por cualquier cambio realizado en la pila. Estos cambios pueden ser directos, como los cambios de metadatos o la propiedad, o pueden deberse a dependencias o flujos de datos a través de `Ref`, `GetAtt` u otras funciones de plantilla intrínsecas. Para obtener más información, consulte la [Referencia de función intrínseca](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

Esta sencilla actualización ilustra el proceso. Sin embargo, puede realizar cambios mucho más complejos en los archivos y paquetes implementados en las instancias de Amazon EC2. Por ejemplo, puede decidir que necesita añadir MySQL a la instancia, junto con el soporte de PHP para MySQL. Para hacerlo, solo tiene que añadir los archivos y paquetes adicionales junto con los servicios adicionales a la configuración y, luego, actualizar la pila para implementar los cambios.

```
packages:
  yum:
    httpd: []
    php: []
    mysql: []
    php-mysql: []
    mysql-server: []
    mysql-libs: []

  ...

services:
  systemd:
    httpd:
      enabled: true
      ensureRunning: true
    cfn-hup:
      enabled: true
      ensureRunning: true
      files:
        - /etc/cfn/cfn-hup.conf
        - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    mysqld:
      enabled: true
      ensureRunning: true
```

Puede actualizar los metadatos de CloudFormation de modo que se actualicen según las nuevas versiones de los paquetes que utiliza la aplicación. En los ejemplos anteriores, la propiedad de la versión de cada paquete está vacía, lo que indica que `cfn-init` debería instalar la última versión del paquete.

```
packages:
  yum:
    httpd: []
    php: []
```

Si lo desea, puede especificar una cadena de versión de un paquete. Si cambia la cadena de versión en las posteriores llamadas de actualización de pila, se implementará la nueva versión del paquete. A continuación se muestra un ejemplo de cómo utilizar los números de versión para paquetes RubyGems. Cualquier paquete compatible con control de versiones puede tener versiones específicas.

```
packages:
  rubygems:
    mysql: []
    rubygems-update:
      - "1.6.2"
    rake:
      - "0.8.7"
    rails:
      - "2.3.11"
```

## Paso 3: añadir acceso SSH con un par de claves
<a name="update-stack-add-key-pair"></a>

También puede actualizar un recurso de la plantilla para añadir propiedades que no estaban especificadas originalmente en la plantilla. Para ilustrarlo, vamos a añadir un par de claves de Amazon EC2 a una instancia de EC2 existente y, a continuación, abrir el puerto 22 en el grupo de seguridad de Amazon EC2, para que pueda utilizar Secure Shell (SSH) para acceder a la instancia.

**Para añadir el acceso SSH a una instancia Amazon EC2 existente**

1. Añada dos parámetros adicionales a la plantilla para transmitirlo en el nombre de una ubicación SSH y un par de claves Amazon EC2 existentes.

   ```
   Parameters:
     KeyName:
       Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
       Type: AWS::EC2::KeyPair::KeyName
       ConstraintDescription: must be the name of an existing EC2 KeyPair.
   
     SSHLocation:
       Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
       Type: String
       MinLength: 9
       MaxLength: 18
       Default: 0.0.0.0/0
       AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
       ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
   ```

1. Añada la propiedad `KeyName` a la instancia de Amazon EC2.

   ```
   WebServerInstance:
     Type: AWS::EC2::Instance
     Properties:
       ImageId: !Ref LatestAmiId
       InstanceType: !Ref InstanceType
       KeyName: !Ref KeyName
       SecurityGroupIds:
         - !Ref WebServerSecurityGroup
   ```

1. Añada el puerto 22 y la ubicación de SSH a las reglas de entrada del grupo de seguridad de Amazon EC2.

   ```
   WebServerSecurityGroup:
     Type: AWS::EC2::SecurityGroup
     Properties:
       GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
       SecurityGroupIngress:
         - IpProtocol: tcp
           FromPort: 80
           ToPort: 80
           CidrIp: 0.0.0.0/0
         - IpProtocol: tcp
           FromPort: 22
           ToPort: 22
           CidrIp: !Ref SSHLocation
   ```

1. Para actualizar la pila, siga los mismos pasos que se explican en [Paso 2: actualizar la aplicación](#update-stack-update-application).

## Paso 4: actualizar el tipo de instancia
<a name="update-stack-update-instance-type"></a>

Ahora vamos a demostrar cómo actualizar la infraestructura subyacente cambiando el tipo de instancia.

La pila que hemos creado utiliza hasta ahora una instancia de Amazon EC2 t3.micro. Supongamos que el sitio web recién creado obtiene más tráfico de lo que puede controlar una instancia t3.micro y ahora desea pasar a un tipo de instancia de Amazon EC2 m5.large. Si la arquitectura del tipo de instancia cambia, la instancia se debe crear con una AMI diferente. Sin embargo, tanto el t3.micro como el m5.large utilizan las mismas arquitecturas de CPU y ejecutan las AMI de Amazon Linux 2 (x86\$164). Para obtener más información, consulte [Compatibilidad para cambiar el tipo de instancias](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resize-limitations.html) en la *Guía del usuario de Amazon EC2*.

Vamos a utilizar la plantilla que hemos modificado en el paso anterior para cambiar el tipo de instancia. Dado que `InstanceType` fue un parámetro de entrada de la plantilla, no es necesario modificar la plantilla; se puede cambiar el valor del parámetro en la página **Especificar parámetros**.

**Actualización de la pila con un nuevo valor de parámetro**

1. En la consola de CloudFormation, seleccione la pila de **UpdateTutorial**.

1. Seleccione **Actualizar y realizar una actualización directa**.

1. Seleccione **Usar plantilla actual** y, a continuación, elija **Siguiente**.

1. En la página **Especificar los detalles de la pila**, cambie el valor del cuadro de texto **InstanceType** de `t3.micro` a `m5.large`. A continuación, elija **Siguiente** dos veces.

1. En la página **Revisar**, revise los cambios. En **Cambios**, debería ver a CloudFormation actualizar el recurso `WebServerInstance`.

1. Elija **Enviar**.

Puede cambiar de manera dinámica el tipo de instancia de una instancia de Amazon EC2 con respaldo de EBS al iniciar y detener la instancia. CloudFormation intenta optimizar el cambio al actualizar el tipo de instancia y reiniciar la instancia, de modo que el ID de la instancia no cambie. Cuando la instancia se reinicia, sin embargo, la dirección IP pública de la instancia sí cambia. Para garantizar que la dirección IP elástica se vincule correctamente después del cambio, CloudFormation también actualizará la dirección IP elástica. Puede ver los cambios en la consola de CloudFormation en la pestaña de **eventos**.

Para comprobar el tipo de instancia desde Consola de administración de AWS, abra la consola de Amazon EC2 y busque allí su instancia.

## Paso 5: actualizar la AMI
<a name="update-stack-update-ami"></a>

Ahora, actualicemos nuestra pila para usar Amazon Linux 2023, que es la próxima generación de Amazon Linux. 

La actualización de la AMI es un cambio importante que requiere reemplazar la instancia. No es posible iniciar y detener la instancia para modificar la AMI. CloudFormation lo considera un cambio en una propiedad inmutable del recurso. Para realizar un cambio en una propiedad inmutable, CloudFormation debe lanzar un recurso de reemplazo, en este caso, una nueva instancia de Amazon EC2 que ejecute la nueva AMI. 

Veamos cómo podemos actualizar nuestra plantilla de pila para usar Amazon Linux 2023. Los cambios clave incluyen la actualización del parámetro de AMI y el cambio de un administrador de paquetes `yum` a `dnf`.

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2023 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.

  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.

  SSHLocation:
    Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          dnf update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            dnf:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                echo "<p>This is an updated version of our application.</p>";
                echo "<p>Running on Amazon Linux 2023!</p>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

Para actualizar la pila, siga los mismos pasos que se explican en [Paso 2: actualizar la aplicación](#update-stack-update-application).

Una vez que la nueva instancia está en funcionamiento, CloudFormation actualiza los demás recursos de la pila para que se vinculen al nuevo recurso. Cuando se crean todos los nuevos recursos, se elimina el recurso anterior, un proceso conocido como `UPDATE_CLEANUP`. En este momento, podrá observar que el ID de instancia y el URL de la aplicación de la instancia de la pila han cambiado como resultado de la actualización. Los acontecimientos de la tabla de **eventos** contienen una descripción “La actualización solicitada tiene un cambio de una propiedad inmutable y, por tanto, se ha creado un nuevo recurso físico” para indicar que se reemplazó un recurso.

Alternativa: si tiene un código de aplicación escrito en la AMI que desea actualizar, puede utilizar el mismo mecanismo de actualización de pila para actualizar la AMI y así cargar su nueva aplicación.

**Actualización de la AMI con un código de la aplicación personalizado**

1. Cree nuevas AMI que contengan los cambios del sistema operativo o su aplicación. Para obtener más información, consulte [Creación de una AMI basada en Amazon EBS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html) en la *Guía del usuario de Amazon EC2*.

1. Actualice la plantilla para incorporar los nuevos ID de AMI.

1. Para actualizar la pila, siga los mismos pasos que se explican en [Paso 2: actualizar la aplicación](#update-stack-update-application).

Al actualizar la pila, CloudFormation detecta que el ID de AMI ha cambiado y, a continuación, se activa una actualización de la pila de la misma forma que iniciamos el anterior.

## Consideraciones sobre el impacto y la disponibilidad
<a name="update.walkthrough.impact"></a>

Las distintas propiedades afectan de forma diferente a los recursos de la pila. Puede utilizar CloudFormation para actualizar cualquier propiedad; no obstante, antes de realizar cambios, debe tener en cuenta estas preguntas:

1. ¿Cómo afecta la actualización al propio recurso? Por ejemplo, la actualización de un umbral de alarma inutilizará la alarma durante la actualización. Como hemos visto, cambiar el tipo de instancia requiere que la instancia se detenga y se reinicie. CloudFormation utiliza las acciones de actualización o modificación para los recursos subyacentes con el propósito de realizar cambios en los recursos. Para comprender el impacto de las actualizaciones, debería comprobar la documentación de los recursos específicos.

1. ¿Es el cambio mutable o inmutable? Algunos cambios en las propiedades de recursos, como, por ejemplo, el cambio de la AMI en una instancia de Amazon EC2, no son compatibles con los servicios subyacentes. En el caso de cambios mutables, CloudFormation utilizará las API de tipo actualización o modificación para los recursos subyacentes. Para cambios de propiedad inmutables, CloudFormation creará nuevos recursos con las propiedades actualizadas y, a continuación, vincularlas a la pila antes de eliminar los antiguos recursos. Aunque CloudFormation intenta reducir el tiempo de inactividad de los recursos de la pila; sustituir un recurso es un proceso de varios pasos y llevará tiempo. Durante la reconfiguración de pila, su aplicación no estará totalmente operativa. Por ejemplo, es posible que no pueda atender a las solicitudes ni acceder a una base de datos.

## Recursos relacionados
<a name="update.walkthrough.related"></a>

Para obtener más información acerca del uso de CloudFormation para iniciar las aplicaciones y de la integración con otros servicios de configuración e implementación como Puppet y Opscode Chef, consulte los siguientes documentos técnicos:
+ [Proceso de arranque de aplicaciones mediante CloudFormation](https://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf)
+ [Integración de CloudFormation con Opscode Chef](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithOpscodeChef.pdf)
+ [Integración de CloudFormation con Puppet](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithPuppet.pdf)

# Creación de una aplicación con escalado y equilibrio de carga
<a name="walkthrough-autoscaling"></a>

Para este tutorial, creará una pila que lo ayudará a configurar una aplicación con escalado y equilibrio de carga. El tutorial proporciona una plantilla de ejemplo que utilizará para crear la pila. La plantilla de ejemplo proporciona un grupo de escalado automático, un equilibrador de carga de aplicación, grupos de seguridad que controlan el tráfico al equilibrador de carga y al grupo de escalado automático y una configuración de notificaciones de Amazon SNS para publicar notificaciones sobre las actividades de escalado. 

Esta plantilla crea una o varias instancias de Amazon EC2 y un equilibrador de carga de aplicación. Se le facturarán los recursos de AWS que utilice si crea una pila a partir de esta plantilla. 

## Plantilla de pila completa
<a name="example-templates-autoscaling-full-stack-template"></a>

Empecemos por la plantilla.

**YAML**

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  InstanceType:
    Description: The EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.micro
      - t3.small
      - t3.medium
  KeyName:
    Description: Name of an existing EC2 key pair to allow SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
  OperatorEmail:
    Description: The email address to notify when there are any scaling activities
    Type: String
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  Subnets:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: At least two public subnets in different Availability Zones in the selected VPC
  VPC:
    Type: AWS::EC2::VPC::Id
    Description: A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet
Resources:
  ELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: EC2 Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        SourceSecurityGroupId:
          Fn::GetAtt:
          - ELBSecurityGroup
          - GroupId
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: !Ref SSHLocation
  EC2TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 15
      HealthyThresholdCount: 5
      Matcher:
        HttpCode: '200'
      Name: EC2TargetGroup
      Port: 80
      Protocol: HTTP
      TargetGroupAttributes:
      - Key: deregistration_delay.timeout_seconds
        Value: '20'
      UnhealthyThresholdCount: 3
      VpcId: !Ref VPC
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref EC2TargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: 80
      Protocol: HTTP
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      Subnets: !Ref Subnets
      SecurityGroups:
        - !GetAtt ELBSecurityGroup.GroupId
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: !Ref LatestAmiId
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        SecurityGroupIds: 
          - !Ref EC2SecurityGroup
        UserData:
          Fn::Base64: !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd
            systemctl start httpd
            systemctl enable httpd
            echo "<h1>Hello World!</h1>" > /var/www/html/index.html
  NotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
  WebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MaxSize: '3'
      MinSize: '1'
      NotificationConfigurations:
        - TopicARN: !Ref NotificationTopic
          NotificationTypes: ['autoscaling:EC2_INSTANCE_LAUNCH', 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR', 'autoscaling:EC2_INSTANCE_TERMINATE', 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR']
      TargetGroupARNs:
        - !Ref EC2TargetGroup
      VPCZoneIdentifier: !Ref Subnets
```

**JSON**

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Parameters":{
    "InstanceType":{
      "Description":"The EC2 instance type",
      "Type":"String",
      "Default":"t3.micro",
      "AllowedValues":[
        "t3.micro",
        "t3.small",
        "t3.medium"
      ]
    },
    "KeyName":{
      "Description":"Name of an existing EC2 key pair to allow SSH access to the instances",
      "Type":"AWS::EC2::KeyPair::KeyName"
    },
    "LatestAmiId":{
      "Description":"The latest Amazon Linux 2 AMI from the Parameter Store",
      "Type":"AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
      "Default":"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    },
    "OperatorEmail":{
      "Description":"The email address to notify when there are any scaling activities",
      "Type":"String"
    },
    "SSHLocation":{
      "Description":"The IP address range that can be used to SSH to the EC2 instances",
      "Type":"String",
      "MinLength":9,
      "MaxLength":18,
      "Default":"0.0.0.0/0",
      "ConstraintDescription":"Must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "Subnets":{
      "Type":"List<AWS::EC2::Subnet::Id>",
      "Description":"At least two public subnets in different Availability Zones in the selected VPC"
    },
    "VPC":{
      "Type":"AWS::EC2::VPC::Id",
      "Description":"A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet"
    }
  },
  "Resources":{
    "ELBSecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"ELB Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
    },
    "EC2SecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"EC2 Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "SourceSecurityGroupId":{
              "Fn::GetAtt":[
                "ELBSecurityGroup",
                "GroupId"
              ]
            }
          },
          {
            "IpProtocol":"tcp",
            "FromPort":22,
            "ToPort":22,
            "CidrIp":{
              "Ref":"SSHLocation"
            }
          }
        ]
      }
    },
    "EC2TargetGroup":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":30,
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":15,
        "HealthyThresholdCount":5,
        "Matcher":{
          "HttpCode":"200"
        },
        "Name":"EC2TargetGroup",
        "Port":80,
        "Protocol":"HTTP",
        "TargetGroupAttributes":[
          {
            "Key":"deregistration_delay.timeout_seconds",
            "Value":"20"
          }
        ],
        "UnhealthyThresholdCount":3,
        "VpcId":{
          "Ref":"VPC"
        }
      }
    },
    "ALBListener":{
      "Type":"AWS::ElasticLoadBalancingV2::Listener",
      "Properties":{
        "DefaultActions":[
          {
            "Type":"forward",
            "TargetGroupArn":{
              "Ref":"EC2TargetGroup"
            }
          }
        ],
        "LoadBalancerArn":{
          "Ref":"ApplicationLoadBalancer"
        },
        "Port":80,
        "Protocol":"HTTP"
      }
    },
    "ApplicationLoadBalancer":{
      "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties":{
        "Scheme":"internet-facing",
        "Subnets":{
          "Ref":"Subnets"
        },
        "SecurityGroups":[
          {
            "Fn::GetAtt":[
              "ELBSecurityGroup",
              "GroupId"
            ]
          }
        ]
      }
    },
    "LaunchTemplate":{
      "Type":"AWS::EC2::LaunchTemplate",
      "Properties":{
        "LaunchTemplateName":{
          "Fn::Sub":"${AWS::StackName}-launch-template"
        },
        "LaunchTemplateData":{
          "ImageId":{
            "Ref":"LatestAmiId"
          },
          "InstanceType":{
            "Ref":"InstanceType"
          },
          "KeyName":{
            "Ref":"KeyName"
          },
          "SecurityGroupIds":[
            {
              "Ref":"EC2SecurityGroup"
            }
          ],
          "UserData":{
            "Fn::Base64":{
              "Fn::Join":[
                "",
                [
                  "#!/bin/bash\n",
                  "yum update -y\n",
                  "yum install -y httpd\n",
                  "systemctl start httpd\n",
                  "systemctl enable httpd\n",
                  "echo \"<h1>Hello World!</h1>\" > /var/www/html/index.html"
                ]
              ]
            }
          }
        }
      }
    },
    "NotificationTopic":{
      "Type":"AWS::SNS::Topic",
      "Properties":{
        "Subscription":[
          {
            "Endpoint":{
              "Ref":"OperatorEmail"
            },
            "Protocol":"email"
          }
        ]
      }
    },
    "WebServerGroup":{
      "Type":"AWS::AutoScaling::AutoScalingGroup",
      "Properties":{
        "LaunchTemplate":{
          "LaunchTemplateId":{
            "Ref":"LaunchTemplate"
          },
          "Version":{
            "Fn::GetAtt":[
              "LaunchTemplate",
              "LatestVersionNumber"
            ]
          }
        },
        "MaxSize":"3",
        "MinSize":"1",
        "NotificationConfigurations":[
          {
            "TopicARN":{
              "Ref":"NotificationTopic"
            },
            "NotificationTypes":[
              "autoscaling:EC2_INSTANCE_LAUNCH",
              "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
              "autoscaling:EC2_INSTANCE_TERMINATE",
              "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
            ]
          }
        ],
        "TargetGroupARNs":[
          {
            "Ref":"EC2TargetGroup"
          }
        ],
        "VPCZoneIdentifier":{
          "Ref":"Subnets"
        }
      }
    }
  }
}
```

## Tutorial de plantilla
<a name="example-templates-autoscaling-description"></a>

La primera parte de esta plantilla especifica los `Parameters`. A cada parámetro se le debe asignar un valor en tiempo de ejecución para que CloudFormation aprovisione correctamente la pila. Los recursos especificados más adelante en la plantilla hacen referencia a estos valores y utilizan los datos.
+ `InstanceType`: el tipo de instancia de EC2 que Amazon EC2 Auto Scaling aprovisiona. Si no se especifica, se usa el valor predeterminado de `t3.micro`.
+ `KeyName`: un par de claves de EC2 existente para permitir el acceso SSH a las instancias.
+ `LatestAmiId`: el ID de imagen de máquina de Amazon (AMI) para las instancias. Si no se especifica, las instancias se lanzan con una AMI de Amazon Linux 2, mediante un parámetro AWS Systems Manager público mantenido por AWS. Para obtener más información, consulte [Buscar parámetros públicos](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) en la *Guía del usuario de AWS Systems Manager*.
+ `OperatorEmail`: la dirección de correo electrónico a la que desea enviar notificaciones de actividad de escalado.
+ `SSHLocation`: el intervalo de direcciones IP que se puede usar para enviar SSH a las instancias.
+ `Subnets`: al menos dos subredes en diferentes zonas de disponibilidad. 
+ `VPC`: una nube privada virtual (VPC) en su cuenta que permite a los recursos de subredes públicas conectarse a Internet. 
**nota**  
Puede usar la VPC predeterminada y las subredes predeterminadas para permitir que las instancias accedan a Internet. Si utiliza supropia VPC, asegúrese de que tiene una subred asignada a cada zona de disponibilidad de la región de en la que esté trabajando. Como mínimo, debe tener dos subredes públicas disponibles para crear el balanceador de carga.

La siguiente parte de esta plantilla especifica los `Resources`. Esta sección especifica los recursos de la pila y sus propiedades.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) de recurso de `ELBSecurityGroup` 
+ `SecurityGroupIngress` contiene una regla de entrada TCP que permite el acceso desde *todas las direcciones IP* (“CidrIp”: “0.0.0.0/0”) en el puerto 80.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) de recurso de `EC2SecurityGroup` 
+ `SecurityGroupIngress` contiene dos reglas de entrada: 1) una regla de entrada TCP que permite el acceso SSH (puerto 22) desde el rango de direcciones IP que usted proporciona para el parámetro de entrada de `SSHLocation` y 2) una regla de entrada TCP que permite el acceso desde el equilibrador de carga al especificar el grupo de seguridad del equilibrador de carga. La función [GetAtt](resources-section-structure.md#resource-properties-getatt) se usa para obtener el ID del grupo de seguridad con el nombre lógico `ELBSecurityGroup`.

Recurso `EC2TargetGroup` de [AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)
+ `Port`, `Protocol` y `HealthCheckProtocol` especifican el puerto de instancia de EC2 (80) y el protocolo (HTTP) a los que el `ApplicationLoadBalancer` enruta el tráfico y que Elastic Load Balancing usa para comprobar el estado de las instancias de EC2.
+ `HealthCheckIntervalSeconds` especifica que las instancias de EC2 tengan un intervalo de 30 segundos entre las comprobaciones de estado. `HealthCheckTimeoutSeconds` se define como el periodo de tiempo en el que Elastic Load Balancing espera una respuesta del destino de comprobación de estado (15 segundos en este ejemplo). Cuando termina el tiempo de espera, Elastic Load Balancing marca la comprobación de estado de las instancias de EC2 como en mal estado. Cuando una instancia de EC2 falla tres comprobaciones consecutivas (`UnhealthyThresholdCount`), Elastic Load Balancing detiene el tráfico de enrutamiento a dicha instancia de EC2 hasta que esa instancia tenga cinco comprobaciones correctas consecutivas (`HealthyThresholdCount`). En ese momento, Elastic Load Balancing considera que la instancia tiene un estado correcto y comienza a redirigir el tráfico a la instancia nuevamente.
+ `TargetGroupAttributes` actualiza el valor de retraso de anulación del registro del grupo objetivo a 20 segundos. De forma predeterminada, Elastic Load Balancing espera 300 segundos para completar el proceso de anulación del registro.

Recurso `ALBListener` de [AWS::ElasticLoadBalancingV2::Listener](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html)
+ `DefaultActions` especifica el puerto que el equilibrador de carga escucha, el grupo objetivo al que el equilibrador de carga reenvía las solicitudes y el protocolo utilizado para enrutar solicitudes.

Recurso `ApplicationLoadBalancer` de [AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)
+ `Subnets` toma el valor del parámetro de entrada `Subnets` como la lista de subredes públicas donde se crearán los nodos del equilibrador de carga.
+ `SecurityGroup` obtiene el ID del grupo de seguridad que funciona como un firewall virtual para los nodos del equilibrador de carga con el objetivo de controlar el tráfico entrante. La función [GetAtt](resources-section-structure.md#resource-properties-getatt) se usa para obtener el ID del grupo de seguridad con el nombre lógico `ELBSecurityGroup`.

Recurso `LaunchTemplate` de [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)
+ `ImageId` toma el valor del parámetro de entrada `LatestAmiId` como la AMI que se va a utilizar.
+ `KeyName` adopta el valor del parámetro de entrada `KeyName` como el par de claves de EC2 que se usará.
+ `SecurityGroupIds` obtiene el ID del grupo de seguridad con el nombre lógico `EC2SecurityGroup` que funciona como un firewall virtual para las instancias de EC2 con el objetivo de controlar el tráfico entrante.
+ `UserData` es un script de configuración que se ejecuta una vez que la instancia está operativa y en ejecución. En este ejemplo, el script instala Apache y crea un archivo index.html.

Recurso `NotificationTopic` de [AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html)
+ `Subscription` toma el valor del parámetro de entrada `OperatorEmail` como la dirección de correo electrónico del destinatario de las notificaciones cuando hay actividades de escalado. 

Recurso `WebServerGroup` de [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)
+ `MinSize` y `MaxSize` establecen el número mínimo y máximo de instancias de EC2 en el grupo de escalado automático.
+ `TargetGroupARNs` toma el ARN del grupo de destino con el nombre lógico `EC2TargetGroup`. A medida que este grupo de escalado automático escala, registra y anula automáticamente las instancias en este grupo de destino.
+ `VPCZoneIdentifier` toma el valor del parámetro de entrada `Subnets` como la lista de subredes públicas donde pueden crearse las instancias de EC2.

## Paso 1: Lance la pila
<a name="example-templates-autoscaling-launch-stack"></a>

Antes de lanzar la pila, compruebe que tiene permisos de AWS Identity and Access Management (IAM) para utilizar todos los siguientes servicios: Amazon EC2, Amazon EC2 Auto Scaling, AWS Systems Manager, Elastic Load Balancing, Amazon SNS y CloudFormation. 

El siguiente procedimiento implica cargar la plantilla de pila de ejemplo desde un archivo. Abra un editor de texto en su equipo local y agregue una de las plantillas. Guarde el archivo con el nombre `sampleloadbalancedappstack.template`.

**Para lanzar la plantilla de pila**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Elija **Create stack (Crear pila)**, **With new resources (standard) (Con nuevos recursos [estándar])**.

1. En **Especificar plantilla**, seleccione **Cargar un archivo de plantilla** y, a continuación, seleccione **Elegir archivo** para cargar el archivo `sampleloadbalancedappstack.template`. 

1. Elija **Siguiente**.

1. En la página **Especificar detalles de pila**, en Nombre de pila, escriba un nombre para la pila (por ejemplo, **SampleLoadBalancedAppStack**).

1. En **Parámetros**, revise los parámetros de la pila y proporcione valores para todos los parámetros que no tengan valores predeterminados, incluidos **OperatorEmail**, **SSHLocation**, **KeyName**, **VPC** y **Subnets**.

1. Seleccione **Next (Siguiente)** dos veces.

1. En la página **Revisar**, revise y confirme la configuración.

1. Elija **Enviar**.

   Puede ver el estado de la pila en la consola de CloudFormation en la columna **Estado**. Cuando CloudFormation haya creado correctamente la pila, recibirá el estado **CREATE\$1COMPLETE**.
**nota**  
Después de crear la pila, debe confirmar la suscripción antes de que la dirección de correo electrónico pueda comenzar a recibir notificaciones. Para obtener más información, consulte [Obtener notificaciones de Amazon SNS cuando su grupo de escalado automático escala](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-sns-notifications.html) en la *Guía del usuario de Amazon EC2 Auto Scaling*.

## Paso 2: Eliminar los recursos de ejemplo
<a name="example-templates-autoscaling-clean-up"></a>

Para asegurarse de que no se cobra por recursos de ejemplo no utilizados, elimine la pila.

**Para eliminar la pila**

1. En la consola de CloudFormation, elija la pila **SampleLoadBalancedAppStack**.

1. Elija **Eliminar**.

1. En el mensaje de confirmación, elija **Eliminar pila**.

   El estado de **SampleLoadBalancedAppStack** cambia a **DELETE\$1IN\$1PROGRESS**. Cuando CloudFormation completa la eliminación de la pila, quita la pila de la lista.

Use la plantilla de ejemplo de este tutorial para crear sus propias plantillas de pila. Para obtener más información, consulte [Tutorial: Configuración de una aplicación con escalado y equilibrio de carga aplicados](https://docs.aws.amazon.com/autoscaling/ec2/userguide/tutorial-ec2-auto-scaling-load-balancer.html) en la *Guía del usuario de Amazon EC2 Auto Scaling*.

# Emparejamiento con una VPC en otra Cuenta de AWS
<a name="peer-with-vpc-in-another-account"></a>

Puede emparejar con una nube privada virtual (VPC) en otra Cuenta de AWS mediante el uso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html). Esto crea una conexión de red entre dos VPC que permite dirigir el tráfico entre ellas, para que puedan comunicarse como si estuviesen en la misma red. Una interconexión de VPC puede ayudar a facilitar el acceso a los datos y la transferencia de datos.

Para establecer una conexión de emparejamiento de VPC, tendrá que autorizar dos Cuentas de AWS distintas en una sola pila de CloudFormation.

Para obtener más información sobre el emparejamiento de VPC y sus limitaciones, consulte la [Guía de emparejamiento de VPC de Amazon](https://docs.aws.amazon.com/vpc/latest/peering/). 

## Requisitos previos
<a name="peer-with-vpc-in-another-account-prerequisites"></a>

1. Necesita un ID de VPC del mismo nivel, un ID de Cuenta de AWS del mismo nivel y un [rol de acceso entre cuentas](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html) para la conexión de emparejamiento. 
**nota**  
Este tutorial hace referencia a dos cuentas: en primer lugar una cuenta que permite interconexiones entre cuentas (la *cuenta del aceptador*). En segundo lugar una cuenta que solicite la interconexión (la *cuenta del solicitante*).

1. Para aceptar la interconexión de VPC, la función de acceso entre cuentas debe ser asumible por usted. El recurso se comporta de la misma forma que el recurso de una interconexión de VPC en la misma cuenta. Para obtener más información sobre cómo un administrador de IAM concede permisos para asumir el rol entre cuentas, consulte [Conceder permisos de usuario para cambiar de rol](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html) en la *Guía del usuario de IAM*.

## Paso 1: Cree una VPC y un rol entre cuentas
<a name="step-1-create-vpc-and-cross-account-role"></a>

En este paso, creará la VPC y el rol en la *cuenta del aceptador*.

**Crear una VPC y un rol de acceso entre cuentas**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. En la página **Pilas**, seleccione **Crear pila** en la parte superior derecha y, a continuación, seleccione **Con recursos nuevos (estándar)**.

1. En **Requisito previo: preparar plantilla**, elija **Seleccione una plantilla existente** y, a continuación, **Cargar un archivo de plantilla**, **Elegir archivo**.

1. Abra un editor de texto en su equipo local y agregue una de las siguientes plantillas. Guarde el archivo y vuelva a la consola para seleccionarlo como archivo de plantilla.  
**Example JSON**  

   ```
   {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Description": "Create a VPC and an assumable role for cross account VPC peering.",
     "Parameters": {
       "PeerRequesterAccountId": {
         "Type": "String"
       }
     },
     "Resources": {
       "vpc": {
         "Type": "AWS::EC2::VPC",
         "Properties": {
           "CidrBlock": "10.1.0.0/16",
           "EnableDnsSupport": false,
           "EnableDnsHostnames": false,
           "InstanceTenancy": "default"
         }
       },
       "peerRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
           "AssumeRolePolicyDocument": {
             "Statement": [
               {
                 "Principal": {
                   "AWS": {
                     "Ref": "PeerRequesterAccountId"
                   }
                 },
                 "Action": [
                   "sts:AssumeRole"
                 ],
                 "Effect": "Allow"
               }
             ]
           },
           "Path": "/",
           "Policies": [
             {
               "PolicyName": "root",
               "PolicyDocument": {
                 "Version": "2012-10-17",		 	 	 
                 "Statement": [
                   {
                     "Effect": "Allow",
                     "Action": "ec2:AcceptVpcPeeringConnection",
                     "Resource": "*"
                   }
                 ]
               }
             }
           ]
         }
       }
     },
     "Outputs": {
       "VPCId": {
         "Value": {
           "Ref": "vpc"
         }
       },
       "RoleARN": {
         "Value": {
           "Fn::GetAtt": [
             "peerRole",
             "Arn"
           ]
         }
       }
     }
   }
   ```  
**Example YAML**  

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Description: Create a VPC and an assumable role for cross account VPC peering.
   Parameters:
     PeerRequesterAccountId:
       Type: String
   Resources:
     vpc:
       Type: AWS::EC2::VPC
       Properties:
         CidrBlock: 10.1.0.0/16
         EnableDnsSupport: false
         EnableDnsHostnames: false
         InstanceTenancy: default
     peerRole:
       Type: AWS::IAM::Role
       Properties:
         AssumeRolePolicyDocument:
           Statement:
             - Principal:
                 AWS: !Ref PeerRequesterAccountId
               Action:
                 - 'sts:AssumeRole'
               Effect: Allow
         Path: /
         Policies:
           - PolicyName: root
             PolicyDocument:
               Version: 2012-10-17 		 	 	 
               Statement:
                 - Effect: Allow
                   Action: 'ec2:AcceptVpcPeeringConnection'
                   Resource: '*'
   Outputs:
     VPCId:
       Value: !Ref vpc
     RoleARN:
       Value: !GetAtt 
         - peerRole
         - Arn
   ```

1. Elija **Siguiente**.

1. Asigne a la pila un nombre (por ejemplo, **VPC-owner**) y luego escriba el ID de la Cuenta de AWS de la *cuenta del solicitante* en el campo **PeerRequesterAccountId**.

1. Acepte los valores predeterminados y, a continuación, elija **Next** (Siguiente).

1. Elija **Confirmo que CloudFormation puede crear recursos de IAM** y, a continuación, elija **Crear pila**.

## Paso 2: creación de una plantilla que incluya `AWS::EC2::VPCPeeringConnection`
<a name="step-2-create-template-for-vpc-peering-connection-owner"></a>

Ahora que ha creado la VPC y un rol entre cuentas, puede interconectar con la VPC a través de otra Cuenta de AWS (la *cuenta de solicitante*).

**Crear una plantilla que incluya el recurso [AWS::EC2::VPCPeeringConnection](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html)**

1. Vuelva a la página de inicio de la consola CloudFormation.

1. En la página **Pilas**, seleccione **Crear pila** en la parte superior derecha y, a continuación, seleccione **Con recursos nuevos (estándar)**.

1. En **Requisito previo: preparar plantilla**, elija **Seleccione una plantilla existente** y, a continuación, **Cargar un archivo de plantilla**, **Elegir archivo**.

1. Abra un editor de texto en su equipo local y agregue una de las siguientes plantillas. Guarde el archivo y vuelva a la consola para seleccionarlo como archivo de plantilla.  
**Example JSON**  

   ```
   {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Description": "Create a VPC and a VPC Peering connection using the PeerRole to accept.",
     "Parameters": {
       "PeerVPCAccountId": {
         "Type": "String"
       },
       "PeerVPCId": {
         "Type": "String"
       },
       "PeerRoleArn": {
         "Type": "String"
       }
     },
     "Resources": {
       "vpc": {
         "Type": "AWS::EC2::VPC",
         "Properties": {
           "CidrBlock": "10.2.0.0/16",
           "EnableDnsSupport": false,
           "EnableDnsHostnames": false,
           "InstanceTenancy": "default"
         }
       },
       "vpcPeeringConnection": {
         "Type": "AWS::EC2::VPCPeeringConnection",
         "Properties": {
           "VpcId": {
             "Ref": "vpc"
           },
           "PeerVpcId": {
             "Ref": "PeerVPCId"
           },
           "PeerOwnerId": {
             "Ref": "PeerVPCAccountId"
           },
           "PeerRoleArn": {
             "Ref": "PeerRoleArn"
           }
         }
       }
     },
     "Outputs": {
       "VPCId": {
         "Value": {
           "Ref": "vpc"
         }
       },
       "VPCPeeringConnectionId": {
         "Value": {
           "Ref": "vpcPeeringConnection"
         }
       }
     }
   }
   ```  
**Example YAML**  

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Description: Create a VPC and a VPC Peering connection using the PeerRole to accept.
   Parameters:
     PeerVPCAccountId:
       Type: String
     PeerVPCId:
       Type: String
     PeerRoleArn:
       Type: String
   Resources:
     vpc:
       Type: AWS::EC2::VPC
       Properties:
         CidrBlock: 10.2.0.0/16
         EnableDnsSupport: false
         EnableDnsHostnames: false
         InstanceTenancy: default
     vpcPeeringConnection:
       Type: AWS::EC2::VPCPeeringConnection
       Properties:
         VpcId: !Ref vpc
         PeerVpcId: !Ref PeerVPCId
         PeerOwnerId: !Ref PeerVPCAccountId
         PeerRoleArn: !Ref PeerRoleArn
   Outputs:
     VPCId:
       Value: !Ref vpc
     VPCPeeringConnectionId:
       Value: !Ref vpcPeeringConnection
   ```

1. Elija **Siguiente**.

1. Dé un nombre a la pila (por ejemplo, **VPC-peering-connection**).

1. Acepte los valores predeterminados y, a continuación, elija **Next** (Siguiente).

1. Elija **Confirmo que CloudFormation puede crear recursos de IAM** y, a continuación, elija **Crear pila**.

## Creación de una plantilla con una política muy restrictiva
<a name="create-template-with-highly-restrictive-policy"></a>

Es posible que le interese crear una política muy restrictiva para las interconexiones de la VPC con otra Cuenta de AWS. 

El siguiente ejemplo de plantilla muestra cómo cambiar la plantilla de propietario de mismo nivel de VPC (la *cuenta del aceptador* creada en el paso 1 anterior) para que sea más restrictiva.

**Example JSON**  

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Description":"Create a VPC and an assumable role for cross account VPC peering.",
  "Parameters":{
    "PeerRequesterAccountId":{
      "Type":"String"
    }
  },
  "Resources":{
    "peerRole":{
      "Type":"AWS::IAM::Role",
      "Properties":{
        "AssumeRolePolicyDocument":{
          "Statement":[
            {
              "Action":[
                "sts:AssumeRole"
              ],
              "Effect":"Allow",
              "Principal":{
                "AWS":{
                  "Ref":"PeerRequesterAccountId"
                }
              }
            }
          ]
        },
        "Path":"/",
        "Policies":[
          {
            "PolicyDocument":{
              "Statement":[
                {
                  "Action":"ec2:acceptVpcPeeringConnection",
                  "Effect":"Allow",
                  "Resource":{
                    "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}"
                  }
                },
                {
                  "Action":"ec2:acceptVpcPeeringConnection",
                  "Condition":{
                    "StringEquals":{
                      "ec2:AccepterVpc":{
                        "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}"
                      }
                    }
                  },
                  "Effect":"Allow",
                  "Resource":{
                    "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc-peering-connection/*"
                  }
                }
              ],
              "Version":"2012-10-17" 		 	 	 
            },
            "PolicyName":"root"
          }
        ]
      }
    },
    "vpc":{
      "Type":"AWS::EC2::VPC",
      "Properties":{
        "CidrBlock":"10.1.0.0/16",
        "EnableDnsHostnames":false,
        "EnableDnsSupport":false,
        "InstanceTenancy":"default"
      }
    }
  },
  "Outputs":{
    "RoleARN":{
      "Value":{
        "Fn::GetAtt":[
          "peerRole",
          "Arn"
        ]
      }
    },
    "VPCId":{
      "Value":{
        "Ref":"vpc"
      }
    }
  }
}
```

**Example YAML**  

```
AWSTemplateFormatVersion: 2010-09-09
Description: Create a VPC and an assumable role for cross account VPC peering.
Parameters:
  PeerRequesterAccountId:
    Type: String
Resources:
  peerRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - 'sts:AssumeRole'
            Effect: Allow
            Principal:
              AWS:
                Ref: PeerRequesterAccountId
      Path: /
      Policies:
        - PolicyDocument:
            Statement:
              - Action: 'ec2:acceptVpcPeeringConnection'
                Effect: Allow
                Resource:
                  'Fn::Sub': 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
              - Action: 'ec2:acceptVpcPeeringConnection'
                Condition:
                  StringEquals:
                    'ec2:AccepterVpc':
                      'Fn::Sub': 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
                Effect: Allow
                Resource:
                  'Fn::Sub': >-
                    arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc-peering-connection/*
            Version: 2012-10-17 		 	 	 
          PolicyName: root
  vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.1.0.0/16
      EnableDnsHostnames: false
      EnableDnsSupport: false
      InstanceTenancy: default
Outputs:
  RoleARN:
    Value:
      'Fn::GetAtt':
        - peerRole
        - Arn
  VPCId:
    Value:
      Ref: vpc
```

Para acceder a la VPC, puede utilizar la misma plantilla de solicitante como en el paso 2 anterior.

Para obtener más información, consulte [Administración de identidades y acceso para la interconexión de VPC](https://docs.aws.amazon.com/vpc/latest/peering/security-iam.html) en la *Guía de interconexión de VPC de Amazon*.

# Implementaciones azul/verde de ECS a través de CodeDeploy con CloudFormation
<a name="blue-green"></a>

Para actualizar una aplicación que se ejecuta en Amazon Elastic Container Service (Amazon ECS), puede usar una estrategia de implementación azul/verde de CodeDeploy. Esta estrategia minimiza las interrupciones causadas por los cambios en las versiones de las aplicaciones. 

En una implementación azul/verde, se crea un nuevo entorno de aplicaciones (denominado *verde*) junto con el entorno activo actual (denominado *azul*). Esto permite supervisar y probar el entorno verde antes de enrutar el tráfico en vivo del entorno azul al entorno verde. Una vez que el entorno verde dé servicio al tráfico en directo, puede terminar el entorno azul de forma segura.

Para realizar implementaciones azul/verde de CodeDeploy en ECS con CloudFormation, incluya la siguiente información en la plantilla de pila:
+ Una sección `Hooks` que describe un enlace `AWS::CodeDeploy::BlueGreen`.
+  Una sección `Transform` que especifica la transformación `AWS::CodeDeployBlueGreen`.

Los siguientes temas lo guían en la configuración de una plantilla de CloudFormation para una implementación azul/verde en ECS.

**Topics**
+ [Sobre las implementaciones azul/verde](about-blue-green-deployments.md)
+ [Consideraciones sobre la administración de implementaciones azul/verde de ECS a través de CloudFormation](blue-green-considerations.md)
+ [Sintaxis del enlace `AWS::CodeDeploy::BlueGreen`](blue-green-hook-syntax.md)
+ [Ejemplo de una plantilla de implementación azul/verde](blue-green-template-example.md)

# Sobre las implementaciones azul/verde
<a name="about-blue-green-deployments"></a>

En este tema, se ofrece una descripción general del funcionamiento de las implementaciones azul/verde con CloudFormation. También, se explica cómo preparar la plantilla de CloudFormation para las implementaciones azul/verde.

**Topics**
+ [Funcionamiento](#blue-green-how-it-works)
+ [Actualizaciones de recursos que inician implementaciones verdes](#blue-green-resources)
+ [Preparar la plantilla de](#blue-green-setup)
+ [Modelado de la implementación azul/verde](#blue-green-required)
+ [Conjuntos de cambios](#blue-green-changesets)
+ [Supervisión de los eventos de la pila](#blue-green-events)
+ [Permisos de IAM](#blue-green-iam)

## Funcionamiento
<a name="blue-green-how-it-works"></a>

Al usar CloudFormation para realizar implementaciones azul/verde de ECS a través de CodeDeploy, primero se crea una plantilla de pilas que define los recursos de los entornos de aplicaciones azul y verde, incluida la especificación de la configuración de enrutamiento y estabilización del tráfico que se va a utilizar. A continuación, debe crear una pila a partir de esa plantilla. De este modo, generará la aplicación azul (actual). CloudFormation solo crea los recursos azules durante la creación de la pila. Los recursos de las implementaciones «green» no se crean hasta que es necesario.

Posteriormente, si en una actualización futura de una pila se actualiza la definición de tarea o los recursos del conjunto de tareas de la aplicación azul, CloudFormation hará lo siguiente:
+ Generará todos los recursos necesarios para el entorno de aplicaciones de verde.
+ Desviará el tráfico en función de los parámetros de direccionamiento del tráfico especificados.
+ Eliminará los recursos de azul.

Si se produce un error en algún momento antes de que la implementación «green» se realice correctamente y finalice, CloudFormation devolverá la pila al estado que tenía antes de que se iniciara toda la implementación verde.

## Actualizaciones de recursos que inician implementaciones verdes
<a name="blue-green-resources"></a>

Al realizar una actualización de pila que actualiza una propiedad de recursos de ECS específicos, CloudFormation iniciará un proceso de implementación verde. Los recursos que inician este proceso son los siguientes:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html) 

Sin embargo, si las actualizaciones de estos recursos no implican cambios en las propiedades que deban reemplazarse, no se iniciará una implementación verde. Para obtener más información, consulte [Comprensión de los comportamientos de actualización de los recursos de la pila](using-cfn-updating-stacks-update-behaviors.md).

Es importante recordar que no se pueden combinar las actualizaciones de los recursos anteriores con las actualizaciones de otros recursos en la misma operación de actualización de pila. Si necesita actualizar los recursos de la lista y otros recursos de la misma pila, tiene dos opciones:
+ Lleve a cabo dos operaciones de actualización de pila diferentes: una que incluya solo las actualizaciones de los recursos anteriores y otra que incluya los cambios de los demás recursos.
+ Elimine las secciones `Transform` y `Hooks` de la plantilla y actualice después la pila. En este caso, CloudFormation no realizará una implementación verde.

## Preparación de la plantilla para realizar implementaciones azul/verde de ECS
<a name="blue-green-setup"></a>

Para habilitar implementaciones azul/verde en la pila, incluya las siguientes secciones en la plantilla de pila antes de realizar la actualización de la pila.
+ Agregue una referencia a la transformación `AWS::CodeDeployBlueGreen` en la plantilla:

  ```
  "Transform": [
    "AWS::CodeDeployBlueGreen"
  ],
  ```
+ Agregue una sección `Hooks` que invoque el enlace `AWS::CodeDeploy::BlueGreen` y especifique las propiedades de la implementación. Para obtener más información, consulte [Sintaxis del enlace `AWS::CodeDeploy::BlueGreen`](blue-green-hook-syntax.md).
+ En la sección `Resources`, defina los recursos azul/verde de la implementación.

Puede agregar estas secciones cuando cree por primera vez la plantilla (es decir, antes de crear la pila en sí) o agregarlas a una plantilla existente antes de actualizar la pila. Si especifica la implementación azul-verde para una nueva pila, CloudFormation solo generará los recursos azules durante la creación de la pila; los recursos para la implementación verde no se generarán hasta que lo requiera la actualización de la pila.

## Modelado de la implementación “blue/green” mediante recursos de CloudFormation
<a name="blue-green-required"></a>

Para realizar una implementación azul/verde de CodeDeploy en ECS, la plantilla de CloudFormation debe incluir los recursos que van a modelar la implementación, como un equilibrador de carga y un servicio de Amazon ECS. Para obtener más información sobre lo que representan estos recursos, consulte [Antes de empezar una implementación de Amazon ECS](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-steps-ecs.html#deployment-steps-prerequisites-ecs) en la *Guía del usuario de AWS CodeDeploy*.


| Requisito | Recurso | Obligatorio/opcional | ¿Se inicia una implementación azul/verde si se reemplaza? | 
| --- | --- | --- | --- | 
| Clúster de Amazon ECS | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html) | Opcional. Se puede utilizar el clúster predeterminado. | No | 
| Servicio de Amazon ECS | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html) | Obligatorio. | No | 
| Aplicación o balanceador de carga de red | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html) | Obligatorio. | No | 
| Agente de escucha de producción | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | Obligatorio. | No | 
| Agente de escucha de prueba  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | Opcional. | No | 
| Dos grupos de destino | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) | Obligatorio. | No | 
| Definición de tarea de Amazon ECS  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html) | Obligatorio. | Sí | 
| Contenedor de la aplicación de Amazon ECS | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name) | Obligatorio. | No | 
| Puerto del conjunto de tareas de sustitución | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport) | Obligatorio. | No | 

## Conjuntos de cambios
<a name="blue-green-changesets"></a>

Le recomendamos encarecidamente que cree un conjunto de cambios antes de realizar una actualización de la pila que inicie una implementación verde. Esto le permite ver los cambios reales que se harán en la pila antes de actualizarla. Tenga en cuenta que es posible que los cambios de recursos no aparezcan en el orden en que tendrán lugar. Para obtener más información, consulte [Actualización de pilas de CloudFormation con conjuntos de cambios](using-cfn-updating-stacks-changesets.md).

## Supervisión de los eventos de la pila
<a name="blue-green-events"></a>

Puede ver los eventos de la pila que se generan en cada paso de la implementación de ECS en la pestaña **Eventos** de la página **Pila** o mediante la AWS CLI. Para obtener más información, consulte [Monitorizar el progreso de la pila](monitor-stack-progress.md).

## Permisos de IAM para las implementaciones azul/verde
<a name="blue-green-iam"></a>

Para poder CloudFormation realizar correctamente las implementaciones azul/verde, debe tener los siguientes permisos de CodeDeploy:
+ `codedeploy:Get*`
+ `codedeploy:CreateCloudFormationDeployment`

Para obtener más información, consulte [Acciones, recursos y claves de condición para CodeDeploy](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awscodedeploy.html) en la *Referencia de autorizaciones de servicio*.

# Consideraciones sobre la administración de implementaciones azul/verde de ECS a través de CloudFormation
<a name="blue-green-considerations"></a>

El proceso de implementación azul/verde de ECS con CloudFormation a través CodeDeploy es diferente al de una implementación estándar de ECS solo con CodeDeploy. Para obtener información detallada sobre estas diferencias, consulte [Diferencias entre implementaciones azul/verde de Amazon ECS a través de CodeDeploy y de CloudFormation](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments-create-ecs-cfn.html#differences-ecs-bg-cfn) en la *Guía del usuario de AWS CodeDeploy*. 

Al administrar su implementación azul/verde con CloudFormation, hay ciertas limitaciones y consideraciones que debe tener en cuenta:
+ Solo las actualizaciones de determinados recursos iniciarán una implementación verde. Para obtener más información, consulte [Actualizaciones de recursos que inician implementaciones verdes](about-blue-green-deployments.md#blue-green-resources).
+ No puede incluir actualizaciones de recursos que inicien implementaciones verde y actualizaciones de otros recursos en la misma actualización de pila. Para obtener más información, consulte [Actualizaciones de recursos que inician implementaciones verdes](about-blue-green-deployments.md#blue-green-resources).
+ Solo puede especificar un único servicio de ECS como destino de implementación.
+ Los parámetros cuyos valores están enmascarados por CloudFormation no pueden actualizarse a través de CodeDeploy durante una implementación verde, ya que se produciría un error y la actualización de la pila no se realizaría correctamente. Entre ellos se incluyen:
  + Parámetros definidos con el atributo `NoEcho`.
  + Parámetros que utilizan referencias dinámicas para recuperar sus valores a partir de servicios externos. Para obtener más información sobre las referencias dinámicas, consulte [Obtención de valores almacenados en otros servicios con referencias dinámicas](dynamic-references.md).
+ Para cancelar una implementación verde que aún está en curso, cancele la actualización de pila en CloudFormation, no CodeDeploy o ECS. Para obtener más información, consulte [Cancelar una actualización de pila](using-cfn-stack-update-cancel.md). Una vez finalizada la actualización, no podrá cancelarla. No obstante, puede volver a actualizar una pila con una configuración anterior.
+ Las siguientes características de CloudFormation no son compatibles actualmente con plantillas que definen las implementaciones azul/verde de ECS:
  + Declaración de [salidas](outputs-section-structure.md) o uso de [Fn::ImportValue](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html) para importar valores de otras pilas.
  + Importación de recursos. Para obtener más información sobre la importación de recursos, consulte [Cómo importar recursos de AWS a una pila de CloudFormation](import-resources.md).
  + Uso del enlace `AWS::CodeDeploy::BlueGreen` en una plantilla que incluya recursos de pila anidados. Para obtener más información sobre las pilas anidadas, consulte [División de una plantilla en piezas reutilizables utilizando pilas anidadas](using-cfn-nested-stacks.md).
  + Uso del enlace `AWS::CodeDeploy::BlueGreen` en una pila anidada.

# Sintaxis del enlace `AWS::CodeDeploy::BlueGreen`
<a name="blue-green-hook-syntax"></a>

La siguiente sintaxis describe la estructura de un enlace `AWS::CodeDeploy::BlueGreen` para las implementaciones azul/verde de ECS.

## Sintaxis
<a name="cfn-blue-green-hook-syntax"></a>

```
"Hooks": {
  "Logical ID": {
    "Type": "AWS::CodeDeploy::BlueGreen",
    "Properties": {
      "TrafficRoutingConfig": {
        "Type": "Traffic routing type",
        "TimeBasedCanary": {
          "StepPercentage": Integer,
          "BakeTimeMins": Integer
        },
        "TimeBasedLinear": {
          "StepPercentage": Integer,
          "BakeTimeMins": Integer
        }
      },
      "AdditionalOptions": {"TerminationWaitTimeInMinutes": Integer},
      "LifecycleEventHooks": {
        "BeforeInstall": "FunctionName",
        "AfterInstall": "FunctionName",
        "AfterAllowTestTraffic": "FunctionName",
        "BeforeAllowTraffic": "FunctionName",
        "AfterAllowTraffic": "FunctionName"
      },
      "ServiceRole": "CodeDeployServiceRoleName",
      "Applications": [
        {
          "Target": {
            "Type": "AWS::ECS::Service",
            "LogicalID": "Logical ID of AWS::ECS::Service"
          },
          "ECSAttributes": {
            "TaskDefinitions": [
              "Logical ID of AWS::ECS::TaskDefinition (Blue)",
              "Logical ID of AWS::ECS::TaskDefinition (Green)"
            ],
            "TaskSets": [
              "Logical ID of AWS::ECS::TaskSet (Blue)",
              "Logical ID of AWS::ECS::TaskSet (Green)"
            ],
            "TrafficRouting": {
              "ProdTrafficRoute": {
                "Type": "AWS::ElasticLoadBalancingV2::Listener",
                "LogicalID": "Logical ID of AWS::ElasticLoadBalancingV2::Listener (Production)"
              },
              "TestTrafficRoute": {
                "Type": "AWS::ElasticLoadBalancingV2::Listener",
                "LogicalID": "Logical ID of AWS::ElasticLoadBalancingV2::Listener (Test)"
              },
              "TargetGroups": [
                "Logical ID of AWS::ElasticLoadBalancingV2::TargetGroup (Blue)",
                "Logical ID of AWS::ElasticLoadBalancingV2::TargetGroup (Green)"
              ]
            }
          }
        }
      ]
    }
  }
}
```

## Propiedades
<a name="cfn-blue-green-hook-properties"></a>

ID lógico (también denominado *nombre lógico*)  
El ID lógico de un enlace declarado en la sección `Hooks` de la plantilla. El ID lógico tiene que ser alfanumérico (A-Za-z0-9) y único dentro de la plantilla.  
*Obligatorio*: sí    
`Type`  
El tipo de enlace. `AWS::CodeDeploy::BlueGreen`  
*Obligatorio*: sí  
`Properties`  
Propiedades del enlace.  
*Obligatorio*: sí    
`TrafficRoutingConfig`  
Configuración del direccionamiento del tráfico.  
*Obligatorio*: no  
La configuración predeterminada desvía el tráfico de valor controlado en función del tiempo, con un porcentaje de pasos del 15 % y un tiempo de procesamiento de cinco minutos.    
`Type`  
Tipo de desvío de tráfico que se utiliza en la configuración de la implementación.  
Valores válidos: AllAtOnce \$1 TimeBasedCanary \$1 TimeBasedLinear  
*Obligatorio*: sí    
`TimeBasedCanary`  
Especifica una configuración que desvía el tráfico de una versión de la implementación a otra en dos incrementos.  
*Obligatorio*: condicional. Si especifica `TimeBasedCanary` como el tipo de enrutamiento de tráfico, debe incluir el parámetro `TimeBasedCanary`.    
`StepPercentage`  
Porcentaje del tráfico que se va a desviar en el primer incremento de una implementación `TimeBasedCanary`. El porcentaje de pasos debe ser igual o superior al 14 %.  
*Obligatorio*: no  
`BakeTimeMins`  
Número de minutos entre el primer y el segundo desvío de tráfico de una implementación `TimeBasedCanary`.  
*Obligatorio*: no  
`TimeBasedLinear`  
Especifica una configuración que desvía el tráfico de una versión de la implementación a otra en incrementos iguales, con el mismo número de minutos entre cada incremento.  
*Obligatorio*: condicional. Si especifica `TimeBasedLinear` como el tipo de enrutamiento de tráfico, debe incluir el parámetro `TimeBasedLinear`.    
`StepPercentage`  
Porcentaje de tráfico que se desvía al comienzo de cada incremento de una implementación `TimeBasedLinear`. El porcentaje de pasos debe ser igual o superior al 14 %.  
*Obligatorio*: no  
`BakeTimeMins`  
Número de minutos entre cada desvío del tráfico incremental en una implementación `TimeBasedLinear`.  
*Obligatorio*: no  
`AdditionalOptions`  
Otras opciones adicionales de la implementación «blue/green».  
*Obligatorio*: no    
`TerminationWaitTimeInMinutes`  
Especifica el tiempo de espera, en minutos, antes de finalizar los recursos de azul.  
*Obligatorio*: no  
`LifecycleEventHooks`  
Utilice los enlaces de eventos del ciclo de vida para especificar una función de Lambda a la que CodeDeploy puede llamar para validar una implementación. Puede utilizar la misma función u otra distinta para los eventos del ciclo de vida de la implementación. Cuando finalicen las pruebas de validación, la función de Lambda `AfterAllowTraffic` vuelve a llamar a CodeDeploy y devuelve como resultado `Succeeded` o `Failed`. Para obtener más información, consulte la[Sección “Enlaces” de AppSpec](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html) en la *Guía del usuario de AWS CodeDeploy*.  
*Obligatorio*: no    
`BeforeInstall`  
Función que se utiliza para ejecutar tareas antes de crear el conjunto de tareas de sustitución.  
*Obligatorio*: no  
`AfterInstall`  
Función que se utiliza para ejecutar tareas una vez que el conjunto de tareas se ha creado y uno de los grupos de destino se ha asociado con él.  
*Obligatorio*: no  
`AfterAllowTestTraffic`  
Función que se utiliza para ejecutar tareas después de que el agente de escucha de prueba envía tráfico al conjunto de tareas de sustitución.  
*Obligatorio*: no  
`BeforeAllowTraffic`  
Función que se utiliza para ejecutar tareas una vez que el segundo grupo de destino se ha asociado con el conjunto de tareas de sustitución, pero antes de que se envíe tráfico al conjunto de tareas de sustitución.  
*Obligatorio*: no  
`AfterAllowTraffic`  
Función que se utiliza para ejecutar tareas después de que el segundo grupo de destino envíe tráfico al conjunto de tareas de sustitución.  
*Obligatorio*: no  
`ServiceRole`  
Rol de ejecución que se utiliza en CloudFormation para realizar implementaciones azul/verde. Para obtener una lista de los permisos necesarios, consulte [Permisos de IAM para las implementaciones azul/verde](about-blue-green-deployments.md#blue-green-iam).  
*Obligatorio*: no  
`Applications`  
Especifica las propiedades de la aplicación Amazon ECS.  
*Obligatorio*: sí    
`Target`  
  
*Obligatorio*: sí    
`Type`  
El tipo de recurso.  
*Obligatorio*: sí  
`LogicalID`  
ID lógico del recurso.  
*Obligatorio*: sí  
`ECSAttributes`  
Recursos que representan los diferentes requisitos de la implementación de la aplicación Amazon ECS.  
*Obligatorio*: sí    
`TaskDefinitions`  
ID lógico del recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html) que va a ejecutar el contenedor Docker que contiene la aplicación Amazon ECS.  
*Obligatorio*: sí  
`TaskSets`  
Identificadores lógicos de los recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html) que se van a utilizar como conjuntos de tareas en la aplicación.  
*Obligatorio*: sí  
`TrafficRouting`  
Especifica los recursos que se utilizan para el direccionamiento del tráfico.  
*Obligatorio*: sí    
`ProdTrafficRoute`  
Agente de escucha que se va a utilizar en el balanceador de carga para dirigir el tráfico hacia los grupos de destino.  
*Obligatorio*: sí    
`Type`  
El tipo del recurso. `AWS::ElasticLoadBalancingV2::Listener`  
*Obligatorio*: sí  
`LogicalID`  
ID lógico del recurso.  
*Obligatorio*: sí  
`TestTrafficRoute`  
Agente de escucha que se va a utilizar en el balanceador de carga para dirigir el tráfico hacia los grupos de destino.  
*Obligatorio*: sí    
`Type`  
El tipo del recurso. `AWS::ElasticLoadBalancingV2::Listener`  
*Obligatorio*: sí  
`LogicalID`  
ID lógico del recurso.  
*Obligatorio*: no  
`TargetGroups`  
ID lógico de los recursos que se van a utilizar como grupos de destino para dirigir el tráfico al destino registrado.  
*Obligatorio*: sí

# Ejemplo de una plantilla de implementación azul/verde
<a name="blue-green-template-example"></a>

En la siguiente plantilla de ejemplo, se configura una implementación azul/verde de CodeDeploy en ECS, con un progreso de direccionamiento del tráfico del 15 % en cada paso y un periodo de estabilización de 5 minutos entre cada paso. 

Si se crea una pila con la plantilla, se aprovisionará la configuración inicial de la implementación. Si después se hace algún cambio en las propiedades del recurso `BlueTaskSet` que requiera que este se reemplace, CloudFormation iniciará una implementación verde como parte de la actualización de la pila.

## JSON
<a name="blue-green-template-example.json"></a>

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Parameters":{
    "Vpc":{ "Type":"AWS::EC2::VPC::Id" },
    "Subnet1":{ "Type":"AWS::EC2::Subnet::Id" },
    "Subnet2":{ "Type":"AWS::EC2::Subnet::Id" }
  },
  "Transform":[ "AWS::CodeDeployBlueGreen" ],
  "Hooks":{
    "CodeDeployBlueGreenHook":{
      "Type":"AWS::CodeDeploy::BlueGreen",
      "Properties":{
        "TrafficRoutingConfig":{
          "Type":"TimeBasedCanary",
          "TimeBasedCanary":{
            "StepPercentage":15,
            "BakeTimeMins":5
          }
        },
        "Applications":[
          {
            "Target":{
              "Type":"AWS::ECS::Service",
              "LogicalID":"ECSDemoService"
            },
            "ECSAttributes":{
              "TaskDefinitions":[ "BlueTaskDefinition","GreenTaskDefinition" ],
              "TaskSets":[ "BlueTaskSet","GreenTaskSet" ],
              "TrafficRouting":{
                "ProdTrafficRoute":{
                  "Type":"AWS::ElasticLoadBalancingV2::Listener",
                  "LogicalID":"ALBListenerProdTraffic"
                },
                "TargetGroups":[ "ALBTargetGroupBlue","ALBTargetGroupGreen" ]
              }
            }
          }
        ]
      }
    }
  },
  "Resources":{
    "ExampleSecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"Security group for ec2 access",
        "VpcId":{ "Ref":"Vpc" },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "CidrIp":"0.0.0.0/0"
          },
          {
            "IpProtocol":"tcp",
            "FromPort":8080,
            "ToPort":8080,
            "CidrIp":"0.0.0.0/0"
          },
          {
            "IpProtocol":"tcp",
            "FromPort":22,
            "ToPort":22,
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
    },
    "ALBTargetGroupBlue":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":5,
        "HealthCheckPath":"/",
        "HealthCheckPort":"80",
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":2,
        "HealthyThresholdCount":2,
        "Matcher":{ "HttpCode":"200" },
        "Port":80,
        "Protocol":"HTTP",
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "TargetType":"ip",
        "UnhealthyThresholdCount":4,
        "VpcId":{ "Ref":"Vpc" }
      }
    },
    "ALBTargetGroupGreen":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":5,
        "HealthCheckPath":"/",
        "HealthCheckPort":"80",
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":2,
        "HealthyThresholdCount":2,
        "Matcher":{ "HttpCode":"200" },
        "Port":80,
        "Protocol":"HTTP",
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "TargetType":"ip",
        "UnhealthyThresholdCount":4,
        "VpcId":{ "Ref":"Vpc" }
      }
    },
    "ExampleALB":{
      "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties":{
        "Scheme":"internet-facing",
        "SecurityGroups":[{ "Ref":"ExampleSecurityGroup" }],
        "Subnets":[{ "Ref":"Subnet1" },{ "Ref":"Subnet2" }],
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "Type":"application",
        "IpAddressType":"ipv4"
      }
    },
    "ALBListenerProdTraffic":{
      "Type":"AWS::ElasticLoadBalancingV2::Listener",
      "Properties":{
        "DefaultActions":[
          {
            "Type":"forward",
            "ForwardConfig":{
              "TargetGroups":[
                {
                  "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" },
                  "Weight":1
                }
              ]
            }
          }
        ],
        "LoadBalancerArn":{ "Ref":"ExampleALB" },
        "Port":80,
        "Protocol":"HTTP"
      }
    },
    "ALBListenerProdRule":{
      "Type":"AWS::ElasticLoadBalancingV2::ListenerRule",
      "Properties":{
        "Actions":[
          {
            "Type":"forward",
            "ForwardConfig":{
              "TargetGroups":[
                {
                  "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" },
                  "Weight":1
                }
              ]
            }
          }
        ],
        "Conditions":[
          {
            "Field":"http-header",
            "HttpHeaderConfig":{
              "HttpHeaderName":"User-Agent",
              "Values":[ "Mozilla" ]
            }
          }
        ],
        "ListenerArn":{ "Ref":"ALBListenerProdTraffic" },
        "Priority":1
      }
    },
    "ECSTaskExecutionRole":{
      "Type":"AWS::IAM::Role",
      "Properties":{
        "AssumeRolePolicyDocument":{
          "Version": "2012-10-17",		 	 	 
          "Statement":[
            {
              "Sid":"",
              "Effect":"Allow",
              "Principal":{
                "Service":"ecs-tasks.amazonaws.com"
              },
              "Action":"sts:AssumeRole"
            }
          ]
        },
        "ManagedPolicyArns":[ "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" ]
      }
    },
    "BlueTaskDefinition":{
      "Type":"AWS::ECS::TaskDefinition",
      "Properties":{
        "ExecutionRoleArn":{
          "Fn::GetAtt":[ "ECSTaskExecutionRole","Arn" ]
        },
        "ContainerDefinitions":[
          {
            "Name":"DemoApp",
            "Image":"nginxdemos/hello:latest",
            "Essential":true,
            "PortMappings":[
              {
                "HostPort":80,
                "Protocol":"tcp",
                "ContainerPort":80
              }
            ]
          }
        ],
        "RequiresCompatibilities":[ "FARGATE" ],
        "NetworkMode":"awsvpc",
        "Cpu":"256",
        "Memory":"512",
        "Family":"ecs-demo"
      }
    },
    "ECSDemoCluster":{
      "Type":"AWS::ECS::Cluster",
      "Properties":{}
    },
    "ECSDemoService":{
      "Type":"AWS::ECS::Service",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "DesiredCount":1,
        "DeploymentController":{ "Type":"EXTERNAL" }
      }
    },
    "BlueTaskSet":{
      "Type":"AWS::ECS::TaskSet",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "LaunchType":"FARGATE",
        "NetworkConfiguration":{
          "AwsVpcConfiguration":{
            "AssignPublicIp":"ENABLED",
            "SecurityGroups":[{ "Ref":"ExampleSecurityGroup" }],
            "Subnets":[{ "Ref":"Subnet1" },{ "Ref":"Subnet2" }]
          }
        },
        "PlatformVersion":"1.4.0",
        "Scale":{
          "Unit":"PERCENT",
          "Value":100
        },
        "Service":{ "Ref":"ECSDemoService"},
        "TaskDefinition":{ "Ref":"BlueTaskDefinition" },
        "LoadBalancers":[
          {
            "ContainerName":"DemoApp",
            "ContainerPort":80,
            "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" }
          }
        ]
      }
    },
    "PrimaryTaskSet":{
      "Type":"AWS::ECS::PrimaryTaskSet",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "Service":{ "Ref":"ECSDemoService" },
        "TaskSetId":{ "Fn::GetAtt":[ "BlueTaskSet","Id" ]
        }
      }
    }
  }
}
```

## YAML
<a name="blue-green-template-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  Vpc:
    Type: AWS::EC2::VPC::Id
  Subnet1:
    Type: AWS::EC2::Subnet::Id
  Subnet2:
    Type: AWS::EC2::Subnet::Id
Transform:
  - 'AWS::CodeDeployBlueGreen'
Hooks:
  CodeDeployBlueGreenHook:
    Type: AWS::CodeDeploy::BlueGreen
    Properties:
      TrafficRoutingConfig:
        Type: TimeBasedCanary
        TimeBasedCanary:
          StepPercentage: 15
          BakeTimeMins: 5
      Applications:
        - Target:
            Type: AWS::ECS::Service
            LogicalID: ECSDemoService
          ECSAttributes:
            TaskDefinitions:
              - BlueTaskDefinition
              - GreenTaskDefinition
            TaskSets:
              - BlueTaskSet
              - GreenTaskSet
            TrafficRouting:
              ProdTrafficRoute:
                Type: AWS::ElasticLoadBalancingV2::Listener
                LogicalID: ALBListenerProdTraffic
              TargetGroups:
                - ALBTargetGroupBlue
                - ALBTargetGroupGreen
Resources:
  ExampleSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for ec2 access
      VpcId: !Ref Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 8080
          ToPort: 8080
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  ALBTargetGroupBlue:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 5
      HealthCheckPath: /
      HealthCheckPort: '80'
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 2
      HealthyThresholdCount: 2
      Matcher:
        HttpCode: '200'
      Port: 80
      Protocol: HTTP
      Tags:
        - Key: Group
          Value: Example
      TargetType: ip
      UnhealthyThresholdCount: 4
      VpcId: !Ref Vpc
  ALBTargetGroupGreen:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 5
      HealthCheckPath: /
      HealthCheckPort: '80'
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 2
      HealthyThresholdCount: 2
      Matcher:
        HttpCode: '200'
      Port: 80
      Protocol: HTTP
      Tags:
        - Key: Group
          Value: Example
      TargetType: ip
      UnhealthyThresholdCount: 4
      VpcId: !Ref Vpc
  ExampleALB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      SecurityGroups:
        - !Ref ExampleSecurityGroup
      Subnets:
        - !Ref Subnet1
        - !Ref Subnet2
      Tags:
        - Key: Group
          Value: Example
      Type: application
      IpAddressType: ipv4
  ALBListenerProdTraffic:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ALBTargetGroupBlue
                Weight: 1
      LoadBalancerArn: !Ref ExampleALB
      Port: 80
      Protocol: HTTP
  ALBListenerProdRule:
    Type: AWS::ElasticLoadBalancingV2::ListenerRule
    Properties:
      Actions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ALBTargetGroupBlue
                Weight: 1
      Conditions:
        - Field: http-header
          HttpHeaderConfig:
            HttpHeaderName: User-Agent
            Values:
              - Mozilla
      ListenerArn: !Ref ALBListenerProdTraffic
      Priority: 1
  ECSTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: ''
            Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'
  BlueTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ExecutionRoleArn: !GetAtt 
        - ECSTaskExecutionRole
        - Arn
      ContainerDefinitions:
        - Name: DemoApp
          Image: 'nginxdemos/hello:latest'
          Essential: true
          PortMappings:
            - HostPort: 80
              Protocol: tcp
              ContainerPort: 80
      RequiresCompatibilities:
        - FARGATE
      NetworkMode: awsvpc
      Cpu: '256'
      Memory: '512'
      Family: ecs-demo
  ECSDemoCluster:
    Type: AWS::ECS::Cluster
    Properties: {}
  ECSDemoService:
    Type: AWS::ECS::Service
    Properties:
      Cluster: !Ref ECSDemoCluster
      DesiredCount: 1
      DeploymentController:
        Type: EXTERNAL
  BlueTaskSet:
    Type: AWS::ECS::TaskSet
    Properties:
      Cluster: !Ref ECSDemoCluster
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsVpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - !Ref ExampleSecurityGroup
          Subnets:
            - !Ref Subnet1
            - !Ref Subnet2
      PlatformVersion: 1.4.0
      Scale:
        Unit: PERCENT
        Value: 100
      Service: !Ref ECSDemoService
      TaskDefinition: !Ref BlueTaskDefinition
      LoadBalancers:
        - ContainerName: DemoApp
          ContainerPort: 80
          TargetGroupArn: !Ref ALBTargetGroupBlue
  PrimaryTaskSet:
    Type: AWS::ECS::PrimaryTaskSet
    Properties:
      Cluster: !Ref ECSDemoCluster
      Service: !Ref ECSDemoService
      TaskSetId: !GetAtt 
        - BlueTaskSet
        - Id
```

# Fragmentos de plantillas de CloudFormation
<a name="template-snippets"></a>

Esta sección proporciona una serie de situaciones de ejemplo que puede utilizar para comprender cómo declarar diferentes partes de la plantilla de CloudFormation. También puede utilizar los fragmentos de código como punto de partida para las secciones de sus plantillas personalizadas.

**Topics**
+ [Fragmentos de código de plantillas generales](quickref-general.md)
+ [Fragmentos de código de plantillas de CloudFormation de escalado automático](quickref-autoscaling.md)
+ [Fragmentos de plantillas de la consola de facturación de AWS](quickref-billingconductor.md)
+ [CloudFormationFragmentos de plantillas de](quickref-cloudformation.md)
+ [Fragmentos de código de plantillas de Amazon CloudFront](quickref-cloudfront.md)
+ [Fragmentos de código de plantillas de Amazon CloudWatch](quickref-cloudwatch.md)
+ [Fragmentos de la plantilla de Amazon CloudWatch Logs](quickref-cloudwatchlogs.md)
+ [Fragmentos de plantillas de Amazon DynamoDB](quickref-dynamodb.md)
+ [Fragmentos de plantillas de Amazon EC2 CloudFormation](quickref-ec2.md)
+ [Ejemplos de plantillas de Amazon Elastic Container Service](quickref-ecs.md)
+ [Plantilla de ejemplo de Amazon Elastic File System](quickref-efs.md)
+ [Fragmentos de código de plantillas de Elastic Beanstalk](quickref-elasticbeanstalk.md)
+ [Fragmentos de plantillas de Elastic Load Balancing](quickref-elb.md)
+ [AWS Identity and Access ManagementFragmentos de plantillas de](quickref-iam.md)
+ [AWS LambdaPlantilla de](quickref-lambda.md)
+ [Fragmentos de plantillas de Amazon Redshift](quickref-redshift.md)
+ [Fragmentos de las plantillas de Amazon RDS](quickref-rds.md)
+ [Fragmentos de plantilla de Route 53](quickref-route53.md)
+ [Fragmentos de código de plantillas de Amazon S3](quickref-s3.md)
+ [Fragmentos de plantillas de Amazon SNS](quickref-sns.md)
+ [Fragmentos de código de plantillas de Amazon SQS](scenario-sqs-queue.md)
+ [Fragmentos de plantilla de Amazon Timestream](scenario-timestream-queue.md)

# Fragmentos de código de plantillas generales
<a name="quickref-general"></a>

Los siguientes ejemplos muestran diferentes características de plantilla de CloudFormation que no son específicas de un servicio de AWS.

**Topics**
+ [Propiedad UserData codificada en Base64](#scenario-userdata-base64)
+ [Propiedad UserData codificada en Base64 con AccessKey y SecretKey](#scenario-userdata-base64-with-keys)
+ [Sección Parameters con un parámetro de cadena literal](#scenario-one-string-parameter)
+ [Sección Parameters con parámetro de cadena con limitación de expresiones regulares](#scenario-constraint-string-parameter)
+ [Sección Parameters con parámetro numérico con restricciones MinValue y MaxValue](#scenario-one-number-min-parameter)
+ [Sección Parameters con parámetro numérico con restricción AllowedValues](#scenario-one-number-parameter)
+ [Sección Parameters con un parámetro CommaDelimitedList literal](#scenario-one-list-parameter)
+ [Sección Parameters con valor de parámetros basado en pseudoparámetro](#scenario-one-pseudo-parameter)
+ [Sección Mapping con tres asignaciones](#scenario-mapping-with-four-maps)
+ [Description basada en cadena literal](#scenario-description-from-literal-string)
+ [Sección Outputs con una salida de cadena literal](#scenario-output-with-literal-string)
+ [Sección Outputs con una referencia de recursos y una salida de pseudoreferencia](#scenario-output-with-ref-and-pseudo-ref)
+ [Sección Outputs con una salida basada en una función, una cadena literal, una referencia y un pseudoparámetro](#scenario-output-with-complex-spec)
+ [Versión de formato de plantilla](#scenario-format-version)
+ [Propiedad Tags de AWS](#scenario-format-aws-tag)

## Propiedad UserData codificada en Base64
<a name="scenario-userdata-base64"></a>

Este ejemplo muestra el conjunto de una propiedad `UserData` que utiliza las funciones `Fn::Base64` y `Fn::Join`. Las referencias `MyValue` y `MyName` son parámetros que deben definirse en la sección `Parameters` de la plantilla. La cadena literal `Hello World` es simplemente otro valor que este ejemplo introduce como parte de los `UserData`.

### JSON
<a name="quickref-general-example-1.json"></a>

```
1. "UserData" : {
2.     "Fn::Base64" : {
3.         "Fn::Join" : [ ",", [
4.             { "Ref" : "MyValue" },
5.             { "Ref" : "MyName" },
6.             "Hello World" ] ]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-1.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      Ref: MyValue
4.      Ref: MyName
5.      Hello World
```

## Propiedad UserData codificada en Base64 con AccessKey y SecretKey
<a name="scenario-userdata-base64-with-keys"></a>

Este ejemplo muestra el conjunto de una propiedad `UserData` que utiliza las funciones `Fn::Base64` y `Fn::Join`. Incluye la información `AccessKey` y `SecretKey`. Las referencias `AccessKey` y `SecretKey` son parámetros que deben definirse en la sección Parameters de la plantilla.

### JSON
<a name="quickref-general-example-2.json"></a>

```
1. "UserData" : {
2.     "Fn::Base64" : {
3.         "Fn::Join" : [ "", [
4.             "ACCESS_KEY=", { "Ref" : "AccessKey" },
5.             "SECRET_KEY=", { "Ref" : "SecretKey" } ]
6.         ]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-2.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      ACCESS_KEY=${AccessKey}
4.      SECRET_KEY=${SecretKey}
```

## Sección Parameters con un parámetro de cadena literal
<a name="scenario-one-string-parameter"></a>

El siguiente ejemplo muestra una declaración de la sección Parameters (Parámetros) válida en la que se declara un parámetro de tipo `String` individual.

### JSON
<a name="quickref-general-example-3.json"></a>

```
1. "Parameters" : {
2.     "UserName" : {
3.         "Type" : "String",
4.         "Default" : "nonadmin",
5.         "Description" : "Assume a vanilla user if no command-line spec provided"
6.     }
7. }
```

### YAML
<a name="quickref-general-example-3.yaml"></a>

```
1. Parameters:
2.   UserName:
3.     Type: String
4.     Default: nonadmin
5.     Description: Assume a vanilla user if no command-line spec provided
```

## Sección Parameters con parámetro de cadena con limitación de expresiones regulares
<a name="scenario-constraint-string-parameter"></a>

El siguiente ejemplo muestra una declaración de la sección Parameters (Parámetros) válida en la que se declara un parámetro de tipo `String` individual. El parámetro `AdminUserAccount` tiene el valor predeterminado de `admin`. El valor del parámetro debe tener una longitud mínima de 1, una longitud máxima de 16 y contener caracteres alfabéticos y números, pero debe comenzar por un carácter alfabético.

### JSON
<a name="quickref-general-example-4.json"></a>

```
 1. "Parameters" : {
 2.     "AdminUserAccount": {
 3.       "Default": "admin",
 4.       "NoEcho": "true",
 5.       "Description" : "The admin account user name",
 6.       "Type": "String",
 7.       "MinLength": "1",
 8.       "MaxLength": "16",
 9.       "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*"
10.     }
11. }
```

### YAML
<a name="quickref-general-example-4.yaml"></a>

```
1. Parameters:
2.   AdminUserAccount:
3.     Default: admin
4.     NoEcho: true
5.     Description: The admin account user name
6.     Type: String
7.     MinLength: 1
8.     MaxLength: 16
9.     AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
```

## Sección Parameters con parámetro numérico con restricciones MinValue y MaxValue
<a name="scenario-one-number-min-parameter"></a>

El siguiente ejemplo muestra una declaración de la sección Parameters (Parámetros) válida en la que se declara un parámetro de tipo `Number` individual. El parámetro `WebServerPort` tiene un valor predeterminado de 80, un valor mínimo de 1 y un valor máximo de 65535.

### JSON
<a name="quickref-general-example-5.json"></a>

```
1. "Parameters" : {
2.     "WebServerPort": {
3.       "Default": "80",
4.       "Description" : "TCP/IP port for the web server",
5.       "Type": "Number",
6.       "MinValue": "1",
7.       "MaxValue": "65535"
8.     }
9. }
```

### YAML
<a name="quickref-general-example-5.yaml"></a>

```
1. Parameters:
2.   WebServerPort:
3.     Default: 80
4.     Description: TCP/IP port for the web server
5.     Type: Number
6.     MinValue: 1
7.     MaxValue: 65535
```

## Sección Parameters con parámetro numérico con restricción AllowedValues
<a name="scenario-one-number-parameter"></a>

El siguiente ejemplo muestra una declaración de la sección Parameters (Parámetros) válida en la que se declara un parámetro de tipo `Number` individual. El parámetro `WebServerPort` tiene un valor predeterminado de 80 y solo permite valores de 80 y 8888.

### JSON
<a name="quickref-general-example-6.json"></a>

```
1. "Parameters" : {
2.     "WebServerPortLimited": {
3.       "Default": "80",
4.       "Description" : "TCP/IP port for the web server",
5.       "Type": "Number",
6.       "AllowedValues" : ["80", "8888"]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-6.yaml"></a>

```
1. Parameters:
2.   WebServerPortLimited:
3.     Default: 80
4.     Description: TCP/IP port for the web server
5.     Type: Number
6.     AllowedValues:
7.     - 80
8.     - 8888
```

## Sección Parameters con un parámetro CommaDelimitedList literal
<a name="scenario-one-list-parameter"></a>

El siguiente ejemplo muestra una declaración de la sección `Parameters` válida en la que se declara un parámetro de tipo `CommaDelimitedList` individual. La propiedad `NoEcho` se establece en `TRUE`, lo que enmascara su valor con asteriscos (\$1\$1\$1\$1\$1) en la salida **describe-stacks**, excepto para la información almacenada en las ubicaciones especificadas a continuación.

**importante**  
El uso del atributo `NoEcho` no enmascara ninguna información almacenada en lo que se muestra a continuación:  
La sección de la plantilla `Metadata`. CloudFormation no transforma, modifica ni redacta ninguna información que incluya en la sección `Metadata`. Para obtener más información, consulte [Metadata](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
La sección de la plantilla `Outputs`. Para obtener más información, consulte [Salidas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
El atributo `Metadata` de una definición de recurso. Para obtener más información, consulte [`Metadata` atributo](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Recomendamos encarecidamente que no utilice estos mecanismos para incluir información confidencial, como contraseñas o secretos.

**importante**  
En lugar de integrar información confidencial directamente en las plantillas de CloudFormation, se recomienda utilizar parámetros dinámicos en la plantilla de la pila para hacer referencia a la información confidencial almacenada y administrada fuera de CloudFormation, como en AWS Systems Manager Parameter Store o AWS Secrets Manager.  
Para obtener más información, consulte la práctica recomendada [No integre credenciales en sus plantillas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).

### JSON
<a name="quickref-general-example-7.json"></a>

```
1. "Parameters" : {
2.     "UserRoles" : {
3.         "Type" : "CommaDelimitedList",
4.         "Default" : "guest,newhire",
5.         "NoEcho" : "TRUE"
6.     }
7. }
```

### YAML
<a name="quickref-general-example-7.yaml"></a>

```
1. Parameters:
2.   UserRoles:
3.     Type: CommaDelimitedList
4.     Default: "guest,newhire"
5.     NoEcho: true
```

## Sección Parameters con valor de parámetros basado en pseudoparámetro
<a name="scenario-one-pseudo-parameter"></a>

El siguiente ejemplo muestra comandos en los datos de usuario de EC2 que utilizan los pseudoparámetros `AWS::StackName` y `AWS::Region`. Para obtener más información sobre pseudoparámetros, consulte . [Obtención de valores de AWS mediante pseudoparámetros](pseudo-parameter-reference.md).

### JSON
<a name="quickref-general-example-10.json"></a>

```
 1.           "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
 2.              "#!/bin/bash -xe\n",
 3.              "yum install -y aws-cfn-bootstrap\n",
 4. 
 5.              "/opt/aws/bin/cfn-init -v ",
 6.              "         --stack ", { "Ref" : "AWS::StackName" },
 7.              "         --resource LaunchConfig ",
 8.              "         --region ", { "Ref" : "AWS::Region" }, "\n",
 9. 
10.              "/opt/aws/bin/cfn-signal -e $? ",
11.              "         --stack ", { "Ref" : "AWS::StackName" },
12.              "         --resource WebServerGroup ",
13.              "         --region ", { "Ref" : "AWS::Region" }, "\n"
14.         ]]}}
15.       }
```

### YAML
<a name="quickref-general-example-10.yaml"></a>

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

## Sección Mapping con tres asignaciones
<a name="scenario-mapping-with-four-maps"></a>

El siguiente ejemplo muestra una declaración de sección `Mapping` válida que contiene tres asignaciones. La asignación, cuando coincide con una clave de mapeo de `Stop`, `SlowDown` o `Go`, proporciona los valores RGB asignados al atributo `RGBColor` correspondiente.

### JSON
<a name="quickref-general-example-11.json"></a>

```
 1. "Mappings" : {
 2.     "LightColor" : {
 3.         "Stop" : {
 4.             "Description" : "red",
 5.             "RGBColor" : "RED 255 GREEN 0 BLUE 0"
 6.         },
 7.         "SlowDown" : {
 8.             "Description" : "yellow",
 9.             "RGBColor" : "RED 255 GREEN 255 BLUE 0"
10.         },
11.         "Go" : {
12.             "Description" : "green",
13.             "RGBColor" : "RED 0 GREEN 128 BLUE 0"
14.         }
15.     }
16. }
```

### YAML
<a name="quickref-general-example-11.yaml"></a>

```
 1. Mappings:
 2.   LightColor:
 3.     Stop:
 4.       Description: red
 5.       RGBColor: "RED 255 GREEN 0 BLUE 0"
 6.     SlowDown:
 7.       Description: yellow
 8.       RGBColor: "RED 255 GREEN 255 BLUE 0"
 9.     Go:
10.       Description: green
11.       RGBColor: "RED 0 GREEN 128 BLUE 0"
```

## Description basada en cadena literal
<a name="scenario-description-from-literal-string"></a>

El siguiente ejemplo muestra una declaración de sección `Description` válida donde el valor se basa en una cadena literal. Este fragmento de código puede ser para plantillas, parámetros, recursos, propiedades o salidas.

### JSON
<a name="quickref-general-example-8.json"></a>

```
1. "Description" : "Replace this value"
```

### YAML
<a name="quickref-general-example-8.yaml"></a>

```
1. Description: "Replace this value"
```

## Sección Outputs con una salida de cadena literal
<a name="scenario-output-with-literal-string"></a>

Este ejemplo muestra una asignación de salida basada en una cadena literal.

### JSON
<a name="quickref-general-example-12.json"></a>

```
1. "Outputs" : {
2.     "MyPhone" : {
3.         "Value" : "Please call 555-5555",
4.         "Description" : "A random message for aws cloudformation describe-stacks"
5.     }
6. }
```

### YAML
<a name="quickref-general-example-12.yaml"></a>

```
1. Outputs:
2.   MyPhone:
3.     Value: Please call 555-5555
4.     Description: A random message for aws cloudformation describe-stacks
```

## Sección Outputs con una referencia de recursos y una salida de pseudoreferencia
<a name="scenario-output-with-ref-and-pseudo-ref"></a>

Este ejemplo muestra una sección `Outputs` con dos asignaciones de salida. Una se basa en un recurso y la otra se basa en una pseudoreferencia.

### JSON
<a name="quickref-general-example-13.json"></a>

```
1. "Outputs" : {
2.    "SNSTopic" : { "Value" : { "Ref" : "MyNotificationTopic" } },
3.    "StackName" : { "Value" : { "Ref" : "AWS::StackName" } }
4. }
```

### YAML
<a name="quickref-general-example-13.yaml"></a>

```
1. Outputs:
2.   SNSTopic:
3.     Value: !Ref MyNotificationTopic
4.   StackName:
5.     Value: !Ref AWS::StackName
```

## Sección Outputs con una salida basada en una función, una cadena literal, una referencia y un pseudoparámetro
<a name="scenario-output-with-complex-spec"></a>

Este ejemplo muestra una sección Outputs con una asignación de salida. La función Join se utiliza para concatenar el valor con un signo de porcentaje como delimitador.

### JSON
<a name="quickref-general-example-14.json"></a>

```
1. "Outputs" : {
2.     "MyOutput" : {
3.         "Value" : { "Fn::Join" :
4.             [ "%", [ "A-string", {"Ref" : "AWS::StackName" } ] ]
5.         }
6.     }
7. }
```

### YAML
<a name="quickref-general-example-14.yaml"></a>

```
1. Outputs:
2.   MyOutput:
3.     Value: !Join [ %, [ 'A-string', !Ref 'AWS::StackName' ]]
```

## Versión de formato de plantilla
<a name="scenario-format-version"></a>

El siguiente fragmento de código muestra una declaración válida de sección `AWSTemplateFormatVersion`.

### JSON
<a name="quickref-general-example-9.json"></a>

```
1. "AWSTemplateFormatVersion" : "2010-09-09"
```

### YAML
<a name="quickref-general-example-9.yaml"></a>

```
1. AWSTemplateFormatVersion: '2010-09-09'
```

## Propiedad Tags de AWS
<a name="scenario-format-aws-tag"></a>

En este ejemplo se muestra una propiedad `Tags` de AWS. Esta propiedad se especifica dentro de la sección Properties de un recurso. Cuando se crea el recurso, se etiqueta con las etiquetas que usted declare.

### JSON
<a name="quickref-general-example-15.json"></a>

```
 1. "Tags" : [
 2.       {
 3.         "Key" : "keyname1",
 4.         "Value" : "value1"
 5.       },
 6.       {
 7.         "Key" : "keyname2",
 8.         "Value" : "value2"
 9.       }
10.     ]
```

### YAML
<a name="quickref-general-example-15.yaml"></a>

```
1. Tags: 
2.   - 
3.     Key: "keyname1"
4.     Value: "value1"
5.   - 
6.     Key: "keyname2"
7.     Value: "value2"
```

# Fragmentos de código de plantillas de CloudFormation de escalado automático
<a name="quickref-autoscaling"></a>

Amazon EC2 Auto Scaling le permite escalar de manera automática instancias de Amazon EC2, ya sea con políticas de escalado o con políticas programadas de escalado. Los grupos de escalado automático son colecciones de instancias de Amazon EC2 que habilitan el escalado automático y las características de administración de flotas, como las políticas de escalado, las acciones programadas, las comprobaciones de estado, los enlaces de ciclo de vida y el equilibrio de cargas. 

Application Auto Scaling proporciona escalado automático de distintos recursos más allá de Amazon EC2, ya sea con políticas de escalado o con escalado programado.

Puede crear y configurar grupos de escalado automático, políticas de escalado, acciones programadas y otros recursos de escalado automático como parte de su infraestructura mediante plantillas CloudFormation. Las plantillas facilitan la administración y la automatización de la implementación de los recursos de escalado automático de forma repetible y coherente. 

Los siguientes fragmentos de plantilla de ejemplo describen los recursos o componentes de CloudFormation para Amazon EC2 Auto Scaling y el escalado automático de aplicaciones. Estos fragmentos están diseñados para integrarse en una plantilla y no están pensados para ejecutarse de forma independiente.

**Topics**
+ [Configuración de los recursos de Amazon EC2 Auto Scaling](quickref-ec2-auto-scaling.md)
+ [Configuración de recursos de escalado automático de aplicaciones](quickref-application-auto-scaling.md)

# Configuración de los recursos de Amazon EC2 Auto Scaling con CloudFormation
<a name="quickref-ec2-auto-scaling"></a>

En los ejemplos siguientes se muestran diferentes fragmentos para incluir en las plantillas para su uso con Amazon EC2 Auto Scaling.

**Topics**
+ [Creación de un grupo de escalado automático de instancia única](#scenario-single-instance-as-group)
+ [Creación de un grupo de escalado automático con un equilibrador de carga adjunto](#scenario-as-group)
+ [Creación de un grupo de escalado automático con notificaciones](#scenario-as-notification)
+ [Creación de un grupo de escalado automático que utiliza una `CreationPolicy` y una `UpdatePolicy`](#scenario-as-updatepolicy)
+ [Creación de una política de escalado por pasos](#scenario-step-scaling-policy)
+ [Ejemplos del grupo de instancias mixtas](#scenario-mixed-instances-group-template-examples)
+ [Ejemplos de configuración de lanzamiento](#scenario-launch-config-template-examples)

## Creación de un grupo de escalado automático de instancia única
<a name="scenario-single-instance-as-group"></a>

En este ejemplo se muestra un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) con una sola instancia para ayudarlo a comenzar. La propiedad `VPCZoneIdentifier` del grupo de escalado automático especifica una lista de subredes existentes en tres zonas de disponibilidad diferentes. Debe especificar los ID de subredes aplicables de su cuenta antes de crear la pila. La propiedad `LaunchTemplate` hace referencia a un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) con el nombre lógico `myLaunchTemplate` definido en cualquier otro lugar de la plantilla.

**nota**  
Para obtener más ejemplos de plantillas de lanzamiento, consulte [Creación de plantillas de inicialización con CloudFormation](quickref-ec2-launch-templates.md) en la sección de fragmentos de Amazon EC2 y en la sección [Ejemplos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) en el recurso de `AWS::EC2::LaunchTemplate`.

### JSON
<a name="quickref-autoscaling-example-1.json"></a>

```
 1. "myASG" : {
 2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.    "Properties" : {
 4.       "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
 5.       "LaunchTemplate" : {
 6.         "LaunchTemplateId" : {
 7.           "Ref" : "myLaunchTemplate"
 8.         },
 9.         "Version" : {
10.           "Fn::GetAtt" : [
11.             "myLaunchTemplate",
12.             "LatestVersionNumber"
13.           ]
14.         }
15.       },
16.       "MaxSize" : "1",
17.       "MinSize" : "1"
18.    }
19. }
```

### YAML
<a name="quickref-autoscaling-example-1.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - subnetIdAz1
 6.       - subnetIdAz2
 7.       - subnetIdAz3
 8.     LaunchTemplate:
 9.       LaunchTemplateId: !Ref myLaunchTemplate
10.       Version: !GetAtt myLaunchTemplate.LatestVersionNumber
11.     MaxSize: '1'
12.     MinSize: '1'
```

## Creación de un grupo de escalado automático con un equilibrador de carga adjunto
<a name="scenario-as-group"></a>

En este ejemplo se muestra un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) para el equilibrador de carga en varios servidores. Especifica los nombres lógicos de los recursos de AWS declarados en otra parte de la misma plantilla.

1. La propiedad `VPCZoneIdentifier` especifica los nombres lógicos de dos recursos de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html) donde se crearán las instancias del grupo de escalado automático EC2: `myPublicSubnet1` y `myPublicSubnet2`.

1. La propiedad `LaunchTemplate` especifica un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) con el nombre lógico `myLaunchTemplate`.

1. La propiedad `TargetGroupARNs` muestra los grupos de destino para Balanceador de carga de aplicaciones o Balanceador de carga de red utilizados para enrutar tráfico al grupo de Auto Scaling. En este ejemplo, se especifica un grupo de destino, que es un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) con el nombre lógico `myTargetGroup`.

### JSON
<a name="quickref-autoscaling-example-2.json"></a>

```
 1. "myServerGroup" : {
 2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.    "Properties" : {
 4.       "VPCZoneIdentifier" : [ { "Ref" : "myPublicSubnet1" }, { "Ref" : "myPublicSubnet2" } ],
 5.       "LaunchTemplate" : {
 6.         "LaunchTemplateId" : {
 7.           "Ref" : "myLaunchTemplate"
 8.         },
 9.         "Version" : {
10.           "Fn::GetAtt" : [
11.             "myLaunchTemplate",
12.             "LatestVersionNumber"
13.           ]
14.         }
15.       },
16.       "MaxSize" : "5",
17.       "MinSize" : "1",
18.       "TargetGroupARNs" : [ { "Ref" : "myTargetGroup" } ]
19.    }
20. }
```

### YAML
<a name="quickref-autoscaling-example-2.yaml"></a>

```
 1. myServerGroup:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - !Ref myPublicSubnet1
 6.       - !Ref myPublicSubnet2
 7.     LaunchTemplate:
 8.       LaunchTemplateId: !Ref myLaunchTemplate
 9.       Version: !GetAtt myLaunchTemplate.LatestVersionNumber
10.     MaxSize: '5'
11.     MinSize: '1'
12.     TargetGroupARNs:
13.       - !Ref myTargetGroup
```

### Véase también
<a name="scenario-as-group-see-also"></a>

Para obtener un ejemplo detallado que crea un grupo de escalado automático con una política de escalado de seguimiento de destino basada en la métrica predefinida de `ALBRequestCountPerTarget` para el equilibrador de carga de aplicación, consulte la sección [Ejemplos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples) en el recurso de `AWS::AutoScaling::ScalingPolicy`.

## Creación de un grupo de escalado automático con notificaciones
<a name="scenario-as-notification"></a>

En este ejemplo se muestra un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) que envía notificaciones de Amazon SNS cuando se producen los eventos especificados. La propiedad `NotificationConfigurations` especifica el tema de SNS donde CloudFormation envía una notificación y los eventos que causarán que CloudFormation envíe notificaciones. Cuando se produzcan los eventos especificados por `NotificationTypes`, CloudFormation enviará una notificación al tema de SNS especificado por `TopicARN`. Al lanzar la pila, CloudFormation crea un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html) (`snsTopicForAutoScalingGroup`) que se declara dentro de la misma plantilla.

La propiedad `VPCZoneIdentifier` del grupo de escalado automático especifica una lista de subredes existentes en tres zonas de disponibilidad diferentes. Debe especificar los ID de subredes aplicables de su cuenta antes de crear la pila. La propiedad `LaunchTemplate` hace referencia al nombre lógico de un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) declarado en otra parte de la misma plantilla.

### JSON
<a name="quickref-autoscaling-example-3.json"></a>

```
 1. "myASG" : {
 2.   "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.   "DependsOn": [
 4.     "snsTopicForAutoScalingGroup"
 5.   ],
 6.   "Properties" : {
 7.     "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
 8.     "LaunchTemplate" : {
 9.       "LaunchTemplateId" : {
10.         "Ref" : "logicalName"
11.       },
12.       "Version" : {
13.         "Fn::GetAtt" : [
14.           "logicalName",
15.           "LatestVersionNumber"
16.         ]
17.       }
18.     },
19.     "MaxSize" : "5",
20.     "MinSize" : "1",
21.     "NotificationConfigurations" : [
22.       {
23.         "TopicARN" : { "Ref" : "snsTopicForAutoScalingGroup" },
24.         "NotificationTypes" : [
25.           "autoscaling:EC2_INSTANCE_LAUNCH",
26.           "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
27.           "autoscaling:EC2_INSTANCE_TERMINATE",
28.           "autoscaling:EC2_INSTANCE_TERMINATE_ERROR",
29.           "autoscaling:TEST_NOTIFICATION"
30.         ]
31.       }
32.     ]
33.   }
34. }
```

### YAML
<a name="quickref-autoscaling-example-3.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   DependsOn:
 4.     - snsTopicForAutoScalingGroup
 5.   Properties:
 6.     VPCZoneIdentifier:
 7.       - subnetIdAz1
 8.       - subnetIdAz2
 9.       - subnetIdAz3
10.     LaunchTemplate:
11.       LaunchTemplateId: !Ref logicalName
12.       Version: !GetAtt logicalName.LatestVersionNumber
13.     MaxSize: '5'
14.     MinSize: '1'
15.     NotificationConfigurations:
16.       - TopicARN: !Ref snsTopicForAutoScalingGroup
17.         NotificationTypes:
18.           - autoscaling:EC2_INSTANCE_LAUNCH
19.           - autoscaling:EC2_INSTANCE_LAUNCH_ERROR
20.           - autoscaling:EC2_INSTANCE_TERMINATE
21.           - autoscaling:EC2_INSTANCE_TERMINATE_ERROR
22.           - autoscaling:TEST_NOTIFICATION
```

## Creación de un grupo de escalado automático que utiliza una `CreationPolicy` y una `UpdatePolicy`
<a name="scenario-as-updatepolicy"></a>

En el siguiente ejemplo se muestra cómo agregar atributos `CreationPolicy` y `UpdatePolicy` a un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html).

La política de creación de muestra impide que el grupo de escalado automático alcance el estado `CREATE_COMPLETE` hasta que CloudFormation reciba el número `Count` de señales de éxito cuando el grupo está listo. Para indicar que el grupo de escalado automático está listo, se ejecuta un script del asistente `cfn-signal` agregado a los datos del usuario de la plantilla de lanzamiento (no se muestra) en las instancias. Si las instancias no envían una señal dentro del especificado `Timeout`, CloudFormation asume que las instancias no se crearon, que se produce un error en la creación de recursos y CloudFormation deshace la pila.

La política de actualización de ejemplo indica a CloudFormation que realice una actualización continua con la propiedad `AutoScalingRollingUpdate`. La actualización continua realiza cambios en el grupo de escalado automático en pequeños lotes (para este ejemplo, instancia tras instancia) en función de `MaxBatchSize` y una pausa entre lotes de actualización en función de `PauseTime`. El atributo `MinInstancesInService` especifica el número mínimo de instancias que deben estar en servicio en el grupo de escalado automático mientras CloudFormation actualiza las instancias antiguas.

El atributo `WaitOnResourceSignals` se establece en `true`. CloudFormation debe recibir una señal de cada instancia nueva dentro del valor de `PauseTime` especificado antes de continuar con la actualización. Mientras la actualización de la pila está en curso, se suspenden los siguientes procesos de escalado automático de EC2: `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification` y `ScheduledActions`. Nota: No suspenda los tipos de proceso `Launch`, `Terminate` ni `AddToLoadBalancer` (si se utiliza el grupo de escalado automático con Elastic Load Balancing) ya que ello puede impedir que la actualización continua funcione correctamente.

La propiedad `VPCZoneIdentifier` del grupo de escalado automático especifica una lista de subredes existentes en tres zonas de disponibilidad diferentes. Debe especificar los ID de subredes aplicables de su cuenta antes de crear la pila. La propiedad `LaunchTemplate` hace referencia al nombre lógico de un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) declarado en otra parte de la misma plantilla.

Para obtener más información sobre los atributos `CreationPolicy` y `UpdatePolicy`, consulte [Referencia de atributos personalizados](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html).

### JSON
<a name="quickref-autoscaling-example-4.json"></a>

```
{
  "Resources":{
    "myASG":{
      "CreationPolicy":{
        "ResourceSignal":{
          "Count":"3",
          "Timeout":"PT15M"
        }
      },
      "UpdatePolicy":{
        "AutoScalingRollingUpdate":{
          "MinInstancesInService":"3",
          "MaxBatchSize":"1",
          "PauseTime":"PT12M5S",
          "WaitOnResourceSignals":"true",
          "SuspendProcesses":[
            "HealthCheck",
            "ReplaceUnhealthy",
            "AZRebalance",
            "AlarmNotification",
            "ScheduledActions",
            "InstanceRefresh"
          ]
        }
      },
      "Type":"AWS::AutoScaling::AutoScalingGroup",
      "Properties":{
        "VPCZoneIdentifier":[ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
        "LaunchTemplate":{
          "LaunchTemplateId":{
            "Ref":"logicalName"
          },
          "Version":{
            "Fn::GetAtt":[
              "logicalName",
              "LatestVersionNumber"
            ]
          }
        },
        "MaxSize":"5",
        "MinSize":"3"
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-4.yaml"></a>

```
---
Resources:
  myASG:
    CreationPolicy:
      ResourceSignal:
        Count: '3'
        Timeout: PT15M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: '3'
        MaxBatchSize: '1'
        PauseTime: PT12M5S
        WaitOnResourceSignals: true
        SuspendProcesses:
          - HealthCheck
          - ReplaceUnhealthy
          - AZRebalance
          - AlarmNotification
          - ScheduledActions
          - InstanceRefresh
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier:
        - subnetIdAz1
        - subnetIdAz2
        - subnetIdAz3
      LaunchTemplate:
        LaunchTemplateId: !Ref logicalName
        Version: !GetAtt logicalName.LatestVersionNumber
      MaxSize: '5'
      MinSize: '3'
```

## Creación de una política de escalado por pasos
<a name="scenario-step-scaling-policy"></a>

En este ejemplo, se muestra un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html) que escala horizontalmente el grupo de escalado automático mediante una política de escalado de pasos. La propiedad `AdjustmentType` especifica `ChangeInCapacity`, lo que significa que `ScalingAdjustment` representa el número de instancias que agregar (si `ScalingAdjustment` es positivo) o eliminar (si es negativo). En este ejemplo, `ScalingAdjustment` es 1; por lo tanto, la política aumenta la cantidad de instancias de EC2 del grupo en 1 cuando se infringe el umbral de alarma.

El recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudwatch-alarm.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudwatch-alarm.html) de `CPUAlarmHigh` especifica la política de escalado de `ASGScalingPolicyHigh` como la acción a ejecutar cuando la alarma está en estado de ALARMA (`AlarmActions`). La propiedad `Dimensions` hace referencia al nombre lógico de un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) declarado en otra parte de la misma plantilla.

### JSON
<a name="quickref-autoscaling-example-5.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "ASGScalingPolicyHigh":{
 4.       "Type":"AWS::AutoScaling::ScalingPolicy",
 5.       "Properties":{
 6.         "AutoScalingGroupName":{ "Ref":"logicalName" },
 7.         "PolicyType":"StepScaling",
 8.         "AdjustmentType":"ChangeInCapacity",
 9.         "StepAdjustments":[
10.           {
11.             "MetricIntervalLowerBound":0,
12.             "ScalingAdjustment":1
13.           }
14.         ]
15.       }
16.     },
17.     "CPUAlarmHigh":{
18.       "Type":"AWS::CloudWatch::Alarm",
19.       "Properties":{
20.         "EvaluationPeriods":"2",
21.         "Statistic":"Average",
22.         "Threshold":"90",
23.         "AlarmDescription":"Scale out if CPU > 90% for 2 minutes",
24.         "Period":"60",
25.         "AlarmActions":[ { "Ref":"ASGScalingPolicyHigh" } ],
26.         "Namespace":"AWS/EC2",
27.         "Dimensions":[
28.           {
29.             "Name":"AutoScalingGroupName",
30.             "Value":{ "Ref":"logicalName" }
31.           }
32.         ],
33.         "ComparisonOperator":"GreaterThanThreshold",
34.         "MetricName":"CPUUtilization"
35.       }
36.     }
37.   }
38. }
```

### YAML
<a name="quickref-autoscaling-example-5.yaml"></a>

```
 1. ---
 2. Resources:
 3.   ASGScalingPolicyHigh:
 4.     Type: AWS::AutoScaling::ScalingPolicy
 5.     Properties:
 6.       AutoScalingGroupName: !Ref logicalName
 7.       PolicyType: StepScaling
 8.       AdjustmentType: ChangeInCapacity
 9.       StepAdjustments: 
10.         - MetricIntervalLowerBound: 0
11.           ScalingAdjustment: 1
12.   CPUAlarmHigh:
13.     Type: AWS::CloudWatch::Alarm
14.     Properties:
15.       EvaluationPeriods: 2
16.       Statistic: Average
17.       Threshold: 90
18.       AlarmDescription: 'Scale out if CPU > 90% for 2 minutes'
19.       Period: 60
20.       AlarmActions:
21.         - !Ref ASGScalingPolicyHigh
22.       Namespace: AWS/EC2
23.       Dimensions:
24.         - Name: AutoScalingGroupName
25.           Value:
26.             !Ref logicalName
27.       ComparisonOperator: GreaterThanThreshold
28.       MetricName: CPUUtilization
```

### Véase también
<a name="scenario-as-policy-see-also"></a>

Para obtener más ejemplos de plantillas para escalar políticas, consulte la sección [Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples) (Ejemplos) en el recurso `AWS::AutoScaling::ScalingPolicy`.

## Ejemplos del grupo de instancias mixtas
<a name="scenario-mixed-instances-group-template-examples"></a>

### Crear un grupo de escalado automático mediante la selección del tipo de instancia basada en atributos
<a name="scenario-mixed-instances-group-instance-requirements"></a>

En este ejemplo, se muestra un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) que contiene la información para lanzar un grupo de instancias mixtas mediante la selección del tipo de instancias basadas en atributos. Usted especifica los valores mínimo y máximo para la propiedad `VCpuCount` y el valor mínimo para la propiedad `MemoryMiB`. Todos los tipos de instancia que utiliza el grupo de escalado automático deben coincidir con los atributos de instancia requeridos. 

La propiedad `VPCZoneIdentifier` del grupo de escalado automático especifica una lista de subredes existentes en tres zonas de disponibilidad diferentes. Debe especificar los ID de subredes aplicables de su cuenta antes de crear la pila. La propiedad `LaunchTemplate` hace referencia al nombre lógico de un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) declarado en otra parte de la misma plantilla.

#### JSON
<a name="quickref-mixed-instances-group-example-2.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "myASG":{
 4.       "Type":"AWS::AutoScaling::AutoScalingGroup",
 5.       "Properties":{
 6.         "VPCZoneIdentifier":[
 7.           "subnetIdAz1",
 8.           "subnetIdAz2",
 9.           "subnetIdAz3"
10.         ],
11.         "MixedInstancesPolicy":{
12.           "LaunchTemplate":{
13.             "LaunchTemplateSpecification":{
14.               "LaunchTemplateId":{
15.                 "Ref":"logicalName"
16.               },
17.               "Version":{
18.                 "Fn::GetAtt":[
19.                   "logicalName",
20.                   "LatestVersionNumber"
21.                 ]
22.               }
23.             },
24.             "Overrides":[
25.               {
26.                 "InstanceRequirements":{
27.                   "VCpuCount":{
28.                     "Min":2,
29.                     "Max":4
30.                   },
31.                   "MemoryMiB":{
32.                     "Min":2048
33.                   }
34.                 }
35.               }
36.             ]
37.           }
38.         },
39.         "MaxSize":"5",
40.         "MinSize":"1"
41.       }
42.     }
43.   }
44. }
```

#### YAML
<a name="quickref-mixed-instances-group-example-1.yaml"></a>

```
 1. ---
 2. Resources:
 3.   myASG:
 4.     Type: AWS::AutoScaling::AutoScalingGroup
 5.     Properties:
 6.       VPCZoneIdentifier:
 7.         - subnetIdAz1
 8.         - subnetIdAz2
 9.         - subnetIdAz3
10.       MixedInstancesPolicy:
11.         LaunchTemplate:
12.           LaunchTemplateSpecification:
13.             LaunchTemplateId: !Ref logicalName
14.             Version: !GetAtt logicalName.LatestVersionNumber
15.           Overrides:
16.             - InstanceRequirements:
17.                 VCpuCount:
18.                   Min: 2
19.                   Max: 4
20.                 MemoryMiB:
21.                   Min: 2048
22.       MaxSize: '5'
23.       MinSize: '1'
```

## Ejemplos de configuración de lanzamiento
<a name="scenario-launch-config-template-examples"></a>

### Creación de una configuración de lanzamiento
<a name="scenario-as-launch-config"></a>

En este ejemplo se muestra un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html) para un grupo de escalado automático en el que especifica valores para las propiedades `ImageId`, `InstanceType` y `SecurityGroups`. La propiedad `SecurityGroups` especifica el nombre lógico de un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) especificado en otra parte de la plantilla y de un grupo de seguridad de EC2 existente denominado `myExistingEC2SecurityGroup`.

#### JSON
<a name="quickref-launch-config-example-1.json"></a>

```
1. "mySimpleConfig" : {
2.    "Type" : "AWS::AutoScaling::LaunchConfiguration",
3.    "Properties" : {
4.       "ImageId" : "ami-02354e95b3example",
5.       "InstanceType" : "t3.micro",
6.       "SecurityGroups" : [ { "Ref" : "logicalName" }, "myExistingEC2SecurityGroup" ]
7.    }
8. }
```

#### YAML
<a name="quickref-launch-config-example-1.yaml"></a>

```
1. mySimpleConfig:
2.   Type: AWS::AutoScaling::LaunchConfiguration
3.   Properties:
4.     ImageId: ami-02354e95b3example
5.     InstanceType: t3.micro
6.     SecurityGroups:
7.       - !Ref logicalName
8.       - myExistingEC2SecurityGroup
```

### Creación de un grupo de escalado automático que utiliza una configuración de lanzamiento
<a name="scenario-single-instance-as-group-launch-configuration"></a>

En este ejemplo se muestra un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) con una sola instancia. La propiedad `VPCZoneIdentifier` del grupo de escalado automático especifica una lista de subredes existentes en tres zonas de disponibilidad diferentes. Debe especificar los ID de subredes aplicables de su cuenta antes de crear la pila. La propiedad `LaunchConfigurationName` hace referencia a un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html) con el nombre lógico `mySimpleConfig` definido en la plantilla.

#### JSON
<a name="quickref-launch-config-example-2.json"></a>

```
1. "myASG" : {
2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
3.    "Properties" : {
4.       "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
5.       "LaunchConfigurationName" : { "Ref" : "mySimpleConfig" },
6.       "MaxSize" : "1",
7.       "MinSize" : "1"
8.    }
9. }
```

#### YAML
<a name="quickref-launch-config-example-2.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - subnetIdAz1
 6.       - subnetIdAz2
 7.       - subnetIdAz3
 8.     LaunchConfigurationName: !Ref mySimpleConfig
 9.     MaxSize: '1'
10.     MinSize: '1'
```

# Configuración de recursos de escalado automático de aplicaciones con CloudFormation
<a name="quickref-application-auto-scaling"></a>

Esta sección proporciona ejemplos de plantillas de CloudFormation para las políticas de escalado de Application Auto Scaling y acciones programadas para distintos recursos de AWS.

**importante**  
Cuando se incluye un fragmento de escalado automático de aplicaciones en la plantilla, es probable que deba declarar una dependencia del recurso escalable específico que se crea a través de la plantilla mediante el atributo `DependsOn`. Esto anula el paralelismo predeterminado y dirige CloudFormation para operar con recursos en un orden especificado. De lo contrario, la configuración de escalado podría aplicarse antes de que el recurso se haya configurado completamente.  
Para obtener más información, consulte [DependsOn atributo](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html).

**Topics**
+ [Creación de una política de escalado para una flota de AppStream](#w2aac11c41c15c19b9)
+ [Creación de una política de escalado para un clúster de base de datos (DB) de Aurora](#w2aac11c41c15c19c11)
+ [Creación de una política de escalado para una tabla de DynamoDB](#w2aac11c41c15c19c13)
+ [Creación de una política de escalado para un servicio de Amazon ECS (métricas: CPU y memoria promedio)](#w2aac11c41c15c19c15)
+ [Creación de una política de escalado para un servicio de Amazon ECS (métrica: recuento de solicitudes promedio por objetivo)](#w2aac11c41c15c19c17)
+ [Creación de una acción programada con una expresión cron para una función de Lambda](#w2aac11c41c15c19c19)
+ [Creación de una acción programada con una expresión `at` para una flota de spot](#w2aac11c41c15c19c21)

## Creación de una política de escalado para una flota de AppStream
<a name="w2aac11c41c15c19b9"></a>

Este fragmento muestra cómo crear una política y aplicarla a recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-appstream-fleet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-appstream-fleet.html) por medio del recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html). El recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) declara un destino escalable al que se aplica esta política. Application Auto Scaling puede escalar el número de instancias de flota en un mínimo de 1 instancia y un máximo de 20. La política mantiene el uso promedio de la capacidad de la flota en un 75 %, con periodos de recuperación de escalamiento y reducción horizontal de 300 segundos (5 minutos).

Utiliza las funciones intrínsecas `Fn::Join` y `Rev` para construir la propiedad `ResourceId` con el nombre lógico del recurso de `AWS::AppStream::Fleet` especificado en la misma plantilla. Para obtener más información, consulte [Referencia de función intrínseca](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-6.json"></a>

```
{
  "Resources" : {
    "ScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 20,
        "MinCapacity" : 1,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet" },
        "ServiceNamespace" : "appstream",
        "ScalableDimension" : "appstream:fleet:DesiredCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "fleet",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        }
      }
    },
    "ScalingPolicyAppStreamFleet" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu75" },
        "PolicyType" : "TargetTrackingScaling",
        "ServiceNamespace" : "appstream",
        "ScalableDimension" : "appstream:fleet:DesiredCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "fleet",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 75,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "AppStreamAverageCapacityUtilization"
          },
          "ScaleInCooldown" : 300,
          "ScaleOutCooldown" : 300
        }
      }
    } 
  }
}
```

### YAML
<a name="quickref-autoscaling-example-6.yaml"></a>

```
---
Resources:
  ScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 20
      MinCapacity: 1
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet'
      ServiceNamespace: appstream
      ScalableDimension: appstream:fleet:DesiredCapacity
      ResourceId: !Join
        - /
        - - fleet
          - !Ref logicalName
  ScalingPolicyAppStreamFleet:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu75
      PolicyType: TargetTrackingScaling
      ServiceNamespace: appstream
      ScalableDimension: appstream:fleet:DesiredCapacity
      ResourceId: !Join
        - /
        - - fleet
          - !Ref logicalName
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 75
        PredefinedMetricSpecification:
          PredefinedMetricType: AppStreamAverageCapacityUtilization
        ScaleInCooldown: 300
        ScaleOutCooldown: 300
```

## Creación de una política de escalado para un clúster de base de datos (DB) de Aurora
<a name="w2aac11c41c15c19c11"></a>

En este fragmento, registra un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html). El recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) indica que el clúster de base de datos debe escalarse en forma dinámica para tener de una a ocho réplicas de Aurora. También aplica una política de escalado de seguimiento de destino al clúster mediante el recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html).

En esta configuración, la métrica predefinida `RDSReaderAverageCPUUtilization` se usa para ajustar un clúster de base de datos de Aurora en función del uso promedio de la CPU del 40 por ciento en todas las réplicas de Aurora de ese clúster de base de datos de Aurora. La configuración proporciona un periodo de recuperación de escalado descendente de 10 minutos y un periodo de recuperación de escalado ascendente de 5 minutos.

En este ejemplo, se usa la función intrínseca `Fn::Sub` para construir la propiedad `ResourceId` con el nombre lógico del recurso de `AWS::RDS::DBCluster` especificado en la misma plantilla. Para obtener más información, consulte [Referencia de función intrínseca](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-7.json"></a>

```
{
  "Resources" : {
    "ScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 8,
        "MinCapacity" : 1,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster" },
        "ServiceNamespace" : "rds",
        "ScalableDimension" : "rds:cluster:ReadReplicaCount",
        "ResourceId" : { "Fn::Sub" : "cluster:${logicalName}" }
      }
    },
    "ScalingPolicyDBCluster" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu40" },
        "PolicyType" : "TargetTrackingScaling",
        "ServiceNamespace" : "rds",
        "ScalableDimension" : "rds:cluster:ReadReplicaCount",
        "ResourceId" : { "Fn::Sub" : "cluster:${logicalName}" }, 
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 40,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "RDSReaderAverageCPUUtilization"
          },
          "ScaleInCooldown" : 600,
          "ScaleOutCooldown" : 300
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-7.yaml"></a>

```
---
Resources:
  ScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 8
      MinCapacity: 1
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster'
      ServiceNamespace: rds
      ScalableDimension: rds:cluster:ReadReplicaCount
      ResourceId: !Sub cluster:${logicalName}
  ScalingPolicyDBCluster:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu40
      PolicyType: TargetTrackingScaling
      ServiceNamespace: rds
      ScalableDimension: rds:cluster:ReadReplicaCount
      ResourceId: !Sub cluster:${logicalName}
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 40
        PredefinedMetricSpecification:
          PredefinedMetricType: RDSReaderAverageCPUUtilization
        ScaleInCooldown: 600
        ScaleOutCooldown: 300
```

## Creación de una política de escalado para una tabla de DynamoDB
<a name="w2aac11c41c15c19c13"></a>

Este fragmento muestra cómo crear un tipo de política de `TargetTrackingScaling` y aplicarla a un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html) por medio del recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html). El recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) declara un destino escalable al que se aplica esta política, con un mínimo de cinco unidades de capacidad de escritura y un máximo de 15. La política de escalado escala el rendimiento de la capacidad de escritura de la tabla para mantener la utilización de destino en un 50 por ciento en función de la métrica predefinida `DynamoDBWriteCapacityUtilization`.

Utiliza las funciones intrínsecas `Fn::Join` y `Ref` para construir la propiedad `ResourceId` con el nombre lógico del recurso de `AWS::DynamoDB::Table` especificado en la misma plantilla. Para obtener más información, consulte [Referencia de función intrínseca](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**nota**  
Para obtener más información acerca de cómo crear una plantilla de CloudFormation para DynamoDB, consulte la publicación del blog [Cómo utilizar CloudFormation para configurar el escalado automático para las tablas e índices de Amazon DynamoDB](https://aws.amazon.com/blogs/database/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/) en el blog de la base de datos de AWS.

### JSON
<a name="quickref-autoscaling-example-8.json"></a>

```
{
  "Resources" : {
    "WriteCapacityScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 15,
        "MinCapacity" : 5,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable" },
        "ServiceNamespace" : "dynamodb",
        "ScalableDimension" : "dynamodb:table:WriteCapacityUnits",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "table",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        }
      }
    },
    "WriteScalingPolicy" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : "WriteScalingPolicy",
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "WriteCapacityScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 50.0,
          "ScaleInCooldown" : 60,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "DynamoDBWriteCapacityUtilization"
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-8.yaml"></a>

```
---
Resources:
  WriteCapacityScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 15
      MinCapacity: 5
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
      ServiceNamespace: dynamodb
      ScalableDimension: dynamodb:table:WriteCapacityUnits
      ResourceId: !Join
        - /
        - - table
          - !Ref logicalName
  WriteScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: WriteScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref WriteCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 50.0
        ScaleInCooldown: 60
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBWriteCapacityUtilization
```

## Creación de una política de escalado para un servicio de Amazon ECS (métricas: CPU y memoria promedio)
<a name="w2aac11c41c15c19c15"></a>

Este fragmento muestra cómo crear una política y aplicarla a un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html) por medio del recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html). El recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) declara un destino escalable al que se aplica esta política. El escalado automático de aplicaciones puede escalar el número de tareas a un mínimo de 1 tarea y un máximo de 6.

Crea dos políticas de escalado con el tipo de política `TargetTrackingScaling`. Las políticas se utilizan para escalar el servicio ECS en función del uso medio de CPU y memoria del servicio. Utiliza las funciones intrínsecas `Fn::Join` y `Ref` para crear la propiedad `ResourceId` con los nombres lógicos de los recursos de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html) (`myContainerCluster`) y `AWS::ECS::Service` (`myService`) especificados en la misma plantilla. Para obtener más información, consulte [Referencia de función intrínseca](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-9.json"></a>

```
{
  "Resources" : {
    "ECSScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : "6",
        "MinCapacity" : "1",
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" },
        "ServiceNamespace" : "ecs",
        "ScalableDimension" : "ecs:service:DesiredCount",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "service",
              {
                "Ref" : "myContainerCluster"
              },
              {
                "Fn::GetAtt" : [
                  "myService",
                  "Name"
                ]
              }
            ]
          ]
        }
      }
    },
    "ServiceScalingPolicyCPU" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu70" },
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 70.0,
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ECSServiceAverageCPUUtilization"
          }
        }
      }
    },
    "ServiceScalingPolicyMem" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-mem90" },
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 90.0,
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ECSServiceAverageMemoryUtilization"
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-9.yaml"></a>

```
---
Resources:
  ECSScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 6
      MinCapacity: 1  
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService'
      ServiceNamespace: ecs
      ScalableDimension: 'ecs:service:DesiredCount'
      ResourceId: !Join 
        - /
        - - service
          - !Ref myContainerCluster
          - !GetAtt myService.Name
  ServiceScalingPolicyCPU:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu70
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 70.0
        ScaleInCooldown: 180
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: ECSServiceAverageCPUUtilization
  ServiceScalingPolicyMem:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-mem90
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 90.0
        ScaleInCooldown: 180
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: ECSServiceAverageMemoryUtilization
```

## Creación de una política de escalado para un servicio de Amazon ECS (métrica: recuento de solicitudes promedio por objetivo)
<a name="w2aac11c41c15c19c17"></a>

En el ejemplo siguiente se aplica una política de escalado de seguimiento de destino con la métrica predefinida `ALBRequestCountPerTarget` a un servicio ECS. La política se utiliza para agregar capacidad al servicio de ECS cuando el recuento de solicitudes por destino (por minuto) supera el valor de destino. Dado que el valor de `DisableScaleIn` se establece en `true`, la política de seguimiento de destino no eliminará capacidad del destino escalable.

Utiliza las funciones intrínsecas `Fn::Join` y `Fn::GetAtt` para crear la propiedad `ResourceLabel` con los nombres lógicos de los recursos de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html) (`myLoadBalancer`) y [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) (`myTargetGroup`) especificados en la misma plantilla. Para obtener más información, consulte [Referencia de función intrínseca](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

Las propiedades `MaxCapacity` y `MinCapacity` del destino escalable y la propiedad `TargetValue` de la política de escalado hacen referencia a los valores de parámetro que se pasan a la plantilla al crear o actualizar una pila.

### JSON
<a name="quickref-autoscaling-example-10.json"></a>

```
{
  "Resources" : {
    "ECSScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : { "Ref" : "MaxCount" },
        "MinCapacity" : { "Ref" : "MinCount" },
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" },
        "ServiceNamespace" : "ecs",
        "ScalableDimension" : "ecs:service:DesiredCount",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "service",
              {
                "Ref" : "myContainerCluster"
              },
              {
                "Fn::GetAtt" : [
                  "myService",
                  "Name"
                ]
              }
            ]
          ]
        }
      }
    },
    "ServiceScalingPolicyALB" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : "alb-requests-per-target-per-minute",
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : { "Ref" : "ALBPolicyTargetValue" },
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 30,
          "DisableScaleIn" : true,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ALBRequestCountPerTarget",
            "ResourceLabel" : {
              "Fn::Join" : [
                "/",
                [
                  {
                    "Fn::GetAtt" : [
                      "myLoadBalancer",
                      "LoadBalancerFullName"
                    ]
                  },
                  {
                    "Fn::GetAtt" : [
                      "myTargetGroup",
                      "TargetGroupFullName"
                    ]
                  }
                ]
              ]
            }
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-10.yaml"></a>

```
---
Resources:
  ECSScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: !Ref MaxCount
      MinCapacity: !Ref MinCount  
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService'
      ServiceNamespace: ecs
      ScalableDimension: 'ecs:service:DesiredCount'
      ResourceId: !Join 
        - /
        - - service
          - !Ref myContainerCluster
          - !GetAtt myService.Name
  ServiceScalingPolicyALB:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: alb-requests-per-target-per-minute
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: !Ref ALBPolicyTargetValue
        ScaleInCooldown: 180
        ScaleOutCooldown: 30
        DisableScaleIn: true
        PredefinedMetricSpecification:
          PredefinedMetricType: ALBRequestCountPerTarget
          ResourceLabel: !Join 
            - '/' 
            - - !GetAtt myLoadBalancer.LoadBalancerFullName
              - !GetAtt myTargetGroup.TargetGroupFullName
```

## Creación de una acción programada con una expresión cron para una función de Lambda
<a name="w2aac11c41c15c19c19"></a>

Este fragmento registra la simultaneidad aprovisionada para un alias de función ([https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html)) denominado `BLUE` mediante el recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html). También crea una acción programada con una programación periódica utilizando una expresión cron. La zona horaria del programa recurrente es UTC.

Utiliza las funciones intrínsecas `Fn::Join` y `Ref` de la propiedad `RoleARN` para especificar el ARN del rol vinculado al servicio. Utiliza la función intrínseca `Fn::Sub` para construir la propiedad `ResourceId` con el nombre lógico del recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) o [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html) que se especifica en la misma plantilla. Para obtener más información, consulte [Referencia de función intrínseca](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**nota**  
Tampoco puede asignar simultaneidad aprovisionada en un alias que apunte a la versión no publicada (`$LATEST`).  
Para obtener más información acerca de cómo crear una plantilla de CloudFormation para recursos de Lambda, consulte la publicación del blog [Programación de la simultaneidad aprovisionada de AWS Lambda durante el uso en horarios de actividad alta simultánea](https://aws.amazon.com/blogs/compute/scheduling-aws-lambda-provisioned-concurrency-for-recurring-peak-usage/) en el blog de computación de AWS.

### JSON
<a name="quickref-autoscaling-example-11.json"></a>

```
{
  "ScalableTarget" : {
    "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
    "Properties" : {
      "MaxCapacity" : 250,
      "MinCapacity" : 0,
      "RoleARN" : {
        "Fn::Join" : [
          ":",
          [
            "arn:aws:iam:",
            {
              "Ref" : "AWS::AccountId"
            },
            "role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency"
          ]
        ]
      },
      "ServiceNamespace" : "lambda",
      "ScalableDimension" : "lambda:function:ProvisionedConcurrency",
      "ResourceId" : { "Fn::Sub" : "function:${logicalName}:BLUE" },
      "ScheduledActions" : [
        {
          "ScalableTargetAction" : {
            "MinCapacity" : "250"
          },
          "ScheduledActionName" : "my-scale-out-scheduled-action",
          "Schedule" : "cron(0 18 * * ? *)",
          "EndTime" : "2022-12-31T12:00:00.000Z"
        }
      ]
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-11.yaml"></a>

```
ScalableTarget:
  Type: AWS::ApplicationAutoScaling::ScalableTarget
  Properties:
    MaxCapacity: 250
    MinCapacity: 0
    RoleARN: !Join 
      - ':'
      - - 'arn:aws:iam:'
        - !Ref 'AWS::AccountId'
        - role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency
    ServiceNamespace: lambda
    ScalableDimension: lambda:function:ProvisionedConcurrency
    ResourceId: !Sub function:${logicalName}:BLUE
    ScheduledActions:
      - ScalableTargetAction:
          MinCapacity: 250
        ScheduledActionName: my-scale-out-scheduled-action
        Schedule: 'cron(0 18 * * ? *)'
        EndTime: '2022-12-31T12:00:00.000Z'
```

## Creación de una acción programada con una expresión `at` para una flota de spot
<a name="w2aac11c41c15c19c21"></a>

Este fragmento muestra cómo crear dos acciones programadas que se produzcan solo una vez para un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-spotfleet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-spotfleet.html) que utilice el recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html). La zona horaria de cada acción programada puntual es UTC.

Utiliza las funciones intrínsecas `Fn::Join` y `Ref` para construir la propiedad `ResourceId` con el nombre lógico del recurso de `AWS::EC2::SpotFleet` especificado en la misma plantilla. Para obtener más información, consulte [Referencia de función intrínseca](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**nota**  
La solicitud de flota de spot debe tener un tipo de solicitud de `maintain`. El escalado automático no se admite para solicitudes o bloques de spot de una única vez.

### JSON
<a name="quickref-autoscaling-example-12.json"></a>

```
{
  "Resources" : {
    "SpotFleetScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 0,
        "MinCapacity" : 0,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest" },
        "ServiceNamespace" : "ec2",
        "ScalableDimension" : "ec2:spot-fleet-request:TargetCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "spot-fleet-request",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        },
        "ScheduledActions" : [
          {
            "ScalableTargetAction" : {
              "MaxCapacity" : "10",
              "MinCapacity" : "10"
            },
            "ScheduledActionName" : "my-scale-out-scheduled-action",
            "Schedule" : "at(2022-05-20T13:00:00)"
          },
          {
            "ScalableTargetAction" : {
              "MaxCapacity" : "0",
              "MinCapacity" : "0"
            },
            "ScheduledActionName" : "my-scale-in-scheduled-action",
            "Schedule" : "at(2022-05-20T21:00:00)"
          }
        ]
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-12.yaml"></a>

```
---
Resources:
  SpotFleetScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 0
      MinCapacity: 0
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest'
      ServiceNamespace: ec2
      ScalableDimension: 'ec2:spot-fleet-request:TargetCapacity'
      ResourceId: !Join 
        - /
        - - spot-fleet-request
          - !Ref logicalName
      ScheduledActions:
        - ScalableTargetAction:
            MaxCapacity: 10
            MinCapacity: 10
          ScheduledActionName: my-scale-out-scheduled-action
          Schedule: 'at(2022-05-20T13:00:00)'
        - ScalableTargetAction:
            MaxCapacity: 0
            MinCapacity: 0
          ScheduledActionName: my-scale-in-scheduled-action
          Schedule: 'at(2022-05-20T21:00:00)'
```

# Fragmentos de plantillas de la consola de facturación de AWS
<a name="quickref-billingconductor"></a>

En este ejemplo, se crea un plan de precios con una regla de precios con un margen global del 10 %. Este plan de precios se adjunta al grupo de facturación. El grupo de facturación también tiene dos líneas de pedido personalizadas que aplican un cargo de 10 USD y un cargo del 10 % sobre el costo total del grupo de facturación.

## JSON
<a name="quickref-billingconductor-example-1.json"></a>

```
 1. {
 2.    "Parameters": {
 3.       "LinkedAccountIds": {
 4.          "Type": "ListNumber"
 5.       },
 6.       "PrimaryAccountId": {
 7.          "Type": "Number"
 8.       }
 9.    },
10.    "Resources": {
11.       "TestPricingRule": {
12.          "Type": "AWS::BillingConductor::PricingRule",
13.          "Properties": {
14.             "Name": "TestPricingRule",
15.             "Description": "Test pricing rule created through Cloudformation. Mark everything by 10%.",
16.             "Type": "MARKUP",
17.             "Scope": "GLOBAL",
18.             "ModifierPercentage": 10
19.          }
20.       },
21.       "TestPricingPlan": {
22.          "Type": "AWS::BillingConductor::PricingPlan",
23.          "Properties": {
24.             "Name": "TestPricingPlan",
25.             "Description": "Test pricing plan created through Cloudformation.",
26.             "PricingRuleArns": [
27.                {"Fn::GetAtt": ["TestPricingRule", "Arn"]}
28.             ]
29.          }
30.       },
31.       "TestBillingGroup": {
32.          "Type": "AWS::BillingConductor::BillingGroup",
33.          "Properties": {
34.             "Name": "TestBillingGroup",
35.             "Description": "Test billing group created through Cloudformation with 1 linked account. The linked account is also the primary account.",
36.             "PrimaryAccountId": {
37.                "Ref": "PrimaryAccountId"
38.             },
39.             "AccountGrouping": {
40.                "LinkedAccountIds": null
41.             },
42.             "ComputationPreference": {
43.                "PricingPlanArn": {
44.                  "Fn::GetAtt": ["TestPricingPlan", "Arn"]
45.                }
46.             }
47.          }
48.       },
49.       "TestFlatCustomLineItem": {
50.          "Type": "AWS::BillingConductor::CustomLineItem",
51.          "Properties": {
52.             "Name": "TestFlatCustomLineItem",
53.             "Description": "Test flat custom line item created through Cloudformation for a $10 charge.",
54.             "BillingGroupArn": {
55.               "Fn::GetAtt": ["TestBillingGroup", "Arn"]
56.             },
57.             "CustomLineItemChargeDetails": {
58.                "Flat": {
59.                   "ChargeValue": 10
60.                },
61.                "Type": "FEE"
62.             }
63.          }
64.       },
65.       "TestPercentageCustomLineItem": {
66.          "Type": "AWS::BillingConductor::CustomLineItem",
67.          "Properties": {
68.             "Name": "TestPercentageCustomLineItem",
69.             "Description": "Test percentage custom line item created through Cloudformation for a %10 additional charge on the overall total bill of the billing group.",
70.             "BillingGroupArn": {
71.               "Fn::GetAtt": ["TestBillingGroup", "Arn"]
72.             },
73.             "CustomLineItemChargeDetails": {
74.                "Percentage": {
75.                   "PercentageValue": 10,
76.                   "ChildAssociatedResources": [
77.                      {"Fn::GetAtt": ["TestBillingGroup", "Arn"]}
78.                   ]
79.                },
80.                "Type": "FEE"
81.             }
82.          }
83.       }
84.    }
85. }
```

## YAML
<a name="quickref-billingconductor-example-1.yaml"></a>

```
 1. Parameters:
 2.   LinkedAccountIds:
 3.     Type: ListNumber
 4.   PrimaryAccountId:
 5.     Type: Number
 6. Resources:
 7.   TestPricingRule:
 8.     Type: AWS::BillingConductor::PricingRule
 9.     Properties:
10.       Name: 'TestPricingRule'
11.       Description: 'Test pricing rule created through Cloudformation. Mark everything by 10%.'
12.       Type: 'MARKUP'
13.       Scope: 'GLOBAL'
14.       ModifierPercentage: 10
15.   TestPricingPlan:
16.     Type: AWS::BillingConductor::PricingPlan
17.     Properties:
18.       Name: 'TestPricingPlan'
19.       Description: 'Test pricing plan created through Cloudformation.'
20.       PricingRuleArns:
21.         - !GetAtt TestPricingRule.Arn
22.   TestBillingGroup:
23.     Type: AWS::BillingConductor::BillingGroup
24.     Properties:
25.       Name: 'TestBillingGroup'
26.       Description: 'Test billing group created through Cloudformation with 1 linked account. The linked account is also the primary account.'
27.       PrimaryAccountId: !Ref PrimaryAccountId
28.       AccountGrouping:
29.         LinkedAccountIds: !Ref LinkedAccountIds
30.       ComputationPreference:
31.         PricingPlanArn: !GetAtt TestPricingPlan.Arn
32.   TestFlatCustomLineItem:
33.     Type: AWS::BillingConductor::CustomLineItem
34.     Properties:
35.       Name: 'TestFlatCustomLineItem'
36.       Description: 'Test flat custom line item created through Cloudformation for a $10 charge.'
37.       BillingGroupArn: !GetAtt TestBillingGroup.Arn
38.       CustomLineItemChargeDetails:
39.         Flat:
40.           ChargeValue: 10
41.         Type: 'FEE'
42.   TestPercentageCustomLineItem:
43.     Type: AWS::BillingConductor::CustomLineItem
44.     Properties:
45.       Name: 'TestPercentageCustomLineItem'
46.       Description: 'Test percentage custom line item created through Cloudformation for a %10 additional charge on the overall total bill of the billing group.'
47.       BillingGroupArn: !GetAtt TestBillingGroup.Arn
48.       CustomLineItemChargeDetails:
49.         Percentage:
50.           PercentageValue: 10
51.           ChildAssociatedResources:
52.             - !GetAtt TestBillingGroup.Arn
53.         Type: 'FEE'
```

# CloudFormationFragmentos de plantillas de
<a name="quickref-cloudformation"></a>

**Topics**
+ [Pilas anidadas](#w2aac11c41c23b5)
+ [Condición de espera](#w2aac11c41c23b7)

## Pilas anidadas
<a name="w2aac11c41c23b5"></a>

### Anidación de una pila en una plantilla
<a name="scenario-stack"></a>

Esta plantilla de ejemplo contiene un recurso de pilas anidadas denominadas `myStack`. Cuando CloudFormation crea una pila a partir de la plantilla, crea `myStack`, cuya plantilla se especifica en la propiedad `TemplateURL`. El valor de salida `StackRef` devuelve el ID de pila `myStack` y el valor `OutputFromNestedStack` devuelve el valor de salida `BucketName` desde el recurso `myStack`. El formato `Outputs.nestedstackoutputname` se reserva para especificar valores de salida de pilas anidadas y se puede utilizar en cualquier parte de la plantilla contenedora.

Para obtener más información, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html).

#### JSON
<a name="quickref-cloudformation-example-1.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myStack" : {
 5. 	       "Type" : "AWS::CloudFormation::Stack",
 6. 	       "Properties" : {
 7. 	        "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-1/S3_Bucket.template",
 8.               "TimeoutInMinutes" : "60"
 9. 	       }
10.         }
11.     },
12.     "Outputs": {
13.        "StackRef": {"Value": { "Ref" : "myStack"}},
14.        "OutputFromNestedStack" : {
15.              "Value" : { "Fn::GetAtt" : [ "myStack", "Outputs.BucketName" ] }
16.        }
17.     }
18. }
```

#### YAML
<a name="quickref-cloudformation-example-1.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myStack:
 4.     Type: AWS::CloudFormation::Stack
 5.     Properties:
 6.       TemplateURL: https://s3.amazonaws.com/cloudformation-templates-us-east-1/S3_Bucket.template
 7.       TimeoutInMinutes: '60'
 8. Outputs:
 9.   StackRef:
10.     Value: !Ref myStack
11.   OutputFromNestedStack:
12.     Value: !GetAtt myStack.Outputs.BucketName
```

### Anidar una pila con parámetros de entrada en una plantilla
<a name="scenario-stack-parameters"></a>

Esta plantilla de ejemplo contiene un recurso de un conjunto que especifica parámetros de entrada. Cuando CloudFormation crea una pila a partir de esta plantilla, utiliza los pares de valores declarados dentro de la propiedad `Parameters` como parámetros de entrada para la plantilla utilizada para crear la pila `myStackWithParams`. En este ejemplo, se especifican los parámetros `InstanceType` y `KeyName`.

Para obtener más información, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html).

#### JSON
<a name="quickref-cloudformation-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myStackWithParams" : {
 5.   	       "Type" : "AWS::CloudFormation::Stack",
 6. 	       "Properties" : {
 7. 	           "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2ChooseAMI.template",
 8. 	           "Parameters" : {
 9. 	               "InstanceType" : "t2.micro",
10. 	               "KeyName" : "mykey"
11. 	           }
12.    	       }
13.         }
14.     }
15. }
```

#### YAML
<a name="quickref-cloudformation-example-2.yaml"></a>

```
1. AWSTemplateFormatVersion: '2010-09-09'
2. Resources:
3.   myStackWithParams:
4.     Type: AWS::CloudFormation::Stack
5.     Properties:
6.       TemplateURL: https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2ChooseAMI.template
7.       Parameters:
8.         InstanceType: t2.micro
9.         KeyName: mykey
```

## Condición de espera
<a name="w2aac11c41c23b7"></a>

### Uso de una condición de espera con una instancia Amazon EC2
<a name="scenario-waitcondition"></a>

**importante**  
Con los recursos de Amazon EC2 y Auto Scaling recomendamos que use un atributo CreationPolicy en lugar de condiciones de espera. Agregue un atributo CreationPolicy a esos recursos y use el script de ayuda cfn-signal para señalar que el proceso de creación de instancias ha finalizado satisfactoriamente.

Si no puede utilizar una política de creación, ve la siguiente plantilla de ejemplo, que declara una instancia Amazon EC2 con una condición de espera. La condición de espera `myWaitCondition` utiliza `myWaitConditionHandle` para señalización, utiliza el atributo `DependsOn` para especificar que la condición de espera se activará después de que se haya creado el recurso de la instancia de Amazon EC2 y utiliza la propiedad `Timeout` para especificar una duración de 4500 segundos para la condición de espera. Además, la URL prefirmada que señala la condición de espera se transfiere a la instancia de Amazon EC2 con la propiedad `UserData` del recurso de `Ec2Instance`, lo que permite que se ejecute una aplicación o script en dicha instancia de Amazon EC2 para recuperar la URL prefirmada y emplearla para señalar un éxito o error a la condición de espera. Necesita usar `cfn-signal` o crear la aplicación o script que señale la condición de espera. El valor de salida `ApplicationData` contiene los datos devueltos desde la señal de condición de espera.

Para obtener más información, consulte [Creación de condiciones de espera en una plantilla de CloudFormation](using-cfn-waitcondition.md).

#### JSON
<a name="quickref-cloudformation-example-3.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Mappings" : {
 4.         "RegionMap" : {
 5.             "us-east-1" : {
 6.                 "AMI" : "ami-0123456789abcdef0"
 7.             },
 8.             "us-west-1" : {
 9.                 "AMI" : "ami-0987654321fedcba0"
10.             },
11.             "eu-west-1" : {
12.                 "AMI" : "ami-0abcdef123456789a"
13.             },
14.             "ap-northeast-1" : {
15.                 "AMI" : "ami-0fedcba987654321b"
16.             },
17.             "ap-southeast-1" : {
18.                 "AMI" : "ami-0c1d2e3f4a5b6c7d8"
19.             }
20.         }
21.     },
22.     "Resources" : {
23.         "Ec2Instance" : {
24.             "Type" : "AWS::EC2::Instance",
25.             "Properties" : {
26.                 "UserData" : { "Fn::Base64" : {"Ref" : "myWaitHandle"}},
27.                 "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}
28.             }
29.         },
30.         "myWaitHandle" : {
31.             "Type" : "AWS::CloudFormation::WaitConditionHandle",
32.             "Properties" : {
33.             }
34.         },
35.         "myWaitCondition" : {
36.             "Type" : "AWS::CloudFormation::WaitCondition",
37.             "DependsOn" : "Ec2Instance",
38.             "Properties" : {
39.                 "Handle" : { "Ref" : "myWaitHandle" },
40.                 "Timeout" : "4500"
41.             }
42.         }
43.     },
44.     "Outputs" : {
45.         "ApplicationData" : {
46.             "Value" : { "Fn::GetAtt" : [ "myWaitCondition", "Data" ]},
47.             "Description" : "The data passed back as part of signalling the WaitCondition."
48.         }
49.     }
50. }
```

#### YAML
<a name="quickref-cloudformation-example-3.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Mappings:
 3.   RegionMap:
 4.     us-east-1:
 5.       AMI: ami-0123456789abcdef0
 6.     us-west-1:
 7.       AMI: ami-0987654321fedcba0
 8.     eu-west-1:
 9.       AMI: ami-0abcdef123456789a
10.     ap-northeast-1:
11.       AMI: ami-0fedcba987654321b
12.     ap-southeast-1:
13.       AMI: ami-0c1d2e3f4a5b6c7d8
14. Resources:
15.   Ec2Instance:
16.     Type: AWS::EC2::Instance
17.     Properties:
18.       UserData:
19.         Fn::Base64: !Ref myWaitHandle
20.       ImageId:
21.         Fn::FindInMap:
22.         - RegionMap
23.         - Ref: AWS::Region
24.         - AMI
25.   myWaitHandle:
26.     Type: AWS::CloudFormation::WaitConditionHandle
27.     Properties: {}
28.   myWaitCondition:
29.     Type: AWS::CloudFormation::WaitCondition
30.     DependsOn: Ec2Instance
31.     Properties:
32.       Handle: !Ref myWaitHandle
33.       Timeout: '4500'
34. Outputs:
35.   ApplicationData:
36.     Value: !GetAtt myWaitCondition.Data
37.     Description: The data passed back as part of signalling the WaitCondition.
```

### Uso del script auxiliar cfn-signal para señalar a una condición de espera
<a name="scenario-waitcondition-cfn-signal"></a>

En este ejemplo se muestra una línea de comandos `cfn-signal` que indica el éxito a una condición de espera. Tiene que definir la línea de comandos en la propiedad `UserData` de la instancia de EC2.

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

```
"UserData": {
  "Fn::Base64": {
    "Fn::Join": [
      "", 
      [
         "#!/bin/bash -xe\n",
         "/opt/aws/bin/cfn-signal --exit-code 0 '", 
         {
           "Ref": "myWaitHandle"
         },
         "'\n"
      ]   
    ]
  }
}
```

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

```
UserData:
  Fn::Base64: !Sub |
    #!/bin/bash -xe
    /opt/aws/bin/cfn-signal --exit-code 0 '${myWaitHandle}'
```

### Uso de Curl para señalar una condición de espera
<a name="scenario-waitcondition-curl"></a>

En este ejemplo se muestra una línea de comandos Curl que indica el éxito a una condición de espera.

```
1. curl -T /tmp/a "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
```

Donde el archivo /tmp/a contiene la siguiente estructura JSON:

```
1. {
2.   "Status" : "SUCCESS",
3.   "Reason" : "Configuration Complete",
4.   "UniqueId" : "ID1234",
5.   "Data" : "Application has completed configuration."
6. }
```

En este ejemplo se muestra una línea de comandos Curl que envía la misma señal de éxito, salvo que envía la señal JSON como parámetro en la línea de comandos.

```
1. curl -X PUT -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
```

# Fragmentos de código de plantillas de Amazon CloudFront
<a name="quickref-cloudfront"></a>

Utilice estos fragmentos de código de plantillas de ejemplo con su recurso de distribución de Amazon CloudFront en CloudFormation. Para obtener más información, consulte [Amazon CloudFront resource type reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudFront.html).

**Topics**
+ [Recurso de distribución de Amazon CloudFront con origen Amazon S3](#scenario-cloudfront-s3origin)
+ [Recurso de distribución de Amazon CloudFront con origen personalizado](#scenario-cloudfront-customorigin)
+ [Distribución de Amazon CloudFront con soporte de origen múltiple](#scenario-cloudfront-multiorigin)
+ [Distribución de Amazon CloudFront con una función de Lambda como origen](#scenario-cloudfront-lambda-origin)
+ [Véase también](#w2aac11c41c27c15)

## Recurso de distribución de Amazon CloudFront con origen Amazon S3
<a name="scenario-cloudfront-s3origin"></a>

En la siguiente plantilla de ejemplo se muestra una [distribución](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) de Amazon CloudFront mediante un identidad de acceso de origen (OAI) heredada y [S3Origin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-s3originconfig.html). Para obtener información acerca de cómo utilizar un control de acceso de origen (OAC) en su lugar, consulte [Restricción del acceso a un origen de Amazon Simple Storage Service](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) en la *Guía para desarrolladores de Amazon CloudFront*.

### JSON
<a name="quickref-cloudfront-example-1.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myDistribution" : {
 5.             "Type" : "AWS::CloudFront::Distribution",
 6.             "Properties" : {
 7.                 "DistributionConfig" : {
 8.                     "Origins" : [ {
 9.                         "DomainName" : "amzn-s3-demo-bucket.s3.amazonaws.com",
10.                         "Id" : "myS3Origin",
11.                         "S3OriginConfig" : {
12.                             "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
13.                         }
14.                     }],
15.                     "Enabled" : "true",
16.                     "Comment" : "Some comment",
17.                     "DefaultRootObject" : "index.html",
18.                     "Logging" : {
19.                         "IncludeCookies" : "false",
20.                         "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
21.                         "Prefix" : "myprefix"
22.                     },
23.                     "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],
24.                     "DefaultCacheBehavior" : {
25.                         "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
26.                         "TargetOriginId" : "myS3Origin",
27.                         "ForwardedValues" : {
28.                             "QueryString" : "false",
29.                             "Cookies" : { "Forward" : "none" }
30.                         },
31.                         "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
32.                         "ViewerProtocolPolicy" : "allow-all"
33.                     },
34.                    "PriceClass" : "PriceClass_200",
35.                    "Restrictions" : {
36.                        "GeoRestriction" : {
37.                            "RestrictionType" : "whitelist",
38.                            "Locations" : [ "AQ", "CV" ]
39.                        }
40.                    },
41.                    "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }  
42.                 }
43.             }
44.         }
45.     }
46. }
```

### YAML
<a name="quickref-cloudfront-example-1.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myDistribution:
 4.     Type: AWS::CloudFront::Distribution
 5.     Properties:
 6.       DistributionConfig:
 7.         Origins:
 8.         - DomainName: amzn-s3-demo-bucket.s3.amazonaws.com
 9.           Id: myS3Origin
10.           S3OriginConfig:
11.             OriginAccessIdentity: origin-access-identity/cloudfront/E127EXAMPLE51Z
12.         Enabled: 'true'
13.         Comment: Some comment
14.         DefaultRootObject: index.html
15.         Logging:
16.           IncludeCookies: 'false'
17.           Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
18.           Prefix: myprefix
19.         Aliases:
20.         - mysite.example.com
21.         - yoursite.example.com
22.         DefaultCacheBehavior:
23.           AllowedMethods:
24.           - DELETE
25.           - GET
26.           - HEAD
27.           - OPTIONS
28.           - PATCH
29.           - POST
30.           - PUT
31.           TargetOriginId: myS3Origin
32.           ForwardedValues:
33.             QueryString: 'false'
34.             Cookies:
35.               Forward: none
36.           TrustedSigners:
37.           - 1234567890EX
38.           - 1234567891EX
39.           ViewerProtocolPolicy: allow-all
40.         PriceClass: PriceClass_200
41.         Restrictions:
42.           GeoRestriction:
43.             RestrictionType: whitelist
44.             Locations:
45.             - AQ
46.             - CV
47.         ViewerCertificate:
48.           CloudFrontDefaultCertificate: 'true'
```

## Recurso de distribución de Amazon CloudFront con origen personalizado
<a name="scenario-cloudfront-customorigin"></a>

La siguiente plantilla de ejemplo muestra una [Distribución](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) de Amazon CloudFront mediante un [CustomOrigin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-customoriginconfig.html).

### JSON
<a name="quickref-cloudfront-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myDistribution" : {
 5.             "Type" : "AWS::CloudFront::Distribution",
 6.             "Properties" : {
 7.                 "DistributionConfig" : {
 8.                     "Origins" : [ {
 9.                             "DomainName" : "www.example.com",
10.                             "Id" : "myCustomOrigin",
11.                             "CustomOriginConfig" : {
12.                                 "HTTPPort" : "80",
13.                                 "HTTPSPort" : "443",
14.                                 "OriginProtocolPolicy" : "http-only"
15.                             }
16.                     } ],
17.                     "Enabled" : "true",
18.                     "Comment" : "Somecomment",
19.                     "DefaultRootObject" : "index.html",
20.                     "Logging" : {
21.                         "IncludeCookies" : "true",
22.                         "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
23.                         "Prefix": "myprefix"
24.                     },
25.                     "Aliases" : [
26.                         "mysite.example.com",
27.                         "*.yoursite.example.com"
28.                     ],
29.                     "DefaultCacheBehavior" : {
30.                         "TargetOriginId" : "myCustomOrigin",
31.                         "SmoothStreaming" : "false",  
32.                         "ForwardedValues" : {
33.                             "QueryString" : "false",
34.                             "Cookies" : { "Forward" : "all" }
35.                         },
36.                         "TrustedSigners" : [
37.                             "1234567890EX",
38.                             "1234567891EX"
39.                         ],
40.                         "ViewerProtocolPolicy" : "allow-all"
41.                     },
42.                     "CustomErrorResponses" : [ {
43.                         "ErrorCode" : "404",
44.                         "ResponsePagePath" : "/error-pages/404.html",
45.                         "ResponseCode" : "200",
46.                         "ErrorCachingMinTTL" : "30"
47.                     } ],
48.                    "PriceClass" : "PriceClass_200",
49.                    "Restrictions" : {
50.                        "GeoRestriction" : {
51.                            "RestrictionType" : "whitelist",
52.                            "Locations" : [ "AQ", "CV" ]
53.                        }
54.                    },
55.                    "ViewerCertificate": { "CloudFrontDefaultCertificate" : "true" }
56.                 }
57.             }
58.         }
59.     }
60. }
```

### YAML
<a name="quickref-cloudfront-example-2.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myDistribution:
 4.     Type: AWS::CloudFront::Distribution
 5.     Properties:
 6.       DistributionConfig:
 7.         Origins:
 8.         - DomainName: www.example.com
 9.           Id: myCustomOrigin
10.           CustomOriginConfig:
11.             HTTPPort: '80'
12.             HTTPSPort: '443'
13.             OriginProtocolPolicy: http-only
14.         Enabled: 'true'
15.         Comment: Somecomment
16.         DefaultRootObject: index.html
17.         Logging:
18.           IncludeCookies: 'true'
19.           Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
20.           Prefix: myprefix
21.         Aliases:
22.         - mysite.example.com
23.         - "*.yoursite.example.com"
24.         DefaultCacheBehavior:
25.           TargetOriginId: myCustomOrigin
26.           SmoothStreaming: 'false'
27.           ForwardedValues:
28.             QueryString: 'false'
29.             Cookies:
30.               Forward: all
31.           TrustedSigners:
32.           - 1234567890EX
33.           - 1234567891EX
34.           ViewerProtocolPolicy: allow-all
35.         CustomErrorResponses:
36.         - ErrorCode: '404'
37.           ResponsePagePath: "/error-pages/404.html"
38.           ResponseCode: '200'
39.           ErrorCachingMinTTL: '30'
40.         PriceClass: PriceClass_200
41.         Restrictions:
42.           GeoRestriction:
43.             RestrictionType: whitelist
44.             Locations:
45.             - AQ
46.             - CV
47.         ViewerCertificate:
48.           CloudFrontDefaultCertificate: 'true'
```

## Distribución de Amazon CloudFront con soporte de origen múltiple
<a name="scenario-cloudfront-multiorigin"></a>

La siguiente plantilla de ejemplo muestra cómo declarar una [Distribución](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) de CloudFront con soporte de origen múltiple. En la [DistributionConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-distributionconfig.html), se proporciona una lista de orígenes y se establece un [DefaultCacheBehavior](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-defaultcachebehavior.html).

### JSON
<a name="quickref-cloudfront-example-3.json"></a>

```
{
    "AWSTemplateFormatVersion" : "2010-09-09",
    "Resources" : {
        "myDistribution" : {
            "Type" : "AWS::CloudFront::Distribution",
            "Properties" : {
                "DistributionConfig" : {
                    "Origins" : [ {
                        "Id" : "myS3Origin",
                        "DomainName" : "amzn-s3-demo-bucket.s3.amazonaws.com",
                        "S3OriginConfig" : {
                            "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
                        }
                     }, 
                     {
                         "Id" : "myCustomOrigin",
                         "DomainName" : "www.example.com",
                         "CustomOriginConfig" : {
                             "HTTPPort" : "80",
                             "HTTPSPort" : "443",
                             "OriginProtocolPolicy" : "http-only"
                         }
                     }
                   ],
                   "Enabled" : "true",
                   "Comment" : "Some comment",
                   "DefaultRootObject" : "index.html", 
                   "Logging" : {
                       "IncludeCookies" : "true",
                       "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
                       "Prefix" : "myprefix"
                   },            
                   "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],
                   "DefaultCacheBehavior" : {
                       "TargetOriginId" : "myS3Origin",
                       "ForwardedValues" : {
                           "QueryString" : "false",
                           "Cookies" : { "Forward" : "all" }
                        },
                       "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                       "ViewerProtocolPolicy" : "allow-all",
                       "MinTTL" : "100",
                       "SmoothStreaming" : "true"
                   },
                   "CacheBehaviors" : [ {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myS3Origin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images1/*.jpg"
                        }, 
                        {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myCustomOrigin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images2/*.jpg"
                        }
                   ],
                   "CustomErrorResponses" : [ {
                       "ErrorCode" : "404",
                       "ResponsePagePath" : "/error-pages/404.html",
                       "ResponseCode" : "200",
                       "ErrorCachingMinTTL" : "30"
                   } ],
                   "PriceClass" : "PriceClass_All",
                   "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }
                }
            }
        }
    }
}
```

### YAML
<a name="quickref-cloudfront-example-3.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
        - Id: myS3Origin
          DomainName: amzn-s3-demo-bucket.s3.amazonaws.com
          S3OriginConfig:
            OriginAccessIdentity: origin-access-identity/cloudfront/E127EXAMPLE51Z
        - Id: myCustomOrigin
          DomainName: www.example.com
          CustomOriginConfig:
            HTTPPort: '80'
            HTTPSPort: '443'
            OriginProtocolPolicy: http-only
        Enabled: 'true'
        Comment: Some comment
        DefaultRootObject: index.html
        Logging:
          IncludeCookies: 'true'
          Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
          Prefix: myprefix
        Aliases:
        - mysite.example.com
        - yoursite.example.com
        DefaultCacheBehavior:
          TargetOriginId: myS3Origin
          ForwardedValues:
            QueryString: 'false'
            Cookies:
              Forward: all
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '100'
          SmoothStreaming: 'true'
        CacheBehaviors:
        - AllowedMethods:
          - DELETE
          - GET
          - HEAD
          - OPTIONS
          - PATCH
          - POST
          - PUT
          TargetOriginId: myS3Origin
          ForwardedValues:
            QueryString: 'true'
            Cookies:
              Forward: none
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '50'
          PathPattern: images1/*.jpg
        - AllowedMethods:
          - DELETE
          - GET
          - HEAD
          - OPTIONS
          - PATCH
          - POST
          - PUT
          TargetOriginId: myCustomOrigin
          ForwardedValues:
            QueryString: 'true'
            Cookies:
              Forward: none
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '50'
          PathPattern: images2/*.jpg
        CustomErrorResponses:
        - ErrorCode: '404'
          ResponsePagePath: "/error-pages/404.html"
          ResponseCode: '200'
          ErrorCachingMinTTL: '30'
        PriceClass: PriceClass_All
        ViewerCertificate:
          CloudFrontDefaultCertificate: 'true'
```

## Distribución de Amazon CloudFront con una función de Lambda como origen
<a name="scenario-cloudfront-lambda-origin"></a>

En el siguiente ejemplo se crea una distribución de CloudFront que sirve de frente para la URL de una función de Lambda especificada (que se proporciona como parámetro), lo que permite el acceso solo mediante HTTPS, el almacenamiento en caché, la compresión y la entrega global. Configura la URL de Lambda como un origen HTTPS personalizado y aplica una política de almacenamiento en caché de AWS estándar. La distribución está optimizada para el rendimiento con compatibilidad con HTTP/2 e IPv6 y muestra el nombre de dominio de CloudFront, lo que permite a los usuarios acceder a la función de Lambda a través de un punto de conexión seguro respaldado por una CDN. Para obtener más información, consulte [Using Amazon CloudFront with AWS Lambda as origin to accelerate your web applications](https://aws.amazon.com/blogs/networking-and-content-delivery/using-amazon-cloudfront-with-aws-lambda-as-origin-to-accelerate-your-web-applications/) en el blog de AWS.

### JSON
<a name="quickref-cloudfront-example-lambda-origin.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "LambdaEndpoint": {
            "Type": "String",
            "Description": "The Lambda function URL endpoint without the 'https://'"
        }
    },
    "Resources": {
        "MyDistribution": {
            "Type": "AWS::CloudFront::Distribution",
            "Properties": {
                "DistributionConfig": {
                    "PriceClass": "PriceClass_All",
                    "HttpVersion": "http2",
                    "IPV6Enabled": true,
                    "Origins": [
                        {
                            "DomainName": {
                                "Ref": "LambdaEndpoint"
                            },
                            "Id": "LambdaOrigin",
                            "CustomOriginConfig": {
                                "HTTPSPort": 443,
                                "OriginProtocolPolicy": "https-only"
                            }
                        }
                    ],
                    "Enabled": "true",
                    "DefaultCacheBehavior": {
                        "TargetOriginId": "LambdaOrigin",
                        "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
                        "ViewerProtocolPolicy": "redirect-to-https",
                        "SmoothStreaming": "false",
                        "Compress": "true"
                    }
                }
            }
        }
    },
    "Outputs": {
        "CloudFrontDomain": {
            "Description": "CloudFront default domain name configured",
            "Value": {
                "Fn::Sub": "https://${MyDistribution.DomainName}/"
            }
        }
    }
}
```

### YAML
<a name="quickref-cloudfront-example-lambda-origin.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  LambdaEndpoint:
    Type: String
    Description: The Lambda function URL endpoint without the 'https://'
Resources:
  MyDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        PriceClass: PriceClass_All
        HttpVersion: http2
        IPV6Enabled: true
        Origins:
        - DomainName: !Ref LambdaEndpoint
          Id: LambdaOrigin
          CustomOriginConfig:
            HTTPSPort: 443
            OriginProtocolPolicy: https-only
        Enabled: 'true'
        DefaultCacheBehavior:
          TargetOriginId: LambdaOrigin
          CachePolicyId: '658327ea-f89d-4fab-a63d-7e88639e58f6'
          ViewerProtocolPolicy: redirect-to-https
          SmoothStreaming: 'false'
          Compress: 'true'
Outputs:
  CloudFrontDomain:
    Description: CloudFront default domain name configured
    Value: !Sub https://${MyDistribution.DomainName}/
```

## Véase también
<a name="w2aac11c41c27c15"></a>

Para ver un ejemplo de cómo agregar un alias personalizado a un registro de Route 53 para crear un nombre descriptivo para una distribución de CloudFront, consulte [Conjunto de registros de recursos de alias para una distribución de CloudFront](quickref-route53.md#scenario-user-friendly-url-for-cloudfront-distribution).

# Fragmentos de código de plantillas de Amazon CloudWatch
<a name="quickref-cloudwatch"></a>

Use estos ejemplos de fragmentos de código de plantillas para describir los recursos de Amazon CloudWatch en CloudFormation. Para obtener más información, consulte la [Referencia del tipo de recurso de Amazon CloudWatch](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudWatch.html).

**Topics**
+ [Alarma de facturación](#cloudwatch-sample-billing-alarm)
+ [Alarma de utilización de la CPU](#cloudwatch-sample-cpu-utilization-alarm)
+ [Recuperación de una instancia Amazon Elastic Compute Cloud](#cloudwatch-sample-recover-instance)
+ [Creación de un panel básico](#cloudwatch-sample-dashboard-basic)
+ [Creación de un panel con widgets en paralelo](#cloudwatch-sample-dashboard-sidebyside)

## Alarma de facturación
<a name="cloudwatch-sample-billing-alarm"></a>

En el siguiente ejemplo, Amazon CloudWatch envía una notificación por correo electrónico cuando los cargos de una cuenta de AWS superan el umbral de alarma. Para recibir notificaciones de uso, habilite las alertas de facturación. Para obtener más información, consulte [Crear una alarma de facturación para supervisar los cargos estimados de AWS](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) en la *Guía del usuario de Amazon CloudWatch*.>

### JSON
<a name="quickref-cloudwatch-example-1.json"></a>

```
"SpendingAlarm": {
  "Type": "AWS::CloudWatch::Alarm",
  "Properties": {
    "AlarmDescription": { "Fn::Join": ["", [
      "Alarm if AWS spending is over $",
      { "Ref": "AlarmThreshold" }
    ]]},
    "Namespace": "AWS/Billing",
    "MetricName": "EstimatedCharges",
    "Dimensions": [{
      "Name": "Currency",
      "Value" : "USD"
    }],
    "Statistic": "Maximum",
    "Period": "21600",
    "EvaluationPeriods": "1",
    "Threshold": { "Ref": "AlarmThreshold" },
    "ComparisonOperator": "GreaterThanThreshold",
    "AlarmActions": [{
      "Ref": "BillingAlarmNotification"
    }],
    "InsufficientDataActions": [{
      "Ref": "BillingAlarmNotification"
    }]
  }
}
```

### YAML
<a name="quickref-cloudwatch-example-1.yaml"></a>

```
SpendingAlarm:
  Type: AWS::CloudWatch::Alarm
  Properties:
    AlarmDescription: 
      'Fn::Join':
        - ''
        - - Alarm if AWS spending is over $
          - !Ref: AlarmThreshold
    Namespace: AWS/Billing
    MetricName: EstimatedCharges
    Dimensions:
    - Name: Currency
      Value: USD
    Statistic: Maximum
    Period: '21600'
    EvaluationPeriods: '1'
    Threshold:
      !Ref: "AlarmThreshold"
    ComparisonOperator: GreaterThanThreshold
    AlarmActions:
    - !Ref: "BillingAlarmNotification"
    InsufficientDataActions:
    - !Ref: "BillingAlarmNotification"
```

## Alarma de utilización de la CPU
<a name="cloudwatch-sample-cpu-utilization-alarm"></a>

El siguiente fragmento de código de ejemplo crea una alarma que envía una notificación cuando el uso promedio de la CPU de una instancia Amazon EC2 supera el 90 por ciento durante más de 60 segundos durante tres periodos de evaluación.

### JSON
<a name="quickref-cloudwatch-example-2.json"></a>

```
 1. "CPUAlarm" : {
 2.   "Type" : "AWS::CloudWatch::Alarm",
 3.   "Properties" : {
 4.     "AlarmDescription" : "CPU alarm for my instance",
 5.     "AlarmActions" : [ { "Ref" : "logical name of an AWS::SNS::Topic resource" } ],
 6.     "MetricName" : "CPUUtilization",
 7.     "Namespace" : "AWS/EC2",
 8.     "Statistic" : "Average",
 9.     "Period" : "60",
10.     "EvaluationPeriods" : "3",
11.     "Threshold" : "90",
12.     "ComparisonOperator" : "GreaterThanThreshold",
13.     "Dimensions" : [ {
14.       "Name" : "InstanceId",
15.       "Value" : { "Ref" : "logical name of an AWS::EC2::Instance resource" }
16.     } ]
17.   }
18. }
```

### YAML
<a name="quickref-cloudwatch-example-2.yaml"></a>

```
 1. CPUAlarm:
 2.   Type: AWS::CloudWatch::Alarm
 3.   Properties:
 4.     AlarmDescription: CPU alarm for my instance
 5.     AlarmActions:
 6.     - !Ref: "logical name of an AWS::SNS::Topic resource"
 7.     MetricName: CPUUtilization
 8.     Namespace: AWS/EC2
 9.     Statistic: Average
10.     Period: '60'
11.     EvaluationPeriods: '3'
12.     Threshold: '90'
13.     ComparisonOperator: GreaterThanThreshold
14.     Dimensions:
15.     - Name: InstanceId
16.       Value: !Ref: "logical name of an AWS::EC2::Instance resource"
```

## Recuperación de una instancia Amazon Elastic Compute Cloud
<a name="cloudwatch-sample-recover-instance"></a>

La siguiente alarma de CloudWatch recupera una instancia de EC2 cuando presenta errores de comprobación de estado durante 15 minutos seguidos. Para obtener más información acerca de las acciones de alarma, consulte [Crear alarmas para detener, terminar, reiniciar o recuperar una instancia de EC2](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/UsingAlarmActions.html) en la *Guía del usuario de Amazon CloudWatch*.

### JSON
<a name="quickref-cloudwatch-example-3.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters" : {
    "RecoveryInstance" : {
      "Description" : "The EC2 instance ID to associate this alarm with.",
      "Type" : "AWS::EC2::Instance::Id"
    }
  },
  "Resources": {
    "RecoveryTestAlarm": {
      "Type": "AWS::CloudWatch::Alarm",
      "Properties": {
        "AlarmDescription": "Trigger a recovery when instance status check fails for 15 consecutive minutes.",
        "Namespace": "AWS/EC2" ,
        "MetricName": "StatusCheckFailed_System",
        "Statistic": "Minimum",
        "Period": "60",
        "EvaluationPeriods": "15",
        "ComparisonOperator": "GreaterThanThreshold",
        "Threshold": "0",
        "AlarmActions": [ {"Fn::Join" : ["", ["arn:aws:automate:", { "Ref" : "AWS::Region" }, ":ec2:recover" ]]} ],
        "Dimensions": [{"Name": "InstanceId","Value": {"Ref": "RecoveryInstance"}}]
      }
    }
  }
}
```

### YAML
<a name="quickref-cloudwatch-example-3.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  RecoveryInstance:
    Description: The EC2 instance ID to associate this alarm with.
    Type: AWS::EC2::Instance::Id
Resources:
  RecoveryTestAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: Trigger a recovery when instance status check fails for 15
        consecutive minutes.
      Namespace: AWS/EC2
      MetricName: StatusCheckFailed_System
      Statistic: Minimum
      Period: '60'
      EvaluationPeriods: '15'
      ComparisonOperator: GreaterThanThreshold
      Threshold: '0'
      AlarmActions: [ !Sub "arn:aws:automate:${AWS::Region}:ec2:recover" ]
      Dimensions:
      - Name: InstanceId
        Value: !Ref: RecoveryInstance
```

## Creación de un panel básico
<a name="cloudwatch-sample-dashboard-basic"></a>

El siguiente ejemplo crea un panel de CloudWatch sencillo con un widget de métrica que muestra la utilización de CPU, y un widget de texto que muestra un mensaje.

### JSON
<a name="quickref-cloudwatch-sample-dashboard-basic.json"></a>

```
{
    "BasicDashboard": {
        "Type": "AWS::CloudWatch::Dashboard",
        "Properties": {
            "DashboardName": "Dashboard1",
            "DashboardBody": "{\"widgets\":[{\"type\":\"metric\",\"x\":0,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/EC2\",\"CPUUtilization\",\"InstanceId\",\"i-012345\"]],\"period\":300,\"stat\":\"Average\",\"region\":\"us-east-1\",\"title\":\"EC2 Instance CPU\"}},{\"type\":\"text\",\"x\":0,\"y\":7,\"width\":3,\"height\":3,\"properties\":{\"markdown\":\"Hello world\"}}]}"
        }
    }
}
```

### YAML
<a name="quickref-cloudwatch-sample-dashboard-basic.yaml"></a>

```
BasicDashboard:
  Type: AWS::CloudWatch::Dashboard
  Properties:
    DashboardName: Dashboard1
    DashboardBody: '{"widgets":[{"type":"metric","x":0,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-012345"]],"period":300,"stat":"Average","region":"us-east-1","title":"EC2 Instance CPU"}},{"type":"text","x":0,"y":7,"width":3,"height":3,"properties":{"markdown":"Hello world"}}]}'
```

## Creación de un panel con widgets en paralelo
<a name="cloudwatch-sample-dashboard-sidebyside"></a>

El siguiente ejemplo crea un panel con dos widgets de métricas que aparecen uno al lado del otro.

### JSON
<a name="quickref-cloudwatch-sample-dashboard-sidebyside.json"></a>

```
{
    "DashboardSideBySide": {
        "Type": "AWS::CloudWatch::Dashboard",
        "Properties": {
            "DashboardName": "Dashboard1",
            "DashboardBody": "{\"widgets\":[{\"type\":\"metric\",\"x\":0,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/EC2\",\"CPUUtilization\",\"InstanceId\",\"i-012345\"]],\"period\":300,\"stat\":\"Average\",\"region\":\"us-east-1\",\"title\":\"EC2 Instance CPU\"}},{\"type\":\"metric\",\"x\":12,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/S3\",\"BucketSizeBytes\",\"BucketName\",\"amzn-s3-demo-bucket\"]],\"period\":86400,\"stat\":\"Maximum\",\"region\":\"us-east-1\",\"title\":\"amzn-s3-demo-bucket bytes\"}}]}"
        }
    }
}
```

### YAML
<a name="quickref-cloudwatch-sample-dashboard-sidebysidequickref-cloudwatch-sample-dashboard-sidebyside.yaml"></a>

```
DashboardSideBySide:
  Type: AWS::CloudWatch::Dashboard
  Properties:
    DashboardName: Dashboard1
    DashboardBody: '{"widgets":[{"type":"metric","x":0,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-012345"]],"period":300,"stat":"Average","region":"us-east-1","title":"EC2 Instance CPU"}},{"type":"metric","x":12,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/S3","BucketSizeBytes","BucketName","amzn-s3-demo-bucket"]],"period":86400,"stat":"Maximum","region":"us-east-1","title":"amzn-s3-demo-bucket bytes"}}]}'
```

# Fragmentos de la plantilla de Amazon CloudWatch Logs
<a name="quickref-cloudwatchlogs"></a>

Amazon CloudWatch Logs puede monitorizar sus archivos de registro personalizados, de las aplicaciones y del sistema desde instancias Amazon EC2 u otros orígenes. Puede usar CloudFormation para aprovisionar y administrar grupos de registro y filtros de métricas. Para obtener más información acerca de Registros de Amazon CloudWatch, consulte la [Guía del usuario de Registros de Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html).

**Topics**
+ [Enviar registros a CloudWatch Logs desde una instancia Linux](#quickref-cloudwatchlogs-example1)
+ [Enviar registros a CloudWatch Logs desde una instancia Windows](#quickref-cloudwatchlogs-example2)
+ [Véase también](#w2aac11c41c35c11)

## Enviar registros a CloudWatch Logs desde una instancia Linux
<a name="quickref-cloudwatchlogs-example1"></a>

La siguiente plantilla muestra cómo configurar un servidor web en Amazon Linux 2023 con la integración de Registros de CloudWatch. La plantilla realiza las siguientes tareas:
+ Instala Apache y PHP.
+ Configura el agente de CloudWatch para reenviar los registros de acceso de Apache a Registros de CloudWatch.
+ Configura un rol de IAM para permitir al agente de CloudWatch enviar datos de registro a Registros de CloudWatch.
+ Crea alarmas y notificaciones personalizadas para detectar errores 404 o un uso elevado del ancho de banda.

Los eventos de registro del servidor web proporcionan datos de métricas para las alarmas de CloudWatch. Los dos filtros de métrica describen cómo la información de registro se transforma en métricas de CloudWatch. La métrica 404 cuenta el número de casos de 404. La métrica de tamaño métrica controla el tamaño de una solicitud. Las dos alarmas de CloudWatch enviarán notificaciones si hay más de dos 404 en un plazo de 2 minutos o si el tamaño de solicitud media es de más de 3500 KB en 10 minutos.

### JSON
<a name="quickref-cloudwatchlogs-example.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Sample template that sets up and configures CloudWatch Logs on Amazon Linux 2023 instance.",
    "Parameters": {
        "KeyName": {
            "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },
        "SSHLocation": {
            "Description": "The IP address range that can be used to SSH to the EC2 instances",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
            "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
        },
        "OperatorEmail": {
            "Description": "Email address to notify when CloudWatch alarms are triggered (404 errors or high bandwidth usage)",
            "Type": "String"
        }
    },
    "Resources": {
        "LogRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "LogRolePolicy",
                        "PolicyDocument": {
                            "Version": "2012-10-17",		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:PutLogEvents",
                                        "logs:DescribeLogStreams",
                                        "logs:DescribeLogGroups",
                                        "logs:CreateLogGroup",
                                        "logs:CreateLogStream"
                                    ],
                                    "Resource": "*"
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "LogRoleInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Path": "/",
                "Roles": [{"Ref": "LogRole"}]
            }
        },
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable HTTP access via port 80 and SSH access via port 22",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": {"Ref": "SSHLocation"}
                    }
                ]
            }
        },
        "WebServerHost": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "Comment": "Install a simple PHP application on Amazon Linux 2023",
                "AWS::CloudFormation::Init": {
                    "config": {
                        "packages": {
                            "dnf": {
                                "httpd": [],
                                "php": [],
                                "php-fpm": []
                            }
                        },
                        "files": {
                            "/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json": {
                                "content": {
                                    "logs": {
                                        "logs_collected": {
                                            "files": {
                                                "collect_list": [{
                                                    "file_path": "/var/log/httpd/access_log",
                                                    "log_group_name": {"Ref": "WebServerLogGroup"},
                                                    "log_stream_name": "{instance_id}/apache.log",
                                                    "timestamp_format": "%d/%b/%Y:%H:%M:%S %z"
                                                }]
                                            }
                                        }
                                    }
                                },
                                "mode": "000644",
                                "owner": "root",
                                "group": "root"
                            },
                            "/var/www/html/index.php": {
                                "content": "<?php\necho '<h1>AWS CloudFormation sample PHP application on Amazon Linux 2023</h1>';\n?>\n",
                                "mode": "000644",
                                "owner": "apache",
                                "group": "apache"
                            },
                            "/etc/cfn/cfn-hup.conf": {
                                "content":  {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[main]\n",
                                            "stack=",
                                            {"Ref": "AWS::StackId"},
                                            "\n",
                                            "region=",
                                            {"Ref": "AWS::Region"},
                                            "\n"
                                        ]
                                    ]
                                },
                                "mode": "000400",
                                "owner": "root",
                                "group": "root"
                            },
                            "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[cfn-auto-reloader-hook]\n",
                                            "triggers=post.update\n",
                                            "path=Resources.WebServerHost.Metadata.AWS::CloudFormation::Init\n",
                                            "action=/opt/aws/bin/cfn-init -s ",
                                            {"Ref": "AWS::StackId"},
                                            " -r WebServerHost ",
                                            " --region     ",
                                            {"Ref": "AWS::Region"},
                                            "\n",
                                            "runas=root\n"
                                        ]
                                    ]
                                }
                            }
                        },
                        "services": {
                            "systemd": {
                                "httpd": {
                                    "enabled": "true",
                                    "ensureRunning": "true"
                                },
                                "php-fpm": {
                                    "enabled": "true",
                                    "ensureRunning": "true"
                                }
                            }
                        }
                    }
                }
            },
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT5M"
                }
            },
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
                "KeyName": {"Ref": "KeyName"},
                "InstanceType": "t3.micro",
                "SecurityGroupIds": [{"Ref": "WebServerSecurityGroup"}],
                "IamInstanceProfile": {"Ref": "LogRoleInstanceProfile"},
                "UserData": {"Fn::Base64": {"Fn::Join": [ "", [
                    "#!/bin/bash\n",
                    "dnf update -y aws-cfn-bootstrap\n",
                    "dnf install -y amazon-cloudwatch-agent\n",
                    "/opt/aws/bin/cfn-init -v --stack ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, "\n",
                    "\n",
                    "# Verify Apache log directory exists and create if needed\n",
                    "mkdir -p /var/log/httpd\n",
                    "\n",
                    "# Start CloudWatch agent\n",
                    "/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json -s\n",
                    "\n",
                    "# Signal success\n",
                    "/opt/aws/bin/cfn-signal -e $? --stack ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, "\n"
                ]]}}
            }
        },
        "WebServerLogGroup": {
            "Type": "AWS::Logs::LogGroup",
            "DeletionPolicy": "Retain",
            "UpdateReplacePolicy": "Retain",
            "Properties": {
                "RetentionInDays": 7
            }
        },
        "404MetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "WebServerLogGroup"},
                "FilterPattern": "[ip, identity, user_id, timestamp, request, status_code = 404, size, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "1",
                        "MetricNamespace": "test/404s",
                        "MetricName": "test404Count"
                    }
                ]
            }
        },
        "BytesTransferredMetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "WebServerLogGroup"},
                "FilterPattern": "[ip, identity, user_id, timestamp, request, status_code, size, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "$size",
                        "MetricNamespace": "test/BytesTransferred",
                        "MetricName": "testBytesTransferred"
                    }
                ]
            }
        },
        "404Alarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The number of 404s is greater than 2 over 2 minutes",
                "MetricName": "test404Count",
                "Namespace": "test/404s",
                "Statistic": "Sum",
                "Period": "60",
                "EvaluationPeriods": "2",
                "Threshold": "2",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "BandwidthAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The average volume of traffic is greater 3500 KB over 10 minutes",
                "MetricName": "testBytesTransferred",
                "Namespace": "test/BytesTransferred",
                "Statistic": "Average",
                "Period": "300",
                "EvaluationPeriods": "2",
                "Threshold": "3500",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "AlarmNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "Subscription": [{"Endpoint": {"Ref": "OperatorEmail"}, "Protocol": "email"}]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Description": "The instance ID of the web server",
            "Value": {"Ref": "WebServerHost"}
        },
        "WebsiteURL": {
            "Value": {"Fn::Sub": "http://${WebServerHost.PublicDnsName}"},
            "Description": "URL for the web server"
        },
        "PublicIP": {
            "Description": "Public IP address of the web server",
            "Value": {"Fn::GetAtt": ["WebServerHost","PublicIp"]
            }
        },
        "CloudWatchLogGroupName": {
            "Description": "The name of the CloudWatch log group",
            "Value": {"Ref": "WebServerLogGroup"}
        }
    }
}
```

### YAML
<a name="quickref-cloudwatchlogs-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: Sample template that sets up and configures CloudWatch Logs on Amazon Linux 2023 instance.
Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  OperatorEmail:
    Description: Email address to notify when CloudWatch alarms are triggered (404 errors or high bandwidth usage)
    Type: String
Resources:
  LogRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: LogRolePolicy
          PolicyDocument:
            Version: 2012-10-17		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:PutLogEvents'
                  - 'logs:DescribeLogStreams'
                  - 'logs:DescribeLogGroups'
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                Resource: '*'
  LogRoleInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref LogRole
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
  WebServerHost:
    Type: AWS::EC2::Instance
    Metadata:
      Comment: Install a simple PHP application on Amazon Linux 2023
      'AWS::CloudFormation::Init':
        config:
          packages:
            dnf:
              httpd: []
              php: []
              php-fpm: []
          files:
            /etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json:
              content: !Sub |
                {
                  "logs": {
                    "logs_collected": {
                      "files": {
                        "collect_list": [
                          {
                            "file_path": "/var/log/httpd/access_log",
                            "log_group_name": "${WebServerLogGroup}",
                            "log_stream_name": "{instance_id}/apache.log",
                            "timestamp_format": "%d/%b/%Y:%H:%M:%S %z"
                          }
                        ]
                      }
                    }
                  }
                }
              mode: '000644'
              owner: root
              group: root
            /var/www/html/index.php:
              content: |
                <?php echo '<h1>AWS CloudFormation sample PHP application on Amazon Linux 2023</h1>';
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerHost.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerHost --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              php-fpm:
                enabled: 'true'
                ensureRunning: 'true'
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      KeyName: !Ref KeyName
      InstanceType: t3.micro
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      IamInstanceProfile: !Ref LogRoleInstanceProfile
      UserData: !Base64
        Fn::Sub: |
          #!/bin/bash
          dnf update -y aws-cfn-bootstrap
          dnf install -y amazon-cloudwatch-agent
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerHost --region ${AWS::Region}
          
          # Verify Apache log directory exists and create if needed
          mkdir -p /var/log/httpd
          
          # Start CloudWatch agent
          /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json -s
          
          # Signal success
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerHost --region ${AWS::Region}
          echo "Done"
  WebServerLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    Properties:
      RetentionInDays: 7
  404MetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref WebServerLogGroup
      FilterPattern: >-
        [ip, identity, user_id, timestamp, request, status_code = 404, size, ...]
      MetricTransformations:
        - MetricValue: '1'
          MetricNamespace: test/404s
          MetricName: test404Count
  BytesTransferredMetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref WebServerLogGroup
      FilterPattern: '[ip, identity, user_id, timestamp, request, status_code, size, ...]'
      MetricTransformations:
        - MetricValue: $size
          MetricNamespace: test/BytesTransferred
          MetricName: testBytesTransferred
  404Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The number of 404s is greater than 2 over 2 minutes
      MetricName: test404Count
      Namespace: test/404s
      Statistic: Sum
      Period: '60'
      EvaluationPeriods: '2'
      Threshold: '2'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  BandwidthAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The average volume of traffic is greater 3500 KB over 10 minutes
      MetricName: testBytesTransferred
      Namespace: test/BytesTransferred
      Statistic: Average
      Period: '300'
      EvaluationPeriods: '2'
      Threshold: '3500'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  AlarmNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
Outputs:
  InstanceId:
    Description: The instance ID of the web server
    Value: !Ref WebServerHost
  WebsiteURL:
    Value: !Sub 'http://${WebServerHost.PublicDnsName}'
    Description: URL for the web server
  PublicIP:
    Description: Public IP address of the web server
    Value: !GetAtt WebServerHost.PublicIp
  CloudWatchLogGroupName:
    Description: The name of the CloudWatch log group
    Value: !Ref WebServerLogGroup
```

## Enviar registros a CloudWatch Logs desde una instancia Windows
<a name="quickref-cloudwatchlogs-example2"></a>

La siguiente plantilla configura CloudWatch Logs para una instancia de Windows 2012 R2.

El agente CloudWatch Logs en Windows (agente SSM en AMI de Windows 2012R2 y Windows 2016) solo envía registros después de iniciarse, para que no se envíen los registros que se generan antes del inicio. Para solucionar esto, la plantilla ayuda a garantizar que el agente comience antes de que se escriban registros:
+ Configurando los parámetros del agente como primer elemento de `config` en cfn-init `configSets`.
+ Utilizando `waitAfterCompletion` para insertar una pausa tras el comando que inicia el agente.

### JSON
<a name="quickref-cloudwatchlogs-example2.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Sample template that sets up and configures CloudWatch Logs on Windows 2012R2 instance.",
    "Parameters": {
        "KeyPair": {
            "Description": "Name of an existing EC2 KeyPair to enable RDP access to the instances",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },
        "RDPLocation": {
            "Description": "The IP address range that can be used to RDP to the EC2 instances",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
            "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
        },
        "OperatorEmail": {
            "Description": "Email address to notify when CloudWatch alarms are triggered (404 errors)",
            "Type": "String"
        }
    },
    "Resources": {
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable HTTP access via port 80 and RDP access via port 3389",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "80",
                        "ToPort": "80",
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {"Ref": "RDPLocation"}
                    }
                ]
            }
        },
        "LogRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
                ],
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "LogRolePolicy",
                        "PolicyDocument": {
                            "Version": "2012-10-17",		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:Create*",
                                        "logs:PutLogEvents",
                                        "s3:GetObject"
                                    ],
                                    "Resource": [
                                        "arn:aws:logs:*:*:*",
                                        "arn:aws:s3:::*"
                                    ]
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "LogRoleInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Path": "/",
                "Roles": [{"Ref": "LogRole"}]
            }
        },
        "WebServerHost": {
            "Type": "AWS::EC2::Instance",
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT15M"
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "config": [
                            "00-ConfigureCWLogs",
                            "01-InstallWebServer",
                            "02-ConfigureApplication",
                            "03-Finalize"
                        ]
                    },
                    "00-ConfigureCWLogs": {
                        "files": {
                            "C:\\Program Files\\Amazon\\SSM\\Plugins\\awsCloudWatch\\AWS.EC2.Windows.CloudWatch.json": {
                                "content": {
                                    "EngineConfiguration": {
                                        "Components": [
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "ApplicationEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "Application"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "SystemEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "System"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "SecurityEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "Security"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "EC2ConfigLog",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "ASCII",
                                                    "Filter": "EC2ConfigLog.txt",
                                                    "LogDirectoryPath": "C:\\Program Files\\Amazon\\Ec2ConfigService\\Logs",
                                                    "TimeZoneKind": "UTC",
                                                    "TimestampFormat": "yyyy-MM-ddTHH:mm:ss.fffZ:"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CfnInitLog",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "ASCII",
                                                    "Filter": "cfn-init.log",
                                                    "LogDirectoryPath": "C:\\cfn\\log",
                                                    "TimeZoneKind": "Local",
                                                    "TimestampFormat": "yyyy-MM-dd HH:mm:ss,fff"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "IISLogs",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "UTF-8",
                                                    "Filter": "",
                                                    "LineCount": "3",
                                                    "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
                                                    "TimeZoneKind": "UTC",
                                                    "TimestampFormat": "yyyy-MM-dd HH:mm:ss"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "MemoryPerformanceCounter",
                                                "Parameters": {
                                                    "CategoryName": "Memory",
                                                    "CounterName": "Available MBytes",
                                                    "DimensionName": "",
                                                    "DimensionValue": "",
                                                    "InstanceName": "",
                                                    "MetricName": "Memory",
                                                    "Unit": "Megabytes"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchApplicationEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/ApplicationEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchSystemEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/SystemEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchSecurityEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/SecurityEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchEC2ConfigLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/EC2ConfigLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchCfnInitLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/CfnInitLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchIISLogs",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/IISLogs",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatch",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "NameSpace": "Windows/Default",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            }
                                        ],
                                        "Flows": {
                                            "Flows": [
                                                "ApplicationEventLog,CloudWatchApplicationEventLog",
                                                "SystemEventLog,CloudWatchSystemEventLog",
                                                "SecurityEventLog,CloudWatchSecurityEventLog",
                                                "EC2ConfigLog,CloudWatchEC2ConfigLog",
                                                "CfnInitLog,CloudWatchCfnInitLog",
                                                "IISLogs,CloudWatchIISLogs",
                                                "MemoryPerformanceCounter,CloudWatch"
                                            ]
                                        },
                                        "PollInterval": "00:00:05"
                                    },
                                    "IsEnabled": true
                                }
                            }
                        },
                        "commands": {
                            "0-enableSSM": {
                                "command": "powershell.exe -Command \"Set-Service -Name AmazonSSMAgent -StartupType Automatic\" ",
                                "waitAfterCompletion": "0"
                            },
                            "1-restartSSM": {
                                "command": "powershell.exe -Command \"Restart-Service AmazonSSMAgent \"",
                                "waitAfterCompletion": "30"
                            }
                        }
                    },
                    "01-InstallWebServer": {
                        "commands": {
                            "01_install_webserver": {
                                "command": "powershell.exe -Command \"Install-WindowsFeature Web-Server  -IncludeAllSubFeature\"",
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "02-ConfigureApplication": {
                        "files": {
                            "c:\\Inetpub\\wwwroot\\index.htm": {
                                "content": "<html> <head> <title>Test Application Page</title> </head> <body> <h1>Congratulations!! Your IIS server is configured.</h1> </body> </html>"
                            }
                        }
                    },
                    "03-Finalize": {
                        "commands": {
                            "00_signal_success": {
                                "command": {
                                    "Fn::Sub": "cfn-signal.exe -e 0 --resource WebServerHost --stack ${AWS::StackName} --region ${AWS::Region}"
                                },
                                "waitAfterCompletion": "0"
                            }
                        }
                    }
                }
            },
            "Properties": {
                "KeyName": {
                    "Ref": "KeyPair"
                },
                "ImageId": "{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-English-64Bit-Base}}",
                "InstanceType": "t2.xlarge",
                "SecurityGroupIds": [{"Ref": "WebServerSecurityGroup"}],
                "IamInstanceProfile": {"Ref": "LogRoleInstanceProfile"},
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "<script>\n",
                                "wmic product where \"description='Amazon SSM Agent' \" uninstall\n",
                                "wmic product where \"description='aws-cfn-bootstrap' \" uninstall \n",
                                "start /wait c:\\Windows\\system32\\msiexec /passive /qn /i https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-win64-latest.msi\n",
                                "powershell.exe -Command \"iwr https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/windows_amd64/AmazonSSMAgentSetup.exe  -UseBasicParsing -OutFile C:\\AmazonSSMAgentSetup.exe\"\n",
                                "start /wait C:\\AmazonSSMAgentSetup.exe /install /quiet\n",
                                "cfn-init.exe -v -c config -s ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, " \n",
                                "</script>\n"
                            ]
                        ]
                    }
                }
            }
        },
        "LogGroup": {
            "Type": "AWS::Logs::LogGroup",
            "Properties": {
                "RetentionInDays": 7
            }
        },
        "404MetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "LogGroup"},
                "FilterPattern": "[timestamps, serverip, method, uri, query, port, dash, clientip, useragent, status_code = 404, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "1",
                        "MetricNamespace": "test/404s",
                        "MetricName": "test404Count"
                    }
                ]
            }
        },
        "404Alarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The number of 404s is greater than 2 over 2 minutes",
                "MetricName": "test404Count",
                "Namespace": "test/404s",
                "Statistic": "Sum",
                "Period": "60",
                "EvaluationPeriods": "2",
                "Threshold": "2",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "AlarmNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "Subscription": [{"Endpoint": {"Ref": "OperatorEmail"}, "Protocol": "email"}]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Description": "The instance ID of the web server",
            "Value": {"Ref": "WebServerHost"}
        },
        "WebsiteURL": {
            "Value": {"Fn::Sub": "http://${WebServerHost.PublicDnsName}"},
            "Description": "URL for the web server"
        },
        "PublicIP": {
            "Description": "Public IP address of the web server",
            "Value": {"Fn::GetAtt": ["WebServerHost","PublicIp"]}
        },
        "CloudWatchLogGroupName": {
            "Description": "The name of the CloudWatch log group",
            "Value": {"Ref": "LogGroup"}
        }
    }
}
```

### YAML
<a name="quickref-cloudwatchlogs-example2.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: >-
  Sample template that sets up and configures CloudWatch Logs on Windows 2012R2 instance.
Parameters:
  KeyPair:
    Description: Name of an existing EC2 KeyPair to enable RDP access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  RDPLocation:
    Description: The IP address range that can be used to RDP to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  OperatorEmail:
    Description: Email address to notify when CloudWatch alarms are triggered (404 errors)
    Type: String
Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and RDP access via port 3389
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: '3389'
          ToPort: '3389'
          CidrIp: !Ref RDPLocation
  LogRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore'
      Path: /
      Policies:
        - PolicyName: LogRolePolicy
          PolicyDocument:
            Version: 2012-10-17		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:Create*'
                  - 'logs:PutLogEvents'
                  - 's3:GetObject'
                Resource:
                  - 'arn:aws:logs:*:*:*'
                  - 'arn:aws:s3:::*'
  LogRoleInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref LogRole
  WebServerHost:
    Type: AWS::EC2::Instance
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
    Metadata:
      'AWS::CloudFormation::Init':
        configSets:
          config:
            - 00-ConfigureCWLogs
            - 01-InstallWebServer
            - 02-ConfigureApplication
            - 03-Finalize
        00-ConfigureCWLogs:
          files:
            'C:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\AWS.EC2.Windows.CloudWatch.json':
              content: !Sub |
                {
                  "EngineConfiguration": {
                      "Components": [
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "ApplicationEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "Application"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "SystemEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "System"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "SecurityEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "Security"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "EC2ConfigLog",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "ASCII",
                                  "Filter": "EC2ConfigLog.txt",
                                  "LogDirectoryPath": "C:\\Program Files\\Amazon\\Ec2ConfigService\\Logs",
                                  "TimeZoneKind": "UTC",
                                  "TimestampFormat": "yyyy-MM-ddTHH:mm:ss.fffZ:"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "CfnInitLog",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "ASCII",
                                  "Filter": "cfn-init.log",
                                  "LogDirectoryPath": "C:\\cfn\\log",
                                  "TimeZoneKind": "Local",
                                  "TimestampFormat": "yyyy-MM-dd HH:mm:ss,fff"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "IISLogs",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "UTF-8",
                                  "Filter": "",
                                  "LineCount": "3",
                                  "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
                                  "TimeZoneKind": "UTC",
                                  "TimestampFormat": "yyyy-MM-dd HH:mm:ss"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "MemoryPerformanceCounter",
                              "Parameters": {
                                  "CategoryName": "Memory",
                                  "CounterName": "Available MBytes",
                                  "DimensionName": "",
                                  "DimensionValue": "",
                                  "InstanceName": "",
                                  "MetricName": "Memory",
                                  "Unit": "Megabytes"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchApplicationEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/ApplicationEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchSystemEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/SystemEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchSecurityEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/SecurityEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchEC2ConfigLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/EC2ConfigLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchCfnInitLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/CfnInitLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchIISLogs",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/IISLogs",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatch",
                              "Parameters": {
                                  "AccessKey": "",
                                  "NameSpace": "Windows/Default",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          }
                      ],
                      "Flows": {
                          "Flows": [
                              "ApplicationEventLog,CloudWatchApplicationEventLog",
                              "SystemEventLog,CloudWatchSystemEventLog",
                              "SecurityEventLog,CloudWatchSecurityEventLog",
                              "EC2ConfigLog,CloudWatchEC2ConfigLog",
                              "CfnInitLog,CloudWatchCfnInitLog",
                              "IISLogs,CloudWatchIISLogs",
                              "MemoryPerformanceCounter,CloudWatch"
                          ]
                      },
                      "PollInterval": "00:00:05"
                  },
                  "IsEnabled": true
                }
          commands:
            0-enableSSM:
              command: >-
                powershell.exe -Command "Set-Service -Name AmazonSSMAgent
                -StartupType Automatic" 
              waitAfterCompletion: '0'
            1-restartSSM:
              command: powershell.exe -Command "Restart-Service AmazonSSMAgent "
              waitAfterCompletion: '30'
        01-InstallWebServer:
          commands:
            01_install_webserver:
              command: >-
                powershell.exe -Command "Install-WindowsFeature Web-Server 
                -IncludeAllSubFeature"
              waitAfterCompletion: '0'
        02-ConfigureApplication:
          files:
            'c:\Inetpub\wwwroot\index.htm':
              content: >-
                <html> <head> <title>Test Application Page</title> </head>
                <body> <h1>Congratulations !! Your IIS server is
                configured.</h1> </body> </html>
        03-Finalize:
          commands:
            00_signal_success:
              command: !Sub >-
                cfn-signal.exe -e 0 --resource WebServerHost --stack
                ${AWS::StackName} --region ${AWS::Region}
              waitAfterCompletion: '0'
    Properties:
      KeyName: !Ref KeyPair
      ImageId: "{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-English-64Bit-Base}}"
      InstanceType: t2.xlarge
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      IamInstanceProfile: !Ref LogRoleInstanceProfile
      UserData: !Base64 
        'Fn::Sub': >
          <script>

          wmic product where "description='Amazon SSM Agent' " uninstall

          wmic product where "description='aws-cfn-bootstrap' " uninstall 

          start /wait c:\\Windows\\system32\\msiexec /passive /qn /i
          https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-win64-latest.msi

          powershell.exe -Command "iwr
          https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/windows_amd64/AmazonSSMAgentSetup.exe 
          -UseBasicParsing -OutFile C:\\AmazonSSMAgentSetup.exe"

          start /wait C:\\AmazonSSMAgentSetup.exe /install /quiet

          cfn-init.exe -v -c config -s ${AWS::StackName} --resource
          WebServerHost --region ${AWS::Region} 

          </script>
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      RetentionInDays: 7
  404MetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref LogGroup
      FilterPattern: >-
        [timestamps, serverip, method, uri, query, port, dash, clientip,
        useragent, status_code = 404, ...]
      MetricTransformations:
        - MetricValue: '1'
          MetricNamespace: test/404s
          MetricName: test404Count
  404Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The number of 404s is greater than 2 over 2 minutes
      MetricName: test404Count
      Namespace: test/404s
      Statistic: Sum
      Period: '60'
      EvaluationPeriods: '2'
      Threshold: '2'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  AlarmNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
Outputs:
  InstanceId:
    Description: The instance ID of the web server
    Value: !Ref WebServerHost
  WebsiteURL:
    Value: !Sub 'http://${WebServerHost.PublicDnsName}'
    Description: URL for the web server
  PublicIP:
    Description: Public IP address of the web server
    Value: !GetAtt 
      - WebServerHost
      - PublicIp
  CloudWatchLogGroupName:
    Description: The name of the CloudWatch log group
    Value: !Ref LogGroup
```

## Véase también
<a name="w2aac11c41c35c11"></a>

Para obtener más información sobre los recursos de CloudWatch Logs, consulte [AWS::Logs::LogGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-loggroup.html) o [AWS::Logs::MetricFilter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-metricfilter.html).

# Fragmentos de plantillas de Amazon DynamoDB
<a name="quickref-dynamodb"></a>

**Topics**
+ [Application Auto Scaling con una tabla de Amazon DynamoDB](#quickref-dynamodb-application-autoscaling)
+ [Véase también](#w2aac11c41c39b7)

## Application Auto Scaling con una tabla de Amazon DynamoDB
<a name="quickref-dynamodb-application-autoscaling"></a>

En este ejemplo se configura Application Auto Scaling para un recurso de `AWS::DynamoDB::Table`. La plantilla define una política de escalado de `TargetTrackingScaling` que escala el desempeño de `WriteCapacityUnits` para la tabla.

### JSON
<a name="quickref-dynamodb-example.json"></a>

```
{
    "Resources": {
        "DDBTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "AttributeDefinitions": [
                    {
                        "AttributeName": "ArtistId",
                        "AttributeType": "S"
                    },
                    {
                        "AttributeName": "Concert",
                        "AttributeType": "S"
                    },
                    {
                        "AttributeName": "TicketSales",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "ArtistId",
                        "KeyType": "HASH"
                    },
                    {
                        "AttributeName": "Concert",
                        "KeyType": "RANGE"
                    }
                ],
                "GlobalSecondaryIndexes": [
                    {
                        "IndexName": "GSI",
                        "KeySchema": [
                            {
                                "AttributeName": "TicketSales",
                                "KeyType": "HASH"
                            }
                        ],
                        "Projection": {
                            "ProjectionType": "KEYS_ONLY"
                        },
                        "ProvisionedThroughput": {
                            "ReadCapacityUnits": 5,
                            "WriteCapacityUnits": 5
                        }
                    }
                ],
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 5
                }
            }
        },
        "WriteCapacityScalableTarget": {
            "Type": "AWS::ApplicationAutoScaling::ScalableTarget",
            "Properties": {
                "MaxCapacity": 15,
                "MinCapacity": 5,
                "ResourceId": {
                    "Fn::Join": [
                        "/",
                        [
                            "table",
                            {
                                "Ref": "DDBTable"
                            }
                        ]
                    ]
                },
                "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable" },
                "ScalableDimension": "dynamodb:table:WriteCapacityUnits",
                "ServiceNamespace": "dynamodb"
            }
        },
        "WriteScalingPolicy": {
            "Type": "AWS::ApplicationAutoScaling::ScalingPolicy",
            "Properties": {
                "PolicyName": "WriteAutoScalingPolicy",
                "PolicyType": "TargetTrackingScaling",
                "ScalingTargetId": {
                    "Ref": "WriteCapacityScalableTarget"
                },
                "TargetTrackingScalingPolicyConfiguration": {
                    "TargetValue": 50,
                    "ScaleInCooldown": 60,
                    "ScaleOutCooldown": 60,
                    "PredefinedMetricSpecification": {
                        "PredefinedMetricType": "DynamoDBWriteCapacityUtilization"
                    }
                }
            }
        }
    }
}
```

### YAML
<a name="quickref-dynamodb-example.yaml"></a>

```
Resources:
  DDBTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: "ArtistId"
          AttributeType: "S"
        - AttributeName: "Concert"
          AttributeType: "S"
        - AttributeName: "TicketSales"
          AttributeType: "S"
      KeySchema:
        - AttributeName: "ArtistId"
          KeyType: "HASH"
        - AttributeName: "Concert"
          KeyType: "RANGE"
      GlobalSecondaryIndexes:
        - IndexName: "GSI"
          KeySchema:
            - AttributeName: "TicketSales"
              KeyType: "HASH"
          Projection:
            ProjectionType: "KEYS_ONLY"
          ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 5
  WriteCapacityScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 15
      MinCapacity: 5
      ResourceId: !Join
        - /
        - - table
          - !Ref DDBTable
      RoleARN:
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
      ScalableDimension: dynamodb:table:WriteCapacityUnits
      ServiceNamespace: dynamodb
  WriteScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: WriteAutoScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref WriteCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 50.0
        ScaleInCooldown: 60
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBWriteCapacityUtilization
```

## Véase también
<a name="w2aac11c41c39b7"></a>

Para obtener más información, consulte [How to use CloudFormation to configure auto scaling for DynamoDB tables and indexes](https://aws.amazon.com/blogs/database/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/) en el blog de bases de datos de AWS.

Para obtener más información sobre recursos de DynamoDB, consulte [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html).

# Fragmentos de plantillas de Amazon EC2 CloudFormation
<a name="quickref-ec2"></a>

Amazon EC2 proporciona capacidad de computación escalable en la Nube de AWS. Puede usar Amazon EC2 para lanzar tantos servidores virtuales como necesite, configurar la seguridad y las redes, y administrar el almacenamiento. Estos servidores virtuales, conocidos como instancias, pueden ejecutar una variedad de sistemas operativos y aplicaciones, y se pueden personalizar para cumplir con sus requisitos específicos. Amazon EC2 permite escalar o desescalar verticalmente para afrontar los cambios que se produzcan en los requisitos.

Puede definir y aprovisionar instancias de Amazon EC2 como parte de su infraestructura mediante plantillas de CloudFormation. Las plantillas facilitan la administración y la automatización de la implementación de los recursos de Amazon EC2 de forma repetible y coherente. 

Los siguientes fragmentos de plantilla de ejemplo describen los recursos o componentes de CloudFormation para Amazon EC2. Estos fragmentos están diseñados para integrarse en una plantilla y no están pensados para ejecutarse de forma independiente.

**Topics**
+ [Configuración de instancias de EC2](quickref-ec2-instance-config.md)
+ [Creación de plantillas de lanzamiento](quickref-ec2-launch-templates.md)
+ [Administrar grupos de seguridad](quickref-ec2-sg.md)
+ [Asignación de direcciones IP elásticas](quickref-ec2-elastic-ip.md)
+ [Configuración de los recursos de VPC](quickref-ec2-vpc.md)

# Configuración de instancias de Amazon EC2 con CloudFormation
<a name="quickref-ec2-instance-config"></a>

Los siguientes fragmentos muestran cómo configurar las instancias de Amazon EC2 mediante CloudFormation.

**Topics**
+ [Configuración general de Amazon EC2](#quickref-ec2-instance-config-general)
+ [Especificación de las asignaciones de dispositivos de bloques para la instancia.](#scenario-ec2-bdm)

## Configuración general de Amazon EC2
<a name="quickref-ec2-instance-config-general"></a>

Los siguientes fragmentos muestran las configuraciones generales de las instancias de Amazon EC2 mediante CloudFormation.

**Topics**
+ [Creación de una instancia de Amazon EC2 en una zona de disponibilidad específica](#scenario-ec2-instance)
+ [Configuración de una instancia de Amazon EC2 con un volumen de EBS y datos de usuario](#scenario-ec2-instance-with-vol-and-tags)
+ [Definición del nombre de la tabla de DynamoDB en los datos de usuario para el lanzamiento de la instancia de Amazon EC2](#scenario-ec2-with-sdb-domain)
+ [Creación de un volumen de Amazon EBS con `DeletionPolicy`](#scenario-ec2-volume)

### Creación de una instancia de Amazon EC2 en una zona de disponibilidad específica
<a name="scenario-ec2-instance"></a>

En el siguiente fragmento se crea una instancia de Amazon EC2 en la zona de disponibilidad específica con un recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). El código de la zona de disponibilidad es el código de la región seguido de un identificador de letra. Puede lanzar una instancia en una sola zona de disponibilidad. 

#### JSON
<a name="quickref-ec2-example-6.json"></a>

```
1. "Ec2Instance": {
2.     "Type": "AWS::EC2::Instance",
3.     "Properties": {
4.         "AvailabilityZone": "aa-example-1a",
5.         "ImageId": "ami-1234567890abcdef0"
6.     }
7. }
```

#### YAML
<a name="quickref-ec2-example-6.yaml"></a>

```
1. Ec2Instance:
2.   Type: AWS::EC2::Instance
3.   Properties:
4.     AvailabilityZone: aa-example-1a
5.     ImageId: ami-1234567890abcdef0
```

### Configuración de una instancia de Amazon EC2 con un volumen de EBS y datos de usuario
<a name="scenario-ec2-instance-with-vol-and-tags"></a>

El siguiente fragmento crea una instancia de Amazon EC2 con una etiqueta, un volumen de EBS y datos de usuario. Utiliza un recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). En la misma plantilla, debe definir un recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html), un recurso [AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html) y un recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html). Se debe definir `KeyName` en la sección `Parameters` de la plantilla.

Las etiquetas permiten clasificar los recursos de AWS de diversas maneras, por ejemplo, según su finalidad, propietario o entorno. Los datos de usuario permiten aprovisionar scripts o datos personalizados a una instancia durante el lanzamiento. Estos datos facilitan la automatización de tareas, la configuración del software, la instalación de paquetes y otras acciones en una instancia durante la inicialización. 

Para obtener más información sobre el etiquetado de recursos, consulte [Etiquetar los recursos de Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) en la *Guía del usuario de Amazon EC2*. 

Para obtener información sobre los datos de usuario, consulte [Uso de los metadatos de la instancia para administrar su instancia de EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) en la *Guía del usuario de Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-7.json"></a>

```
 1. "Ec2Instance": {
 2.   "Type": "AWS::EC2::Instance",
 3.   "Properties": {
 4.     "KeyName": { "Ref": "KeyName" },
 5.     "SecurityGroups": [ { "Ref": "Ec2SecurityGroup" } ],
 6.     "UserData": {
 7.       "Fn::Base64": {
 8.         "Fn::Join": [ ":", [
 9.             "PORT=80",
10.             "TOPIC=",
11.             { "Ref": "MySNSTopic" }
12.           ]
13.         ]
14.       }
15.     },
16.     "InstanceType": "aa.size",
17.     "AvailabilityZone": "aa-example-1a",
18.     "ImageId": "ami-1234567890abcdef0",
19.     "Volumes": [
20.       {
21.         "VolumeId": { "Ref": "MyVolumeResource" },
22.         "Device": "/dev/sdk"
23.       }
24.     ],
25.     "Tags": [ { "Key": "Name", "Value": "MyTag" } ]
26.   }
27. }
```

#### YAML
<a name="quickref-ec2-example-7.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     KeyName: !Ref KeyName
 5.     SecurityGroups:
 6.       - !Ref Ec2SecurityGroup
 7.     UserData:
 8.       Fn::Base64:
 9.         Fn::Join:
10.           - ":"
11.           - - "PORT=80"
12.             - "TOPIC="
13.             - !Ref MySNSTopic
14.     InstanceType: aa.size
15.     AvailabilityZone: aa-example-1a
16.     ImageId: ami-1234567890abcdef0
17.     Volumes:
18.       - VolumeId: !Ref MyVolumeResource
19.         Device: "/dev/sdk"
20.     Tags:
21.       - Key: Name
22.         Value: MyTag
```

### Definición del nombre de la tabla de DynamoDB en los datos de usuario para el lanzamiento de la instancia de Amazon EC2
<a name="scenario-ec2-with-sdb-domain"></a>

El siguiente fragmento crea una instancia de Amazon EC2 y define un nombre de tabla de DynamoDB en los datos de usuario para pasarlo a la instancia en el momento del lanzamiento. Utiliza un recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). Puede definir parámetros o valores dinámicos en los datos del usuario para transferirlos a una instancia de EC2 en el momento del lanzamiento. 

Para obtener más información sobre los datos de usuario, consulte [Uso de los metadatos de la instancia para administrar su instancia de EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) en la *Guía del usuario de Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-8.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "UserData": {
 5.             "Fn::Base64": {
 6.                 "Fn::Join": [
 7.                     "",
 8.                     [
 9.                         "TableName=",
10.                         {
11.                             "Ref": "DynamoDBTableName"
12.                         }
13.                     ]
14.                 ]
15.             }
16.         },
17.         "AvailabilityZone": "aa-example-1a",
18.         "ImageId": "ami-1234567890abcdef0"
19.     }
20. }
```

#### YAML
<a name="quickref-ec2-example-8.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     UserData:
 5.       Fn::Base64:
 6.         Fn::Join:
 7.           - ''
 8.           - - 'TableName='
 9.             - Ref: DynamoDBTableName
10.     AvailabilityZone: aa-example-1a
11.     ImageId: ami-1234567890abcdef0
```

### Creación de un volumen de Amazon EBS con `DeletionPolicy`
<a name="scenario-ec2-volume"></a>

Los siguientes fragmentos crean un volumen de Amazon EBS mediante un recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) de Amazon EC2. Puede usar las propiedades `Size` o `SnapshotID` para definir el volumen, pero no ambas. Un atributo `DeletionPolicy` está configurado para crear una instantánea del volumen cuando se elimina la pila. 

Para obtener más información acerca del atributo `DeletionPolicy`, consulte [Atributo DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html).

Para más información sobre la creación de una instantánea en EBS, consulte [Creación de un volumen de Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html).

#### JSON
<a name="quickref-ec2-example-13.json"></a>

Este fragmento de código crea un volumen de Amazon EBS con un **tamaño** especificado. El tamaño está establecido en 10, pero puede ajustarlo según sea necesario. El recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) le permite especificar el tamaño o el ID de una instantánea, pero no ambos.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "Size": "10",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

Este fragmento de código crea un volumen de Amazon EBS con un **ID de instantánea** proporcionado. El recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) le permite especificar el tamaño o el ID de una instantánea, pero no ambos.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "SnapshotId" : "snap-1234567890abcdef0",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

#### YAML
<a name="quickref-ec2-example-13.yaml"></a>

Este fragmento de código crea un volumen de Amazon EBS con un **tamaño** especificado. El tamaño está establecido en 10, pero puede ajustarlo según sea necesario. El recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) le permite especificar el tamaño o el ID de una instantánea, pero no ambos.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     Size: 10
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

Este fragmento de código crea un volumen de Amazon EBS con un **ID de instantánea** proporcionado. El recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) le permite especificar el tamaño o el ID de una instantánea, pero no ambos.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     SnapshotId: snap-1234567890abcdef0
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

## Especificación de las asignaciones de dispositivos de bloques para la instancia.
<a name="scenario-ec2-bdm"></a>

Una asignación de dispositivos de bloques define los dispositivos de bloques, que incluye volúmenes de almacén de instancias y volúmenes de EBS para asociar a la instancia. Puede especificar una asignación de dispositivos de bloques al crear una AMI para que todas las instancias que se lancen desde la AMI utilicen dicha asignación. También puede especificar una asignación de dispositivos de bloques cuando se lanza una instancia, de forma que esta asignación anula la especificada en la AMI desde la que se lanzó la instancia.

Puede usar los siguientes fragmentos de plantilla para especificar las asignaciones de dispositivos de bloques para sus volúmenes de EBS o de almacén de instancias mediante la propiedad `BlockDeviceMappings` de un recurso de [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). 

Para obtener más información acerca de la asignación de dispositivos de bloques, consulte [Asignaciones de dispositivos de bloques para volúmenes en instancias de Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html) en la *Guía del usuario de Amazon EC2*.

**Topics**
+ [Especificación de las asignaciones de dispositivos de bloques para dos volúmenes de EBS](#w2aac11c41c43c13b9c11)
+ [Cualquier entrada de asignación de dispositivos de bloques para el almacén de instancias.](#w2aac11c41c43c13b9c13)

### Especificación de las asignaciones de dispositivos de bloques para dos volúmenes de EBS
<a name="w2aac11c41c43c13b9c11"></a>

#### JSON
<a name="quickref-ec2-example-1.json"></a>

```
"Ec2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
      "KeyName": { "Ref": "KeyName" },
      "InstanceType": { "Ref": "InstanceType" },
      "SecurityGroups": [{ "Ref": "Ec2SecurityGroup" }],
      "BlockDeviceMappings": [
        {
          "DeviceName": "/dev/sda1",
          "Ebs": { "VolumeSize": "50" }
        },
        {
          "DeviceName": "/dev/sdm",
          "Ebs": { "VolumeSize": "100" }
        }
      ]
    }
  }
}
```

#### YAML
<a name="quickref-ec2-example-1.yaml"></a>

```
EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      KeyName: !Ref KeyName
      InstanceType: !Ref InstanceType
      SecurityGroups:
        - !Ref Ec2SecurityGroup
      BlockDeviceMappings:
        -
          DeviceName: /dev/sda1
          Ebs:
            VolumeSize: 50
        -
          DeviceName: /dev/sdm
          Ebs:
            VolumeSize: 100
```

### Cualquier entrada de asignación de dispositivos de bloques para el almacén de instancias.
<a name="w2aac11c41c43c13b9c13"></a>

#### JSON
<a name="quickref-ec2-example-2.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance", 
  "Properties" : {
    "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
    "KeyName" : { "Ref" : "KeyName" },
    "InstanceType": { "Ref": "InstanceType" },
    "SecurityGroups" : [{ "Ref" : "Ec2SecurityGroup" }],
    "BlockDeviceMappings" : [
      {
        "DeviceName"  : "/dev/sdc",
        "VirtualName" : "ephemeral0"
      }
    ]
  }
}
```

#### YAML
<a name="quickref-ec2-example-2.yaml"></a>

```
EC2Instance:
  Type: AWS::EC2::Instance
  Properties:
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    KeyName: !Ref KeyName
    InstanceType: !Ref InstanceType
    SecurityGroups:
      - !Ref Ec2SecurityGroup
    BlockDeviceMappings:
      - DeviceName: /dev/sdc
        VirtualName: ephemeral0
```

# Creación de plantillas de inicialización con CloudFormation
<a name="quickref-ec2-launch-templates"></a>

En esta sección se proporciona un ejemplo de creación de una plantilla de inicialización de Amazon EC2 mediante CloudFormation. Las plantillas de lanzamiento le permiten crear plantillas para configurar y aprovisionar instancias de Amazon EC2 en AWS. Puede utilizar plantillas de lanzamiento para almacenar parámetros de lanzamiento con el objetivo de no tener que especificarlos cada vez que lance una instancia. Para obtener más ejemplos, consulte la sección [Ejemplos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) del recurso de `AWS::EC2::LaunchTemplate`.

Para obtener más información sobre las plantillas de inicialización, consulte [Almacenamiento de parámetros de inicialización de instancias en plantillas de inicialización de Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) en la *Guía del usuario de Amazon EC2*. 

Para obtener información acerca de cómo crear una plantilla de inicialización para utilizarla con los grupos de escalado automático, consulte [Plantillas de inicialización de escalado automático](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-templates.html) en la *Guía del usuario de Amazon EC2 Auto Scaling*.

**Topics**
+ [Creación de una plantilla de lanzamiento que especifique grupos de seguridad, etiquetas, datos del usuario y un rol de IAM](#scenario-as-launch-template)

## Creación de una plantilla de lanzamiento que especifique grupos de seguridad, etiquetas, datos del usuario y un rol de IAM
<a name="scenario-as-launch-template"></a>

En este fragmento se muestra un recurso [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) que contiene la información de configuración para lanzar una instancia. Los usuarios especifican valores para las propiedades `ImageId`, `InstanceType`, `SecurityGroups`, `UserData` y `TagSpecifications`. La propiedad `SecurityGroups` especifica un grupo de seguridad de EC2 existente y un nuevo grupo de seguridad. La función `Ref` obtiene el ID del recurso `myNewEC2SecurityGroup` de [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) que se declara en otra parte de la plantilla de pila. 

La plantilla de lanzamiento incluye una sección para datos de usuario personalizados. En esta sección, puede pasar tareas de configuración y scripts que se ejecutan cuando se lanza una instancia. En este ejemplo, los datos de usuario instalan el agente de AWS Systems Manager e inicia el agente.

La plantilla de lanzamiento también incluye un rol de IAM que permite a las aplicaciones que se ejecutan en instancias llevar a cabo acciones en su nombre. En este ejemplo, se muestra un recurso [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html) para la plantilla de lanzamiento, que utiliza la propiedad `IamInstanceProfile` para especificar el rol de IAM. La función `Ref` obtiene el nombre del recurso `myInstanceProfile` de [AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-instanceprofile.html). Para configurar los permisos del rol de IAM, debe especificar un valor para la propiedad `ManagedPolicyArns`.

### JSON
<a name="quickref-launch-template-example-1.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "myLaunchTemplate":{
 4.       "Type":"AWS::EC2::LaunchTemplate",
 5.       "Properties":{
 6.         "LaunchTemplateName":{ "Fn::Sub": "${AWS::StackName}-launch-template" },
 7.         "LaunchTemplateData":{
 8.           "ImageId":"ami-02354e95b3example",
 9.           "InstanceType":"t3.micro",
10.           "IamInstanceProfile":{
11.             "Name":{
12.               "Ref":"myInstanceProfile"
13.             }
14.           },
15.           "SecurityGroupIds":[
16.             {
17.               "Ref":"myNewEC2SecurityGroup"
18.             },
19.             "sg-083cd3bfb8example"
20.           ],
21.           "UserData":{
22.             "Fn::Base64":{
23.               "Fn::Join": [
24.                 "", [
25.                   "#!/bin/bash\n",
26.                   "cd /tmp\n",
27.                   "yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm\n",
28.                   "systemctl enable amazon-ssm-agent\n",
29.                   "systemctl start amazon-ssm-agent\n"
30.                 ]
31.               ]
32.             }
33.           },
34.           "TagSpecifications":[
35.             {
36.               "ResourceType":"instance",
37.               "Tags":[
38.                 {
39.                   "Key":"environment",
40.                   "Value":"development"
41.                 }
42.               ]
43.             },
44.             {
45.               "ResourceType":"volume",
46.               "Tags":[
47.                 {
48.                   "Key":"environment",
49.                   "Value":"development"
50.                 }
51.               ]
52.             }
53.           ]
54.         }
55.       }
56.     },
57.     "myInstanceRole":{
58.       "Type":"AWS::IAM::Role",
59.       "Properties":{
60.         "RoleName":"InstanceRole",
61.         "AssumeRolePolicyDocument":{
62.           "Version": "2012-10-17",		 	 	 
63.           "Statement":[
64.             {
65.               "Effect":"Allow",
66.               "Principal":{
67.                 "Service":[
68.                   "ec2.amazonaws.com"
69.                 ]
70.               },
71.               "Action":[
72.                 "sts:AssumeRole"
73.               ]
74.             }
75.           ]
76.         },
77.         "ManagedPolicyArns":[
78.           "arn:aws:iam::aws:policy/myCustomerManagedPolicy"
79.         ]
80.       }
81.     },
82.     "myInstanceProfile":{
83.       "Type":"AWS::IAM::InstanceProfile",
84.       "Properties":{
85.         "Path":"/",
86.         "Roles":[
87.           {
88.             "Ref":"myInstanceRole"
89.           }
90.         ]
91.       }
92.     }
93.   }
94. }
```

### YAML
<a name="quickref-launch-template-example-1.yaml"></a>

```
 1. ---
 2. Resources:
 3.   myLaunchTemplate:
 4.     Type: AWS::EC2::LaunchTemplate
 5.     Properties:
 6.       LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
 7.       LaunchTemplateData:
 8.         ImageId: ami-02354e95b3example
 9.         InstanceType: t3.micro
10.         IamInstanceProfile:
11.           Name: !Ref myInstanceProfile
12.         SecurityGroupIds:
13.         - !Ref myNewEC2SecurityGroup
14.         - sg-083cd3bfb8example
15.         UserData:
16.           Fn::Base64: !Sub |
17.             #!/bin/bash
18.             cd /tmp
19.             yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
20.             systemctl enable amazon-ssm-agent
21.             systemctl start amazon-ssm-agent
22.         TagSpecifications:
23.         - ResourceType: instance
24.           Tags:
25.           - Key: environment
26.             Value: development
27.         - ResourceType: volume
28.           Tags:
29.           - Key: environment
30.             Value: development
31.   myInstanceRole:
32.     Type: AWS::IAM::Role
33.     Properties:
34.       RoleName: InstanceRole
35.       AssumeRolePolicyDocument:
36.         Version: '2012-10-17'
37.         Statement:
38.         - Effect: 'Allow'
39.           Principal:
40.             Service:
41.             - 'ec2.amazonaws.com'
42.           Action:
43.           - 'sts:AssumeRole'
44.       ManagedPolicyArns:
45.         - 'arn:aws:iam::aws:policy/myCustomerManagedPolicy'
46.   myInstanceProfile:
47.     Type: AWS::IAM::InstanceProfile
48.     Properties:
49.       Path: '/'
50.       Roles:
51.       - !Ref myInstanceRole
```

# Administración de grupos de seguridad con CloudFormation
<a name="quickref-ec2-sg"></a>

Los siguientes fragmentos muestran cómo usar CloudFormation para administrar los grupos de seguridad y las instancias de Amazon EC2 para controlar el acceso a sus recursos de AWS.

**Topics**
+ [Asociación de una instancia de Amazon EC2 con un grupo de seguridad](#quickref-ec2-instances-associate-security-group)
+ [Creación de grupos de seguridad con reglas de entrada](#quickref-ec2-instances-ingress)
+ [Creación de un equilibrador de carga elástica con una regla de ingreso de grupos de seguridad](#scenario-ec2-security-group-elbingress)

## Asociación de una instancia de Amazon EC2 con un grupo de seguridad
<a name="quickref-ec2-instances-associate-security-group"></a>

Los siguientes fragmentos de ejemplo muestran cómo asociar una instancia de Amazon EC2 a un grupo de seguridad de Amazon VPC predeterminado mediante CloudFormation.

**Topics**
+ [Asociación de una instancia de Amazon EC2 con un grupo de seguridad de VPN predeterminado](#using-cfn-getatt-default-values)
+ [Creación de una instancia de Amazon EC2 con un volumen y un grupo de seguridad adjuntos](#scenario-ec2-volumeattachment)

### Asociación de una instancia de Amazon EC2 con un grupo de seguridad de VPN predeterminado
<a name="using-cfn-getatt-default-values"></a>

El siguiente fragmento crea una VPC de Amazon, una subred dentro de la VPC y una instancia de Amazon EC2. La VPC se crea con un recurso [AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html). El rango de direcciones IP de la VPC se define en la plantilla más grande y el parámetro `MyVPCCIDRRange` hace referencia a él.

Se crea una subred dentro de la VPC con un recurso de subred [AWS::EC2::Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html). La subred está asociada a la VPC, a la que se hace referencia como `MyVPC`.

Se lanza una instancia de EC2 dentro de la VPC y la subred mediante un recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html). Este recurso especifica la imagen de máquina de Amazon (AMI) que se utilizará para lanzar la instancia, la subred en la que se ejecutará la instancia y el grupo de seguridad que se asociará a la instancia. `ImageId` utiliza un parámetro de Systems Manager para recuperar de forma dinámica la AMI más reciente de Amazon Linux 2. 

El ID del grupo de seguridad se obtiene mediante la función `Fn::GetAtt`, que recupera el grupo de seguridad predeterminado del recurso `MyVPC`. 

La instancia se coloca dentro del recurso `MySubnet` definido en el fragmento. 

Al crear una VPC con CloudFormation, AWS crea automáticamente recursos predeterminados dentro de la VPC, incluido un grupo de seguridad predeterminado. Sin embargo, al definir una VPC dentro de una plantilla de CloudFormation, es posible que no tenga acceso a los ID de estos recursos predeterminados al crear la plantilla. Para acceder a los recursos predeterminados especificados en la plantilla y utilizarlos, puede utilizar funciones intrínsecas, como `Fn::GetAtt`. Esta función le permite trabajar con los recursos predeterminados que CloudFormation crea automáticamente.

#### JSON
<a name="quickref-ec2-example-15.json"></a>

```
"MyVPC": {
    "Type": "AWS::EC2::VPC",
    "Properties": {
        "CidrBlock": {
            "Ref": "MyVPCCIDRRange"
        },
        "EnableDnsSupport": false,
        "EnableDnsHostnames": false,
        "InstanceTenancy": "default"
    }
},
"MySubnet": {
    "Type": "AWS::EC2::Subnet",
    "Properties": {
        "CidrBlock": {
            "Ref": "MyVPCCIDRRange"
        },
        "VpcId": {
            "Ref": "MyVPC"
        }
    }
},
"MyInstance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
        "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "SecurityGroupIds": [
            {
                "Fn::GetAtt": [
                    "MyVPC",
                    "DefaultSecurityGroup"
                ]
            }
        ],
        "SubnetId": {
            "Ref": "MySubnet"
        }
    }
}
```

#### YAML
<a name="quickref-ec2-example-15.yaml"></a>

```
MyVPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock:
      Ref: MyVPCCIDRRange
    EnableDnsSupport: false
    EnableDnsHostnames: false
    InstanceTenancy: default
MySubnet:
  Type: AWS::EC2::Subnet
  Properties:
    CidrBlock:
      Ref: MyVPCCIDRRange
    VpcId:
      Ref: MyVPC
MyInstance:
  Type: AWS::EC2::Instance
  Properties:
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    SecurityGroupIds:
      - Fn::GetAtt:
          - MyVPC
          - DefaultSecurityGroup
    SubnetId:
      Ref: MySubnet
```

### Creación de una instancia de Amazon EC2 con un volumen y un grupo de seguridad adjuntos
<a name="scenario-ec2-volumeattachment"></a>

El siguiente fragmento de código crea una instancia de Amazon EC2 con un recurso [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html), que se inicia desde una AMI designada. La instancia está asociada a un grupo de seguridad que permite el tráfico SSH entrante en el puerto 22 desde una dirección IP específica, mediante un recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html). Crea un volumen de Amazon EBS de 100 GB mediante un recurso [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html). El volumen se crea en la misma zona de disponibilidad que la instancia, según lo especifique la función `GetAtt`, y se monta en la instancia del dispositivo `/dev/sdh`.

Para más información sobre la creación de una instantánea en EBS, consulte [Creación de un volumen de Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html).

#### JSON
<a name="quickref-ec2-example-14.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "SecurityGroups": [
 5.             {
 6.                 "Ref": "InstanceSecurityGroup"
 7.             }
 8.         ],
 9.         "ImageId": "ami-1234567890abcdef0"
10.     }
11. },
12. "InstanceSecurityGroup": {
13.     "Type": "AWS::EC2::SecurityGroup",
14.     "Properties": {
15.         "GroupDescription": "Enable SSH access via port 22",
16.         "SecurityGroupIngress": [
17.             {
18.                 "IpProtocol": "tcp",
19.                 "FromPort": "22",
20.                 "ToPort": "22",
21.                 "CidrIp": "192.0.2.0/24"
22.             }
23.         ]
24.     }
25. },
26. "NewVolume": {
27.     "Type": "AWS::EC2::Volume",
28.     "Properties": {
29.         "Size": "100",
30.         "AvailabilityZone": {
31.             "Fn::GetAtt": [
32.                 "Ec2Instance",
33.                 "AvailabilityZone"
34.             ]
35.         }
36.     }
37. },
38. "MountPoint": {
39.     "Type": "AWS::EC2::VolumeAttachment",
40.     "Properties": {
41.         "InstanceId": {
42.             "Ref": "Ec2Instance"
43.         },
44.         "VolumeId": {
45.             "Ref": "NewVolume"
46.         },
47.         "Device": "/dev/sdh"
48.     }
49. }
```

#### YAML
<a name="quickref-ec2-example-14.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     SecurityGroups:
 5.       - !Ref InstanceSecurityGroup
 6.     ImageId: ami-1234567890abcdef0
 7. InstanceSecurityGroup:
 8.   Type: AWS::EC2::SecurityGroup
 9.   Properties:
10.     GroupDescription: Enable SSH access via port 22
11.     SecurityGroupIngress:
12.       - IpProtocol: tcp
13.         FromPort: 22
14.         ToPort: 22
15.         CidrIp: 192.0.2.0/24
16. NewVolume:
17.   Type: AWS::EC2::Volume
18.   Properties:
19.     Size: 100
20.     AvailabilityZone: !GetAtt [Ec2Instance, AvailabilityZone]
21. MountPoint:
22.   Type: AWS::EC2::VolumeAttachment
23.   Properties:
24.     InstanceId: !Ref Ec2Instance
25.     VolumeId: !Ref NewVolume
26.     Device: /dev/sdh
```

## Creación de grupos de seguridad con reglas de entrada
<a name="quickref-ec2-instances-ingress"></a>

En los siguientes fragmentos de ejemplo, se muestra cómo configurar grupos de seguridad con reglas de entrada específicas mediante CloudFormation.

**Topics**
+ [Creación de un grupo de seguridad con reglas de entrada para el acceso SSH y HTTP](#scenario-ec2-security-group-rule)
+ [Creación de un grupo de seguridad con reglas de entrada para el acceso SSH y HTTP a partir de rangos CIDR especificados](#scenario-ec2-security-group-two-ports)
+ [Creación de grupos de seguridad de referencia cruzada con reglas de entrada](#scenario-ec2-security-group-ingress)

### Creación de un grupo de seguridad con reglas de entrada para el acceso SSH y HTTP
<a name="scenario-ec2-security-group-rule"></a>

Este fragmento de código muestra un recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) que describe dos reglas de entrada del grupo de seguridad. La primera regla de entrada permite el acceso SSH (puerto 22) desde un grupo de seguridad existente denominado `MyAdminSecurityGroup`, que es propiedad de la cuenta de AWS con el número de cuenta `1111-2222-3333`. La segunda regla de entrada permite el acceso HTTP (puerto 80) desde un grupo de seguridad diferente denominado `MySecurityGroupCreatedInCFN`, que se crea en la misma plantilla. La función `Ref` se utiliza para hacer referencia al nombre lógico del grupo de seguridad creado en la misma plantilla. 

En la primera regla de entrada, debe agregar un valor para las propiedades `SourceSecurityGroupName` y `SourceSecurityGroupOwnerId`. En la segunda regla de entrada, `MySecurityGroupCreatedInCFNTemplate` hace referencia a un grupo de seguridad diferente, que se crea en la misma plantilla. Compruebe que el nombre lógico `MySecurityGroupCreatedInCFNTemplate` coincide con el nombre lógico real del recurso del grupo de seguridad que especificó en la plantilla más grande. 

Para obtener más información sobre los grupos de seguridad, consulte [Grupos de seguridad de Amazon EC2 para instancias de EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) en la *Guía del usuario de Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-10.json"></a>

```
 1. "SecurityGroup": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "Allow connections from specified source security group",
 5.         "SecurityGroupIngress": [
 6.             {
 7.                 "IpProtocol": "tcp",
 8.                 "FromPort": "22",
 9.                 "ToPort": "22",
10.                 "SourceSecurityGroupName": "MyAdminSecurityGroup",
11.                 "SourceSecurityGroupOwnerId": "1111-2222-3333"
12.             },
13.             {
14.                 "IpProtocol": "tcp",
15.                 "FromPort": "80",
16.                 "ToPort": "80",
17.                 "SourceSecurityGroupName": {
18.                     "Ref": "MySecurityGroupCreatedInCFNTemplate"
19.                 }
20.             }
21.         ]
22.     }
23. }
```

#### YAML
<a name="quickref-ec2-example-10.yaml"></a>

```
 1. SecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified source security group
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: '22'
 8.         ToPort: '22'
 9.         SourceSecurityGroupName: MyAdminSecurityGroup
10.         SourceSecurityGroupOwnerId: '1111-2222-3333'
11.       - IpProtocol: tcp
12.         FromPort: '80'
13.         ToPort: '80'
14.         SourceSecurityGroupName:
15.           Ref: MySecurityGroupCreatedInCFNTemplate
```

### Creación de un grupo de seguridad con reglas de entrada para el acceso SSH y HTTP a partir de rangos CIDR especificados
<a name="scenario-ec2-security-group-two-ports"></a>

El siguiente fragmento crea un grupo de seguridad para una instancia de Amazon EC2 con dos reglas de entrada. Las reglas de entrada permiten el tráfico TCP entrante en los puertos especificados desde los rangos de CIDR designados. Se utiliza un recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) para especificar las reglas. Debe especificar un protocolo para cada regla. En el caso de TCP, también debe especificar un puerto o intervalo de puertos. Si no especifica un grupo de seguridad de origen o un rango de CIDR, la pila se iniciará correctamente, pero la regla no se aplicará al grupo de seguridad. 

Para obtener más información sobre los grupos de seguridad, consulte [Grupos de seguridad de Amazon EC2 para instancias de EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) en la *Guía del usuario de Amazon EC2*.

#### JSON
<a name="quickref-ec2-example-9.json"></a>

```
 1. "ServerSecurityGroup": {
 2.   "Type": "AWS::EC2::SecurityGroup",
 3.   "Properties": {
 4.     "GroupDescription": "Allow connections from specified CIDR ranges",
 5.     "SecurityGroupIngress": [
 6.       {
 7.         "IpProtocol": "tcp",
 8.         "FromPort": "80",
 9.         "ToPort": "80",
10.         "CidrIp": "192.0.2.0/24"
11.       },
12.       {
13.         "IpProtocol": "tcp",
14.         "FromPort": "22",
15.         "ToPort": "22",
16.         "CidrIp": "192.0.2.0/24"
17.       }
18.     ]
19.   }
20. }
```

#### YAML
<a name="quickref-ec2-example-9.yaml"></a>

```
 1. ServerSecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified CIDR ranges
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: 80
 8.         ToPort: 80
 9.         CidrIp: 192.0.2.0/24
10.       - IpProtocol: tcp
11.         FromPort: 22
12.         ToPort: 22
13.         CidrIp: 192.0.2.0/24
```

### Creación de grupos de seguridad de referencia cruzada con reglas de entrada
<a name="scenario-ec2-security-group-ingress"></a>

El siguiente fragmento de código utiliza el recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) para crear dos grupos de seguridad de Amazon EC2, `SGroup1` y `SGroup2`. Las reglas de ingreso que permiten la comunicación entre los dos grupos de seguridad se crean mediante el recurso [AWS::EC2::SecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroupingress.html). `SGroup1Ingress` establece una regla de entrada para `SGroup1` que permite el tráfico TCP entrante en el puerto 80 desde el grupo de seguridad de origen, `SGroup2`. `SGroup2Ingress` establece una regla de entrada para `SGroup2` que permite el tráfico TCP entrante en el puerto 80 desde el grupo de seguridad de origen, `SGroup1`. 

#### JSON
<a name="quickref-ec2-example-12.json"></a>

```
 1. "SGroup1": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "EC2 instance access"
 5.     }
 6. },
 7. "SGroup2": {
 8.     "Type": "AWS::EC2::SecurityGroup",
 9.     "Properties": {
10.         "GroupDescription": "EC2 instance access"
11.     }
12. },
13. "SGroup1Ingress": {
14.     "Type": "AWS::EC2::SecurityGroupIngress",
15.     "Properties": {
16.         "GroupName": {
17.             "Ref": "SGroup1"
18.         },
19.         "IpProtocol": "tcp",
20.         "ToPort": "80",
21.         "FromPort": "80",
22.         "SourceSecurityGroupName": {
23.             "Ref": "SGroup2"
24.         }
25.     }
26. },
27. "SGroup2Ingress": {
28.     "Type": "AWS::EC2::SecurityGroupIngress",
29.     "Properties": {
30.         "GroupName": {
31.             "Ref": "SGroup2"
32.         },
33.         "IpProtocol": "tcp",
34.         "ToPort": "80",
35.         "FromPort": "80",
36.         "SourceSecurityGroupName": {
37.             "Ref": "SGroup1"
38.         }
39.     }
40. }
```

#### YAML
<a name="quickref-ec2-example-12.yaml"></a>

```
 1. SGroup1:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: EC2 Instance access
 5. SGroup2:
 6.   Type: AWS::EC2::SecurityGroup
 7.   Properties:
 8.     GroupDescription: EC2 Instance access
 9. SGroup1Ingress:
10.   Type: AWS::EC2::SecurityGroupIngress
11.   Properties:
12.     GroupName: !Ref SGroup1
13.     IpProtocol: tcp
14.     ToPort: 80
15.     FromPort: 80
16.     SourceSecurityGroupName: !Ref SGroup2
17. SGroup2Ingress:
18.   Type: AWS::EC2::SecurityGroupIngress
19.   Properties:
20.     GroupName: !Ref SGroup2
21.     IpProtocol: tcp
22.     ToPort: 80
23.     FromPort: 80
24.     SourceSecurityGroupName: !Ref SGroup1
```

## Creación de un equilibrador de carga elástica con una regla de ingreso de grupos de seguridad
<a name="scenario-ec2-security-group-elbingress"></a>

La siguiente plantilla crea un recurso [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html) en la zona de disponibilidad especificada. El recurso [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html) está configurado para escuchar el tráfico HTTP en el puerto 80 y dirigir las solicitudes a las instancias también en el puerto 80. El equilibrador de carga elástico es responsable de equilibrar la carga del tráfico HTTP entrante entre las instancias.

 Además, esta plantilla genera un recurso [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) asociado al equilibrador de carga. Este grupo de seguridad se crea con una única regla de entrada, descrita como `ELB ingress group`, que permite el tráfico TCP entrante en el puerto 80. El origen de esta regla de entrada se define mediante la función `Fn::GetAtt` para recuperar los atributos del recurso del equilibrador de carga. `SourceSecurityGroupOwnerId` utiliza `Fn::GetAtt` para obtener el grupo de seguridad `OwnerAlias` del equilibrador de carga. `SourceSecurityGroupName` utiliza `Fn::Getatt` para obtener el `GroupName` del grupo de seguridad de origen del ELB. 

Esta configuración garantiza una comunicación segura entre el ELB y las instancias. 

Para obtener más información sobre balanceadores de carga, consulte la [Guía del usuario de Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/).

### JSON
<a name="quickref-ec2-example-11.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "MyELB": {
            "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
            "Properties": {
                "AvailabilityZones": [
                    "aa-example-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="quickref-ec2-example-11.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyELB:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      AvailabilityZones:
        - aa-example-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
```

# Asignación y asociación de una dirección IP elástica con CloudFormation
<a name="quickref-ec2-elastic-ip"></a>

Los siguientes fragmentos de plantilla son ejemplos relacionados con las direcciones IP elásticas (EIP) en Amazon EC2. Estos ejemplos abarcan la asignación, la asociación y la administración de las EIP para sus instancias.

**Topics**
+ [Asignación de una dirección IP elástica con una instancia de Amazon EC2](#scenario-ec2-eip)
+ [Asociación de una dirección IP elástica a una instancia de Amazon EC2 mediante la especificación de la dirección IP](#scenario-ec2-eip-association)
+ [Asociación de una dirección IP elástica a una instancia de Amazon EC2 mediante la especificación del ID de asignación de la dirección IP](#scenario-ec2-eip-association-vpc)

## Asignación de una dirección IP elástica con una instancia de Amazon EC2
<a name="scenario-ec2-eip"></a>

En el siguiente fragmento se asigna una dirección IP elástica (EIP) de Amazon EC2 y se asocia a una instancia de Amazon EC2 mediante un recurso [AWS::EC2::EIP](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html). Puede asignar una dirección IP elástica de un grupo de direcciones propiedad de AWS o de un grupo de direcciones creado a partir de un intervalo de direcciones IPv4 públicas que ha llevado a AWS para su uso con los recursos de AWS mediante sus [propias direcciones IP (BYOIP)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html). En este ejemplo, la EIP se asigna desde un grupo de direcciones propiedad de AWS.

Para obtener más información acerca de las direcciones IP elásticas, consulte [Direcciones IP elásticas](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) en la *Guía del usuario de Amazon EC2*.

### JSON
<a name="quickref-ec2-example-3.json"></a>

```
1. "ElasticIP": {
2.     "Type": "AWS::EC2::EIP",
3.     "Properties": {
4.         "InstanceId": {
5.             "Ref": "Ec2Instance"
6.         }
7.     }
8. }
```

### YAML
<a name="quickref-ec2-example-3.yaml"></a>

```
1. ElasticIP:
2.   Type: AWS::EC2::EIP
3.   Properties:
4.     InstanceId: !Ref EC2Instance
```

## Asociación de una dirección IP elástica a una instancia de Amazon EC2 mediante la especificación de la dirección IP
<a name="scenario-ec2-eip-association"></a>

En el siguiente fragmento se asigna una dirección IP elástica (EIP) de Amazon EC2 y se asocia a una instancia de EC2 mediante un recurso [AWS::EC2::EIPAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html). Primero debe asignar una dirección IP elástica para utilizarla en su cuenta. Se puede asociar una dirección IP elástica a una instancia única.

### JSON
<a name="quickref-ec2-example-4.json"></a>

```
1. "IPAssoc": {
2.   "Type": "AWS::EC2::EIPAssociation",
3.   "Properties": {
4.     "InstanceId": {
5.       "Ref": "Ec2Instance"
6.     },
7.     "EIP": "192.0.2.0"
8.   }
9. }
```

### YAML
<a name="quickref-ec2-example-4.yaml"></a>

```
1. IPAssoc:
2.   Type: AWS::EC2::EIPAssociation
3.   Properties:
4.     InstanceId: !Ref EC2Instance
5.     EIP: 192.0.2.0
```

## Asociación de una dirección IP elástica a una instancia de Amazon EC2 mediante la especificación del ID de asignación de la dirección IP
<a name="scenario-ec2-eip-association-vpc"></a>

En el siguiente fragmento se asocia una dirección IP elástica existente a una instancia de Amazon EC2 mediante la especificación del ID de asignación mediante un recurso [AWS::EC2::EIPAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html). Se asigna un ID de asignación a una dirección IP elástica tras la asignación de dirección IP elástica. 

### JSON
<a name="quickref-ec2-example-5.json"></a>

```
1. "IPAssoc": {
2.     "Type": "AWS::EC2::EIPAssociation",
3.     "Properties": {
4.         "InstanceId": {
5.             "Ref": "Ec2Instance"
6.         },
7.         "AllocationId": "eipalloc-1234567890abcdef0"
8.     }
9. }
```

### YAML
<a name="quickref-ec2-example-5.yaml"></a>

```
1. IPAssoc:
2.   Type: AWS::EC2::EIPAssociation
3.   Properties:
4.     InstanceId: !Ref EC2Instance
5.     AllocationId: eipalloc-1234567890abcdef0
```

# Configuración de los recursos de Amazon VPC con CloudFormation
<a name="quickref-ec2-vpc"></a>

En esta sección se proporcionan ejemplos para configurar los recursos de Amazon VPC con CloudFormation. Las VPC le permiten crear una red virtual dentro de AWS, y estos fragmentos muestran cómo configurar algunos aspectos de las VPC para cumplir con sus requisitos de red. 

**Topics**
+ [Habilitación del acceso a Internet solo de salida de direcciones IPv6 en una VPC](#quickref-ec2-route-egressonlyinternetgateway)
+ [Fragmentos de código de plantillas de la Interfaz de red elástica (ENI)](#cfn-template-snippets-eni)

## Habilitación del acceso a Internet solo de salida de direcciones IPv6 en una VPC
<a name="quickref-ec2-route-egressonlyinternetgateway"></a>

Una puerta de enlace de Internet de solo salida permite que las instancias de una VPC accedan a Internet e impiden que los recursos de Internet se comuniquen con las instancias. El siguiente fragmento habilita el acceso a Internet solo de salida de direcciones IPv6 desde una VPC. Crea una VPC con un rango de direcciones IPv4 de `10.0.0/16` con un recurso [AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html). Se asocia una tabla de enrutamiento a este recurso de VPC mediante un recurso [AWS::EC2::RouteTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-routetable.html). La tabla de enrutamiento administra las rutas de las instancias dentro de la VPC. Se utiliza un recurso [AWS::EC2::EgressOnlyInternetGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-egressonlyinternetgateway.html) para crear una puerta de enlace de Internet solo de salida que permita la comunicación de las direcciones IPv6 para el tráfico saliente de las instancias de la VPC y, al mismo tiempo, evite el tráfico entrante. Se especifica un recurso [AWS::EC2::Route](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-route.html) para crear una ruta IPv6 en la tabla de enrutamiento que dirija todo el tráfico IPv6 saliente (`::/0`) a la puerta de enlace de Internet solo de salida. 

Para obtener más información sobre las puertas de enlace de Internet de solo salida, consulte [Habilitar el tráfico IPv6 saliente mediante una puerta de enlace de Internet de solo salida](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html) en la *Guía del usuario de Amazon VPC*.

### JSON
<a name="quickref-ec2-example-16.json"></a>

```
"DefaultIpv6Route": {
    "Type": "AWS::EC2::Route",
    "Properties": {
        "DestinationIpv6CidrBlock": "::/0",
        "EgressOnlyInternetGatewayId": {
            "Ref": "EgressOnlyInternetGateway"
        },
        "RouteTableId": {
            "Ref": "RouteTable"
        }
    }
},
"EgressOnlyInternetGateway": {
    "Type": "AWS::EC2::EgressOnlyInternetGateway",
    "Properties": {
        "VpcId": {
            "Ref": "VPC"
        }
    }
},
"RouteTable": {
    "Type": "AWS::EC2::RouteTable",
    "Properties": {
        "VpcId": {
            "Ref": "VPC"
        }
    }
},
"VPC": {
    "Type": "AWS::EC2::VPC",
    "Properties": {
        "CidrBlock": "10.0.0.0/16"
    }
}
```

### YAML
<a name="quickref-ec2-example-16.yaml"></a>

```
DefaultIpv6Route:
  Type: AWS::EC2::Route
  Properties:
    DestinationIpv6CidrBlock: "::/0"
    EgressOnlyInternetGatewayId:
      Ref: "EgressOnlyInternetGateway"
    RouteTableId:
      Ref: "RouteTable"
EgressOnlyInternetGateway:
  Type: AWS::EC2::EgressOnlyInternetGateway
  Properties:
    VpcId:
      Ref: "VPC"
RouteTable:
  Type: AWS::EC2::RouteTable
  Properties:
    VpcId:
      Ref: "VPC"
VPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock: "10.0.0.0/16"
```

## Fragmentos de código de plantillas de la Interfaz de red elástica (ENI)
<a name="cfn-template-snippets-eni"></a>

### Creación de una instancia de Amazon EC2 con interfaces de red elásticas (ENI) conectadas
<a name="cfn-template-snippets-eni-template"></a>

En el siguiente fragmento de ejemplo se crea una instancia de Amazon EC2 con un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) en la VPC y subred de Amazon especificadas. Conecta dos interfaces de red (ENI) a la instancia, asocia direcciones IP elásticas a las instancias a través de las ENI conectadas y configura el grupo de seguridad para el acceso SSH y HTTP. Los datos de usuario se proporcionan a la instancia como parte de la configuración de lanzamiento cuando se crea la instancia. Los datos de usuario incluyen un script codificado en un formato `base64` para garantizar que se transfiera a la instancia. Cuando se lanza la instancia, el script se ejecuta automáticamente como parte del proceso de arranque. Instala `ec2-net-utils`, configura las interfaces de red e inicia el servicio HTTP. 

Para determinar la imagen de máquina de Amazon (AMI) adecuada en función de la región seleccionada, el fragmento utiliza una función `Fn::FindInMap` que busca valores en una asignación `RegionMap`. Esta asignación debe definirse en la plantilla más grande. Las dos interfaces de red se crean con recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-networkinterface.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-networkinterface.html). Las direcciones IP elásticas se especifican mediante recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html) asignados al dominio `vpc`. Estas direcciones IP elásticas se asocian a las interfaces de red mediante recursos [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html). 

La sección `Outputs` define valores o recursos a los que desea acceder después de que se haya creado la pila. En este fragmento, el resultado definido es `InstancePublicIp`, que representa la dirección IP pública de la instancia de EC2 creada por la pila. Puede recuperar este resultado en la pestaña **Salida**, en la consola de CloudFormation o mediante el comando [describe-stacks](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html). 

Para obtener más información acerca de las interfaces de red, consulte [Interfaces de red elásticas](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html).

#### JSON
<a name="cfn-template-snippets-eni-example-1.json"></a>

```
"Resources": {
    "ControlPortAddress": {
        "Type": "AWS::EC2::EIP",
        "Properties": {
            "Domain": "vpc"
        }
    },
    "AssociateControlPort": {
        "Type": "AWS::EC2::EIPAssociation",
        "Properties": {
            "AllocationId": {
                "Fn::GetAtt": [
                    "ControlPortAddress",
                    "AllocationId"
                ]
            },
            "NetworkInterfaceId": {
                "Ref": "controlXface"
            }
        }
    },
    "WebPortAddress": {
        "Type": "AWS::EC2::EIP",
        "Properties": {
            "Domain": "vpc"
        }
    },
    "AssociateWebPort": {
        "Type": "AWS::EC2::EIPAssociation",
        "Properties": {
            "AllocationId": {
                "Fn::GetAtt": [
                    "WebPortAddress",
                    "AllocationId"
                ]
            },
            "NetworkInterfaceId": {
                "Ref": "webXface"
            }
        }
    },
    "SSHSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "VpcId": {
                "Ref": "VpcId"
            },
            "GroupDescription": "Enable SSH access via port 22",
            "SecurityGroupIngress": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": 22,
                    "IpProtocol": "tcp",
                    "ToPort": 22
                }
            ]
        }
    },
    "WebSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "VpcId": {
                "Ref": "VpcId"
            },
            "GroupDescription": "Enable HTTP access via user-defined port",
            "SecurityGroupIngress": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": 80,
                    "IpProtocol": "tcp",
                    "ToPort": 80
                }
            ]
        }
    },
    "controlXface": {
        "Type": "AWS::EC2::NetworkInterface",
        "Properties": {
            "SubnetId": {
                "Ref": "SubnetId"
            },
            "Description": "Interface for controlling traffic such as SSH",
            "GroupSet": [
                {
                    "Fn::GetAtt": [
                        "SSHSecurityGroup",
                        "GroupId"
                    ]
                }
            ],
            "SourceDestCheck": true,
            "Tags": [
                {
                    "Key": "Network",
                    "Value": "Control"
                }
            ]
        }
    },
    "webXface": {
        "Type": "AWS::EC2::NetworkInterface",
        "Properties": {
            "SubnetId": {
                "Ref": "SubnetId"
            },
            "Description": "Interface for web traffic",
            "GroupSet": [
                {
                    "Fn::GetAtt": [
                        "WebSecurityGroup",
                        "GroupId"
                    ]
                }
            ],
            "SourceDestCheck": true,
            "Tags": [
                {
                    "Key": "Network",
                    "Value": "Web"
                }
            ]
        }
    },
    "Ec2Instance": {
        "Type": "AWS::EC2::Instance",
        "Properties": {
            "ImageId": {
                "Fn::FindInMap": [
                    "RegionMap",
                    {
                        "Ref": "AWS::Region"
                    },
                    "AMI"
                ]
            },
            "KeyName": {
                "Ref": "KeyName"
            },
            "NetworkInterfaces": [
                {
                    "NetworkInterfaceId": {
                        "Ref": "controlXface"
                    },
                    "DeviceIndex": "0"
                },
                {
                    "NetworkInterfaceId": {
                        "Ref": "webXface"
                    },
                    "DeviceIndex": "1"
                }
            ],
            "Tags": [
                {
                    "Key": "Role",
                    "Value": "Test Instance"
                }
            ],
            "UserData": {
                "Fn::Base64": {
                    "Fn::Sub": "#!/bin/bash -xe\nyum install ec2-net-utils -y\nec2ifup eth1\nservice httpd start\n"
                }
            }
        }
    }
},
"Outputs": {
    "InstancePublicIp": {
        "Description": "Public IP Address of the EC2 Instance",
        "Value": {
            "Fn::GetAtt": [
                "Ec2Instance",
                "PublicIp"
            ]
        }
    }
}
```

#### YAML
<a name="cfn-template-snippets-eni-example.yaml"></a>

```
Resources:
  ControlPortAddress:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  AssociateControlPort:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId:
        Fn::GetAtt:
          - ControlPortAddress
          - AllocationId
      NetworkInterfaceId:
        Ref: controlXface
  WebPortAddress:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  AssociateWebPort:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId:
        Fn::GetAtt:
          - WebPortAddress
          - AllocationId
      NetworkInterfaceId:
        Ref: webXface
  SSHSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VpcId
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          FromPort: 22
          IpProtocol: tcp
          ToPort: 22
  WebSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VpcId
      GroupDescription: Enable HTTP access via user-defined port
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          FromPort: 80
          IpProtocol: tcp
          ToPort: 80
  controlXface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId:
        Ref: SubnetId
      Description: Interface for controlling traffic such as SSH
      GroupSet:
        - Fn::GetAtt:
            - SSHSecurityGroup
            - GroupId
      SourceDestCheck: true
      Tags:
        - Key: Network
          Value: Control
  webXface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId:
        Ref: SubnetId
      Description: Interface for web traffic
      GroupSet:
        - Fn::GetAtt:
            - WebSecurityGroup
            - GroupId
      SourceDestCheck: true
      Tags:
        - Key: Network
          Value: Web
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId:
        Fn::FindInMap:
          - RegionMap
          - Ref: AWS::Region
          - AMI
      KeyName:
        Ref: KeyName
      NetworkInterfaces:
        - NetworkInterfaceId:
            Ref: controlXface
          DeviceIndex: "0"
        - NetworkInterfaceId:
            Ref: webXface
          DeviceIndex: "1"
      Tags:
        - Key: Role
          Value: Test Instance
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum install ec2-net-utils -y
          ec2ifup eth1
          service httpd start
Outputs:
  InstancePublicIp:
    Description: Public IP Address of the EC2 Instance
    Value:
      Fn::GetAtt:
        - Ec2Instance
        - PublicIp
```

# Ejemplos de plantillas de Amazon Elastic Container Service
<a name="quickref-ecs"></a>

Amazon Elastic Container Service (Amazon ECS) es un servicio de administración de contenedores que facilita la tarea de ejecutar, detener y administrar contenedores de Docker en un clúster de instancias de Amazon Elastic Compute Cloud (Amazon EC2).

## Cree un clúster con la AMI optimizada para Amazon ECS basada en AL2023
<a name="create-cluster-al2023"></a>

Defina un clúster que utilice un proveedor de capacidad que lance instancias de AL2023 en Amazon EC2.

**importante**  
Para los últimos ID de la AMI, consulte la [AMI optimizada para Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html) en la *Guía para desarrolladores de Amazon Elastic Container Service*.

### JSON
<a name="quickref-ecs-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "EC2 ECS cluster that starts out empty, with no EC2 instances yet. An ECS capacity provider automatically launches more EC2 instances as required on the fly when you request ECS to launch services or standalone tasks.",
  "Parameters": {
      "InstanceType": {
          "Type": "String",
          "Description": "EC2 instance type",
          "Default": "t2.medium",
          "AllowedValues": [
              "t1.micro",
              "t2.2xlarge",
              "t2.large",
              "t2.medium",
              "t2.micro",
              "t2.nano",
              "t2.small",
              "t2.xlarge",
              "t3.2xlarge",
              "t3.large",
              "t3.medium",
              "t3.micro",
              "t3.nano",
              "t3.small",
              "t3.xlarge"
          ]
      },
      "DesiredCapacity": {
          "Type": "Number",
          "Default": "0",
          "Description": "Number of EC2 instances to launch in your ECS cluster."
      },
      "MaxSize": {
          "Type": "Number",
          "Default": "100",
          "Description": "Maximum number of EC2 instances that can be launched in your ECS cluster."
      },
      "ECSAMI": {
          "Description": "The Amazon Machine Image ID used for the cluster",
          "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
          "Default": "/aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id"
      },
      "VpcId": {
          "Type": "AWS::EC2::VPC::Id",
          "Description": "VPC ID where the ECS cluster is launched",
          "Default": "vpc-1234567890abcdef0"
      },
      "SubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of subnet IDs where the EC2 instances will be launched",
          "Default": "subnet-021345abcdef67890"
      }
  },
  "Resources": {
      "ECSCluster": {
          "Type": "AWS::ECS::Cluster",
          "Properties": {
              "ClusterSettings": [
                  {
                      "Name": "containerInsights",
                      "Value": "enabled"
                  }
              ]
          }
      },
      "ECSAutoScalingGroup": {
          "Type": "AWS::AutoScaling::AutoScalingGroup",
          "DependsOn": [
              "ECSCluster",
              "EC2Role"
          ],
          "Properties": {
              "VPCZoneIdentifier": {
                  "Ref": "SubnetIds"
              },
              "LaunchTemplate": {
                  "LaunchTemplateId": {
                      "Ref": "ContainerInstances"
                  },
                  "Version": {
                      "Fn::GetAtt": [
                          "ContainerInstances",
                          "LatestVersionNumber"
                      ]
                  }
              },
              "MinSize": 0,
              "MaxSize": {
                  "Ref": "MaxSize"
              },
              "DesiredCapacity": {
                  "Ref": "DesiredCapacity"
              },
              "NewInstancesProtectedFromScaleIn": true
          },
          "UpdatePolicy": {
              "AutoScalingReplacingUpdate": {
                  "WillReplace": "true"
              }
          }
      },
      "ContainerInstances": {
          "Type": "AWS::EC2::LaunchTemplate",
          "Properties": {
              "LaunchTemplateName": "asg-launch-template",
              "LaunchTemplateData": {
                  "ImageId": {
                      "Ref": "ECSAMI"
                  },
                  "InstanceType": {
                      "Ref": "InstanceType"
                  },
                  "IamInstanceProfile": {
                      "Name": {
                          "Ref": "EC2InstanceProfile"
                      }
                  },
                  "SecurityGroupIds": [
                      {
                          "Ref": "ContainerHostSecurityGroup"
                      }
                  ],
                  "UserData": {
                      "Fn::Base64": {
                          "Fn::Sub": "#!/bin/bash -xe\n echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config\n yum install -y aws-cfn-bootstrap\n /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource ContainerInstances --configsets full_install --region ${AWS::Region} &\n"
                      }
                  },
                  "MetadataOptions": {
                      "HttpEndpoint": "enabled",
                      "HttpTokens": "required"
                  }
              }
          }
      },
      "EC2InstanceProfile": {
          "Type": "AWS::IAM::InstanceProfile",
          "Properties": {
              "Path": "/",
              "Roles": [
                  {
                      "Ref": "EC2Role"
                  }
              ]
          }
      },
      "CapacityProvider": {
          "Type": "AWS::ECS::CapacityProvider",
          "Properties": {
              "AutoScalingGroupProvider": {
                  "AutoScalingGroupArn": {
                      "Ref": "ECSAutoScalingGroup"
                  },
                  "ManagedScaling": {
                      "InstanceWarmupPeriod": 60,
                      "MinimumScalingStepSize": 1,
                      "MaximumScalingStepSize": 100,
                      "Status": "ENABLED",
                      "TargetCapacity": 100
                  },
                  "ManagedTerminationProtection": "ENABLED"
              }
          }
      },
      "CapacityProviderAssociation": {
          "Type": "AWS::ECS::ClusterCapacityProviderAssociations",
          "Properties": {
              "CapacityProviders": [
                  {
                      "Ref": "CapacityProvider"
                  }
              ],
              "Cluster": {
                  "Ref": "ECSCluster"
              },
              "DefaultCapacityProviderStrategy": [
                  {
                      "Base": 0,
                      "CapacityProvider": {
                          "Ref": "CapacityProvider"
                      },
                      "Weight": 1
                  }
              ]
          }
      },
      "ContainerHostSecurityGroup": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Access to the EC2 hosts that run containers",
              "VpcId": {
                  "Ref": "VpcId"
              }
          }
      },
      "EC2Role": {
          "Type": "AWS::IAM::Role",
          "Properties": {
              "AssumeRolePolicyDocument": {
                  "Statement": [
                      {
                          "Effect": "Allow",
                          "Principal": {
                              "Service": [
                                  "ec2.amazonaws.com"
                              ]
                          },
                          "Action": [
                              "sts:AssumeRole"
                          ]
                      }
                  ]
              },
              "Path": "/",
              "ManagedPolicyArns": [
                  "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role",
                  "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
              ]
          }
      },
      "ECSTaskExecutionRole": {
          "Type": "AWS::IAM::Role",
          "Properties": {
              "AssumeRolePolicyDocument": {
                  "Statement": [
                      {
                          "Effect": "Allow",
                          "Principal": {
                              "Service": [
                                  "ecs-tasks.amazonaws.com"
                              ]
                          },
                          "Action": [
                              "sts:AssumeRole"
                          ],
                          "Condition": {
                              "ArnLike": {
                                  "aws:SourceArn": {
                                      "Fn::Sub": "arn:${AWS::Partition}:ecs:${AWS::Region}:${AWS::AccountId}:*"
                                  }
                              },
                              "StringEquals": {
                                  "aws:SourceAccount": {
                                        "Fn::Sub": "${AWS::AccountId}"
                                    }
                              }
                          }
                      }
                  ]
              },
              "Path": "/",
              "ManagedPolicyArns": [
                  "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
              ]
          }
      }
  },
  "Outputs": {
      "ClusterName": {
          "Description": "The ECS cluster into which to launch resources",
          "Value": "ECSCluster"
      },
      "ECSTaskExecutionRole": {
          "Description": "The role used to start up a task",
          "Value": "ECSTaskExecutionRole"
      },
      "CapacityProvider": {
          "Description": "The cluster capacity provider that the service should use to request capacity when it wants to start up a task",
          "Value": "CapacityProvider"
      }
  }
}
```

### YAML
<a name="quickref-ecs-example-1.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: EC2 ECS cluster that starts out empty, with no EC2 instances yet.
  An ECS capacity provider automatically launches more EC2 instances as required
  on the fly when you request ECS to launch services or standalone tasks.
Parameters:
  InstanceType:
    Type: String
    Description: EC2 instance type
    Default: "t2.medium"
    AllowedValues:
      - t1.micro
      - t2.2xlarge
      - t2.large
      - t2.medium
      - t2.micro
      - t2.nano
      - t2.small
      - t2.xlarge
      - t3.2xlarge
      - t3.large
      - t3.medium
      - t3.micro
      - t3.nano
      - t3.small
      - t3.xlarge
  DesiredCapacity:
    Type: Number
    Default: "0"
    Description: Number of EC2 instances to launch in your ECS cluster.
  MaxSize:
    Type: Number
    Default: "100"
    Description: Maximum number of EC2 instances that can be launched in your ECS cluster.
  ECSAMI:
    Description: The Amazon Machine Image ID used for the cluster
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VPC ID where the ECS cluster is launched
    Default: vpc-1234567890abcdef0
  SubnetIds:
    Type: List<AWS::EC2::Subnet::Id>
    Description: List of subnet IDs where the EC2 instances will be launched
    Default: "subnet-021345abcdef67890"
Resources:
# This is authorizes ECS to manage resources on your
  # account on your behalf. This role is likely already created on your account
  # ECSRole:
  #  Type: AWS::IAM::ServiceLinkedRole
  #  Properties:
  #    AWSServiceName: 'ecs.amazonaws.com'
  
   # ECS Resources
  ECSCluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterSettings:
        - Name: containerInsights
          Value: enabled
  
  # Autoscaling group. This launches the actual EC2 instances that will register
  # themselves as members of the cluster, and run the docker containers.
  ECSAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    DependsOn:
      # This is to ensure that the ASG gets deleted first before these
    # resources, when it comes to stack teardown.
      - ECSCluster
      - EC2Role
    Properties:
      VPCZoneIdentifier:
        Ref: SubnetIds
      LaunchTemplate:
        LaunchTemplateId: !Ref ContainerInstances
        Version: !GetAtt ContainerInstances.LatestVersionNumber
      MinSize: 0
      MaxSize:
        Ref: MaxSize
      DesiredCapacity:
        Ref: DesiredCapacity
      NewInstancesProtectedFromScaleIn: true
    UpdatePolicy:
      AutoScalingReplacingUpdate:
        WillReplace: "true"
  # The config for each instance that is added to the cluster
  ContainerInstances:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: "asg-launch-template"
      LaunchTemplateData:
        ImageId:
          Ref: ECSAMI
        InstanceType:
          Ref: InstanceType
        IamInstanceProfile:
          Name: !Ref EC2InstanceProfile
        SecurityGroupIds:
          - !Ref ContainerHostSecurityGroup
        # This injected configuration file is how the EC2 instance
      # knows which ECS cluster on your AWS account it should be joining
        UserData:
          Fn::Base64: !Sub |
           #!/bin/bash -xe
            echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config
            yum install -y aws-cfn-bootstrap
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource ContainerInstances --configsets full_install --region ${AWS::Region} &
         # Disable IMDSv1, and require IMDSv2
        MetadataOptions:
          HttpEndpoint: enabled
          HttpTokens: required
  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles: 
      - !Ref EC2Role 
  # Create an ECS capacity provider to attach the ASG to the ECS cluster
  # so that it autoscales as we launch more containers
  CapacityProvider:
    Type: AWS::ECS::CapacityProvider
    Properties:
      AutoScalingGroupProvider:
        AutoScalingGroupArn: !Ref ECSAutoScalingGroup
        ManagedScaling:
          InstanceWarmupPeriod: 60
          MinimumScalingStepSize: 1
          MaximumScalingStepSize: 100
          Status: ENABLED
          # Percentage of cluster reservation to try to maintain
          TargetCapacity: 100
        ManagedTerminationProtection: ENABLED
   # Create a cluster capacity provider assocation so that the cluster
  # will use the capacity provider
  CapacityProviderAssociation:
    Type: AWS::ECS::ClusterCapacityProviderAssociations
    Properties:
      CapacityProviders:
        - !Ref CapacityProvider
      Cluster: !Ref ECSCluster
      DefaultCapacityProviderStrategy:
        - Base: 0
          CapacityProvider: !Ref CapacityProvider
          Weight: 1
  # A security group for the EC2 hosts that will run the containers.
  # This can be used to limit incoming traffic to or outgoing traffic
  # from the container's host EC2 instance.
  ContainerHostSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to the EC2 hosts that run containers
      VpcId:
        Ref: VpcId
  # Role for the EC2 hosts. This allows the ECS agent on the EC2 hosts
  # to communciate with the ECS control plane, as well as download the docker
  # images from ECR to run on your host.
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
      # See reference: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerServiceforEC2Role
        - arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role
      # This managed policy allows us to connect to the instance using SSM
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
  # This is a role which is used within Fargate to allow the Fargate agent
  # to download images, and upload logs.
  ECSTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ecs-tasks.amazonaws.com
            Action:
              - sts:AssumeRole
            Condition:
              ArnLike:
                aws:SourceArn: !Sub arn:${AWS::Partition}:ecs:${AWS::Region}:${AWS::AccountId}:*
              StringEquals:
                aws:SourceAccount: !Sub ${AWS::AccountId}
      Path: /
      # This role enables all features of ECS. See reference:
    # https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonECSTaskExecutionRolePolicy
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
Outputs:
  ClusterName:
    Description: The ECS cluster into which to launch resources
    Value: ECSCluster
  ECSTaskExecutionRole:
    Description: The role used to start up a task
    Value: ECSTaskExecutionRole
  CapacityProvider:
    Description: The cluster capacity provider that the service should use to
      request capacity when it wants to start up a task
    Value: CapacityProvider
```

## Implementación de un servicio
<a name="create-service"></a>

La siguiente plantilla define un servicio que utiliza el proveedor de capacidad para solicitar la capacidad de ejecución de AL2023. Los contenedores se incorporarán a las instancias de AL2023 a medida que se encuentren en línea:

### JSON
<a name="quickref-ecs-example-2.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "An example service that deploys in AWS VPC networking mode on EC2 capacity. Service uses a capacity provider to request EC2 instances to run on. Service runs with networking in private subnets, but still accessible to the internet via a load balancer hosted in public subnets.",
  "Parameters": {
      "VpcId": {
          "Type": "String",
          "Description": "The VPC that the service is running inside of"
      },
      "PublicSubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of public subnet ID's to put the load balancer in"
      },
      "PrivateSubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of private subnet ID's that the AWS VPC tasks are in"
      },
      "ClusterName": {
          "Type": "String",
          "Description": "The name of the ECS cluster into which to launch capacity."
      },
      "ECSTaskExecutionRole": {
          "Type": "String",
          "Description": "The role used to start up an ECS task"
      },
      "CapacityProvider": {
          "Type": "String",
          "Description": "The cluster capacity provider that the service should use to request capacity when it wants to start up a task"
      },
      "ServiceName": {
          "Type": "String",
          "Default": "web",
          "Description": "A name for the service"
      },
      "ImageUrl": {
          "Type": "String",
          "Default": "public.ecr.aws/docker/library/nginx:latest",
          "Description": "The url of a docker image that contains the application process that will handle the traffic for this service"
      },
      "ContainerCpu": {
          "Type": "Number",
          "Default": 256,
          "Description": "How much CPU to give the container. 1024 is 1 CPU"
      },
      "ContainerMemory": {
          "Type": "Number",
          "Default": 512,
          "Description": "How much memory in megabytes to give the container"
      },
      "ContainerPort": {
          "Type": "Number",
          "Default": 80,
          "Description": "What port that the application expects traffic on"
      },
      "DesiredCount": {
          "Type": "Number",
          "Default": 2,
          "Description": "How many copies of the service task to run"
      }
  },
  "Resources": {
      "TaskDefinition": {
          "Type": "AWS::ECS::TaskDefinition",
          "Properties": {
              "Family": {
                  "Ref": "ServiceName"
              },
              "Cpu": {
                  "Ref": "ContainerCpu"
              },
              "Memory": {
                  "Ref": "ContainerMemory"
              },
              "NetworkMode": "awsvpc",
              "RequiresCompatibilities": [
                  "EC2"
              ],
              "ExecutionRoleArn": {
                  "Ref": "ECSTaskExecutionRole"
              },
              "ContainerDefinitions": [
                  {
                      "Name": {
                          "Ref": "ServiceName"
                      },
                      "Cpu": {
                          "Ref": "ContainerCpu"
                      },
                      "Memory": {
                          "Ref": "ContainerMemory"
                      },
                      "Image": {
                          "Ref": "ImageUrl"
                      },
                      "PortMappings": [
                          {
                              "ContainerPort": {
                                  "Ref": "ContainerPort"
                              },
                              "HostPort": {
                                  "Ref": "ContainerPort"
                              }
                          }
                      ],
                      "LogConfiguration": {
                          "LogDriver": "awslogs",
                          "Options": {
                              "mode": "non-blocking",
                              "max-buffer-size": "25m",
                              "awslogs-group": {
                                  "Ref": "LogGroup"
                              },
                              "awslogs-region": {
                                  "Ref": "AWS::Region"
                              },
                              "awslogs-stream-prefix": {
                                  "Ref": "ServiceName"
                              }
                          }
                      }
                  }
              ]
          }
      },
      "Service": {
          "Type": "AWS::ECS::Service",
          "DependsOn": "PublicLoadBalancerListener",
          "Properties": {
              "ServiceName": {
                  "Ref": "ServiceName"
              },
              "Cluster": {
                  "Ref": "ClusterName"
              },
              "PlacementStrategies": [
                  {
                      "Field": "attribute:ecs.availability-zone",
                      "Type": "spread"
                  },
                  {
                      "Field": "cpu",
                      "Type": "binpack"
                  }
              ],
              "CapacityProviderStrategy": [
                  {
                      "Base": 0,
                      "CapacityProvider": {
                          "Ref": "CapacityProvider"
                      },
                      "Weight": 1
                  }
              ],
              "NetworkConfiguration": {
                  "AwsvpcConfiguration": {
                      "SecurityGroups": [
                          {
                              "Ref": "ServiceSecurityGroup"
                          }
                      ],
                      "Subnets": {
                          "Ref": "PrivateSubnetIds"
                      }
                  }
              },
              "DeploymentConfiguration": {
                  "MaximumPercent": 200,
                  "MinimumHealthyPercent": 75
              },
              "DesiredCount": {
                  "Ref": "DesiredCount"
              },
              "TaskDefinition": {
                  "Ref": "TaskDefinition"
              },
              "LoadBalancers": [
                  {
                      "ContainerName": {
                          "Ref": "ServiceName"
                      },
                      "ContainerPort": {
                          "Ref": "ContainerPort"
                      },
                      "TargetGroupArn": {
                          "Ref": "ServiceTargetGroup"
                      }
                  }
              ]
          }
      },
      "ServiceSecurityGroup": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Security group for service",
              "VpcId": {
                  "Ref": "VpcId"
              }
          }
      },
      "ServiceTargetGroup": {
          "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
          "Properties": {
              "HealthCheckIntervalSeconds": 6,
              "HealthCheckPath": "/",
              "HealthCheckProtocol": "HTTP",
              "HealthCheckTimeoutSeconds": 5,
              "HealthyThresholdCount": 2,
              "TargetType": "ip",
              "Port": {
                  "Ref": "ContainerPort"
              },
              "Protocol": "HTTP",
              "UnhealthyThresholdCount": 10,
              "VpcId": {
                  "Ref": "VpcId"
              },
              "TargetGroupAttributes": [
                  {
                      "Key": "deregistration_delay.timeout_seconds",
                      "Value": 0
                  }
              ]
          }
      },
      "PublicLoadBalancerSG": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Access to the public facing load balancer",
              "VpcId": {
                  "Ref": "VpcId"
              },
              "SecurityGroupIngress": [
                  {
                      "CidrIp": "0.0.0.0/0",
                      "IpProtocol": -1
                  }
              ]
          }
      },
      "PublicLoadBalancer": {
          "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
          "Properties": {
              "Scheme": "internet-facing",
              "LoadBalancerAttributes": [
                  {
                      "Key": "idle_timeout.timeout_seconds",
                      "Value": "30"
                  }
              ],
              "Subnets": {
                  "Ref": "PublicSubnetIds"
              },
              "SecurityGroups": [
                  {
                      "Ref": "PublicLoadBalancerSG"
                  }
              ]
          }
      },
      "PublicLoadBalancerListener": {
          "Type": "AWS::ElasticLoadBalancingV2::Listener",
          "Properties": {
              "DefaultActions": [
                  {
                      "Type": "forward",
                      "ForwardConfig": {
                          "TargetGroups": [
                              {
                                  "TargetGroupArn": {
                                      "Ref": "ServiceTargetGroup"
                                  },
                                  "Weight": 100
                              }
                          ]
                      }
                  }
              ],
              "LoadBalancerArn": {
                  "Ref": "PublicLoadBalancer"
              },
              "Port": 80,
              "Protocol": "HTTP"
          }
      },
      "ServiceIngressfromLoadBalancer": {
          "Type": "AWS::EC2::SecurityGroupIngress",
          "Properties": {
              "Description": "Ingress from the public ALB",
              "GroupId": {
                  "Ref": "ServiceSecurityGroup"
              },
              "IpProtocol": -1,
              "SourceSecurityGroupId": {
                  "Ref": "PublicLoadBalancerSG"
              }
          }
      },
      "LogGroup": {
          "Type": "AWS::Logs::LogGroup"
      }
  }
}
```

### YAML
<a name="quickref-ecs-example-2.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: >-
  An example service that deploys in AWS VPC networking mode on EC2 capacity.
  Service uses a capacity provider to request EC2 instances to run on. Service
  runs with networking in private subnets, but still accessible to the internet
  via a load balancer hosted in public subnets.
Parameters:
  VpcId:
    Type: String
    Description: The VPC that the service is running inside of
  PublicSubnetIds:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: List of public subnet ID's to put the load balancer in
  PrivateSubnetIds:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: List of private subnet ID's that the AWS VPC tasks are in
  ClusterName:
    Type: String
    Description: The name of the ECS cluster into which to launch capacity.
  ECSTaskExecutionRole:
    Type: String
    Description: The role used to start up an ECS task
  CapacityProvider:
    Type: String
    Description: >-
      The cluster capacity provider that the service should use to request
      capacity when it wants to start up a task
  ServiceName:
    Type: String
    Default: web
    Description: A name for the service
  ImageUrl:
    Type: String
    Default: 'public.ecr.aws/docker/library/nginx:latest'
    Description: >-
      The url of a docker image that contains the application process that will
      handle the traffic for this service
  ContainerCpu:
    Type: Number
    Default: 256
    Description: How much CPU to give the container. 1024 is 1 CPU
  ContainerMemory:
    Type: Number
    Default: 512
    Description: How much memory in megabytes to give the container
  ContainerPort:
    Type: Number
    Default: 80
    Description: What port that the application expects traffic on
  DesiredCount:
    Type: Number
    Default: 2
    Description: How many copies of the service task to run
Resources:
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Ref ServiceName
      Cpu: !Ref ContainerCpu
      Memory: !Ref ContainerMemory
      NetworkMode: awsvpc
      RequiresCompatibilities:
        - EC2
      ExecutionRoleArn: !Ref ECSTaskExecutionRole
      ContainerDefinitions:
        - Name: !Ref ServiceName
          Cpu: !Ref ContainerCpu
          Memory: !Ref ContainerMemory
          Image: !Ref ImageUrl
          PortMappings:
            - ContainerPort: !Ref ContainerPort
              HostPort: !Ref ContainerPort
          LogConfiguration:
            LogDriver: awslogs
            Options:
              mode: non-blocking
              max-buffer-size: 25m
              awslogs-group: !Ref LogGroup
              awslogs-region: !Ref AWS::Region
              awslogs-stream-prefix: !Ref ServiceName
  Service:
    Type: AWS::ECS::Service
    DependsOn: PublicLoadBalancerListener
    Properties:
      ServiceName: !Ref ServiceName
      Cluster: !Ref ClusterName
      PlacementStrategies:
        - Field: 'attribute:ecs.availability-zone'
          Type: spread
        - Field: cpu
          Type: binpack
      CapacityProviderStrategy:
        - Base: 0
          CapacityProvider: !Ref CapacityProvider
          Weight: 1
      NetworkConfiguration:
        AwsvpcConfiguration:
          SecurityGroups:
            - !Ref ServiceSecurityGroup
          Subnets: !Ref PrivateSubnetIds
      DeploymentConfiguration:
        MaximumPercent: 200
        MinimumHealthyPercent: 75
      DesiredCount: !Ref DesiredCount
      TaskDefinition: !Ref TaskDefinition
      LoadBalancers:
        - ContainerName: !Ref ServiceName
          ContainerPort: !Ref ContainerPort
          TargetGroupArn: !Ref ServiceTargetGroup
  ServiceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for service
      VpcId: !Ref VpcId
  ServiceTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 6
      HealthCheckPath: /
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 2
      TargetType: ip
      Port: !Ref ContainerPort
      Protocol: HTTP
      UnhealthyThresholdCount: 10
      VpcId: !Ref VpcId
      TargetGroupAttributes:
        - Key: deregistration_delay.timeout_seconds
          Value: 0
  PublicLoadBalancerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to the public facing load balancer
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          IpProtocol: -1
  PublicLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      LoadBalancerAttributes:
        - Key: idle_timeout.timeout_seconds
          Value: '30'
      Subnets: !Ref PublicSubnetIds
      SecurityGroups:
        - !Ref PublicLoadBalancerSG
  PublicLoadBalancerListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ServiceTargetGroup
                Weight: 100
      LoadBalancerArn: !Ref PublicLoadBalancer
      Port: 80
      Protocol: HTTP
  ServiceIngressfromLoadBalancer:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      Description: Ingress from the public ALB
      GroupId: !Ref ServiceSecurityGroup
      IpProtocol: -1
      SourceSecurityGroupId: !Ref PublicLoadBalancerSG
  LogGroup:
    Type: AWS::Logs::LogGroup
```

# Plantilla de ejemplo de Amazon Elastic File System
<a name="quickref-efs"></a>

Amazon Elastic File System (Amazon EFS) es un servicio de almacenamiento de archivos para instancias Amazon Elastic Compute Cloud (Amazon EC2). Con Amazon EFS, sus aplicaciones cuentan con almacenamiento cuando lo necesitan, ya que la capacidad de almacenamiento crece y se reduce automáticamente a medida que añade o elimina archivos.

La siguiente plantilla de ejemplo implementa instancias de EC2 (en un grupo de Auto Scaling) que están asociadas con un sistema de archivos de Amazon EFS. Para asociar las instancias con el sistema de archivos, las instancias ejecutan el script auxiliar cfn-init que descarga e instala el paquete yum `nfs-utils`, crea un nuevo directorio y, a continuación, utiliza el nombre de DNS del sistema de archivos para montar el sistema de archivos en ese directorio. El nombre de DNS del sistema de archivos se resuelve en una dirección IP del destino de montaje en la zona de disponibilidad de la instancia Amazon EC2. Para obtener más información sobre la estructura de nombres de DNS, consulte [Montaje de sistemas de archivos](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html) en la *Guía del usuario de Amazon Elastic File System*.

Para medir la actividad del Sistema de archivos de red (NFS), la plantilla incluye métricas de Amazon CloudWatch personalizadas. La plantilla también crea una VPC, una subred y grupos de seguridad. Para permitir que las instancias se comuniquen con el sistema de archivos, la VPC debe tener el DNS habilitado, y el destino de montaje y las instancias de EC2 tienen que estar en la misma zona de disponibilidad (AZ), especificada por la subred.

El grupo de seguridad del destino de montaje permite una conexión de red al puerto TCP 2049, que es necesaria para que un cliente NFSv4 monte un sistema de archivos. Para obtener más información acerca de los grupos de seguridad para las instancias de EC2 y los destinos de montaje, consulte [Seguridad](https://docs.aws.amazon.com/efs/latest/ug/security-considerations.html) en la [https://docs.aws.amazon.com/efs/latest/ug/](https://docs.aws.amazon.com/efs/latest/ug/).

**nota**  
Si realiza una actualización en el destino de montaje que provoca que haya que sustituirlo, las instancias o aplicaciones que utilizan el sistema de archivos asociados puede verse afectado. Esto puede provocar la pérdida de escrituras sin confirmar. Para evitar interrupciones, detenga las instancias al actualizar el destino de montaje configurando la capacidad deseada en cero. Esto permite que las instancias desmonten el sistema de archivos antes de que se elimine el destino de montaje. Una vez completada la actualización de montaje, comience las instancias en una actualización posterior configurando la capacidad deseada.

## JSON
<a name="quickref-efs-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "This template creates an Amazon EFS file system and mount target and associates it with Amazon EC2 instances in an Auto Scaling group. **WARNING** This template creates Amazon EC2 instances and related resources. You will be billed for the AWS resources used if you create a stack from this template.",
  "Parameters": {
    "InstanceType" : {
      "Description" : "WebServer EC2 instance type",
      "Type" : "String",
      "Default" : "t2.small",
      "AllowedValues" : [ 
        "t1.micro", 
        "t2.nano", 
        "t2.micro", 
        "t2.small", 
        "t2.medium", 
        "t2.large", 
        "m1.small", 
        "m1.medium", 
        "m1.large", 
        "m1.xlarge", 
        "m2.xlarge", 
        "m2.2xlarge", 
        "m2.4xlarge", 
        "m3.medium", 
        "m3.large", 
        "m3.xlarge", 
        "m3.2xlarge", 
        "m4.large", 
        "m4.xlarge", 
        "m4.2xlarge", 
        "m4.4xlarge", 
        "m4.10xlarge", 
        "c1.medium", 
        "c1.xlarge", 
        "c3.large", 
        "c3.xlarge", 
        "c3.2xlarge", 
        "c3.4xlarge", 
        "c3.8xlarge", 
        "c4.large", 
        "c4.xlarge", 
        "c4.2xlarge", 
        "c4.4xlarge", 
        "c4.8xlarge", 
        "g2.2xlarge", 
        "g2.8xlarge", 
        "r3.large", 
        "r3.xlarge", 
        "r3.2xlarge", 
        "r3.4xlarge", 
        "r3.8xlarge", 
        "i2.xlarge", 
        "i2.2xlarge", 
        "i2.4xlarge", 
        "i2.8xlarge", 
        "d2.xlarge", 
        "d2.2xlarge", 
        "d2.4xlarge", 
        "d2.8xlarge", 
        "hi1.4xlarge", 
        "hs1.8xlarge", 
        "cr1.8xlarge", 
        "cc2.8xlarge", 
        "cg1.4xlarge"
      ],
      "ConstraintDescription" : "must be a valid EC2 instance type."
    },
    "KeyName": {
      "Type": "AWS::EC2::KeyPair::KeyName",
      "Description": "Name of an existing EC2 key pair to enable SSH access to the EC2 instances"
    },
    "AsgMaxSize": {
      "Type": "Number",
      "Description": "Maximum size and initial desired capacity of Auto Scaling Group",
      "Default": "2"
    },
    "SSHLocation" : {
      "Description" : "The IP address range that can be used to connect to the EC2 instances by using SSH",
      "Type": "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default": "0.0.0.0/0",
      "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "VolumeName" : {
      "Description" : "The name to be used for the EFS volume",
      "Type": "String",
      "MinLength": "1",
      "Default": "myEFSvolume"
    },
    "MountPoint" : {
      "Description" : "The Linux mount point for the EFS volume",
      "Type": "String",
      "MinLength": "1",
      "Default": "myEFSvolume"
    }
  },
  "Mappings" : {
    "AWSInstanceType2Arch" : {
      "t1.micro"    : { "Arch" : "HVM64"  },
      "t2.nano"     : { "Arch" : "HVM64"  },
      "t2.micro"    : { "Arch" : "HVM64"  },
      "t2.small"    : { "Arch" : "HVM64"  },
      "t2.medium"   : { "Arch" : "HVM64"  },
      "t2.large"    : { "Arch" : "HVM64"  },
      "m1.small"    : { "Arch" : "HVM64"  },
      "m1.medium"   : { "Arch" : "HVM64"  },
      "m1.large"    : { "Arch" : "HVM64"  },
      "m1.xlarge"   : { "Arch" : "HVM64"  },
      "m2.xlarge"   : { "Arch" : "HVM64"  },
      "m2.2xlarge"  : { "Arch" : "HVM64"  },
      "m2.4xlarge"  : { "Arch" : "HVM64"  },
      "m3.medium"   : { "Arch" : "HVM64"  },
      "m3.large"    : { "Arch" : "HVM64"  },
      "m3.xlarge"   : { "Arch" : "HVM64"  },
      "m3.2xlarge"  : { "Arch" : "HVM64"  },
      "m4.large"    : { "Arch" : "HVM64"  },
      "m4.xlarge"   : { "Arch" : "HVM64"  },
      "m4.2xlarge"  : { "Arch" : "HVM64"  },
      "m4.4xlarge"  : { "Arch" : "HVM64"  },
      "m4.10xlarge" : { "Arch" : "HVM64"  },
      "c1.medium"   : { "Arch" : "HVM64"  },
      "c1.xlarge"   : { "Arch" : "HVM64"  },
      "c3.large"    : { "Arch" : "HVM64"  },
      "c3.xlarge"   : { "Arch" : "HVM64"  },
      "c3.2xlarge"  : { "Arch" : "HVM64"  },
      "c3.4xlarge"  : { "Arch" : "HVM64"  },
      "c3.8xlarge"  : { "Arch" : "HVM64"  },
      "c4.large"    : { "Arch" : "HVM64"  },
      "c4.xlarge"   : { "Arch" : "HVM64"  },
      "c4.2xlarge"  : { "Arch" : "HVM64"  },
      "c4.4xlarge"  : { "Arch" : "HVM64"  },
      "c4.8xlarge"  : { "Arch" : "HVM64"  },
      "g2.2xlarge"  : { "Arch" : "HVMG2"  },
      "g2.8xlarge"  : { "Arch" : "HVMG2"  },
      "r3.large"    : { "Arch" : "HVM64"  },
      "r3.xlarge"   : { "Arch" : "HVM64"  },
      "r3.2xlarge"  : { "Arch" : "HVM64"  },
      "r3.4xlarge"  : { "Arch" : "HVM64"  },
      "r3.8xlarge"  : { "Arch" : "HVM64"  },
      "i2.xlarge"   : { "Arch" : "HVM64"  },
      "i2.2xlarge"  : { "Arch" : "HVM64"  },
      "i2.4xlarge"  : { "Arch" : "HVM64"  },
      "i2.8xlarge"  : { "Arch" : "HVM64"  },
      "d2.xlarge"   : { "Arch" : "HVM64"  },
      "d2.2xlarge"  : { "Arch" : "HVM64"  },
      "d2.4xlarge"  : { "Arch" : "HVM64"  },
      "d2.8xlarge"  : { "Arch" : "HVM64"  },
      "hi1.4xlarge" : { "Arch" : "HVM64"  },
      "hs1.8xlarge" : { "Arch" : "HVM64"  },
      "cr1.8xlarge" : { "Arch" : "HVM64"  },
      "cc2.8xlarge" : { "Arch" : "HVM64"  }
    },
    "AWSRegionArch2AMI" : {
      "us-east-1"        : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"},
      "us-west-2"        : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"},
      "us-west-1"        : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"},
      "eu-west-1"        : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"},
      "eu-west-2"        : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"},
      "eu-west-3"        : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"},
      "eu-central-1"     : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"},
      "ap-northeast-1"   : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"},
      "ap-northeast-2"   : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"},
      "ap-northeast-3"   : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"},
      "ap-southeast-1"   : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"},
      "ap-southeast-2"   : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"},
      "ap-south-1"       : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"},
      "us-east-2"        : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"},
      "ca-central-1"     : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"},
      "sa-east-1"        : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"},
      "cn-north-1"       : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"},
      "cn-northwest-1"   : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"}
    }
  },
  "Resources": {
    "CloudWatchPutMetricsRole" : {
      "Type"  : "AWS::IAM::Role",
      "Properties" : {
          "AssumeRolePolicyDocument" : {
              "Statement" : [ {
                  "Effect" : "Allow",
                  "Principal" : {
                      "Service" : [ "ec2.amazonaws.com" ]
                  },
                  "Action" : [ "sts:AssumeRole" ]
              } ]
          },
          "Path" : "/"
      }
    },
    "CloudWatchPutMetricsRolePolicy" : {
        "Type" : "AWS::IAM::Policy",
        "Properties" : {
            "PolicyName" : "CloudWatch_PutMetricData",
            "PolicyDocument" : {
              "Version": "2012-10-17",		 	 	 
              "Statement": [
                {
                  "Sid": "CloudWatchPutMetricData",
                  "Effect": "Allow",
                  "Action": ["cloudwatch:PutMetricData"],
                  "Resource": ["*"]
                }
              ]
            },
            "Roles" : [ { "Ref" : "CloudWatchPutMetricsRole" } ]
        }
    },
    "CloudWatchPutMetricsInstanceProfile" : {
      "Type" : "AWS::IAM::InstanceProfile",
      "Properties" : {
        "Path" : "/",
        "Roles" : [ { "Ref" : "CloudWatchPutMetricsRole" } ]
      }
    },
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "EnableDnsSupport" : "true",
        "EnableDnsHostnames" : "true",
        "CidrBlock": "10.0.0.0/16",
        "Tags": [ {"Key": "Application", "Value": { "Ref": "AWS::StackId"} } ]
      }
    },
    "InternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway",
      "Properties" : {
        "Tags" : [
          { "Key" : "Application", "Value" : { "Ref" : "AWS::StackName" } },
          { "Key" : "Network", "Value" : "Public" }
        ]
      }
    },
    "GatewayToInternet" : {
      "Type" : "AWS::EC2::VPCGatewayAttachment",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "InternetGatewayId" : { "Ref" : "InternetGateway" }
      }
    },
    "RouteTable":{
      "Type":"AWS::EC2::RouteTable",
      "Properties":{
        "VpcId": {"Ref":"VPC"}
      }
    },
    "SubnetRouteTableAssoc": {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "RouteTableId" : {"Ref":"RouteTable"},
        "SubnetId" : {"Ref":"Subnet"}
      }
    },
    "InternetGatewayRoute": {
        "Type":"AWS::EC2::Route",
        "Properties":{
            "DestinationCidrBlock":"0.0.0.0/0",
            "RouteTableId":{"Ref":"RouteTable"},
            "GatewayId":{"Ref":"InternetGateway"}
        }
    },
    "Subnet": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "CidrBlock": "10.0.0.0/24",
        "Tags": [ { "Key": "Application", "Value": { "Ref": "AWS::StackId" } } ]
      }
    },    
    "InstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "GroupDescription": "Enable SSH access via port 22",
        "SecurityGroupIngress": [
          { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } },
          { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" }
         ]
      }
    },
    "MountTargetSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "GroupDescription": "Security group for mount target",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 2049,
            "ToPort": 2049,
            "CidrIp": "0.0.0.0/0"
          }
        ]
      }
    },
    "FileSystem": {
      "Type": "AWS::EFS::FileSystem",
      "Properties": {
        "PerformanceMode": "generalPurpose",
        "FileSystemTags": [
          {
            "Key": "Name",
            "Value": { "Ref" : "VolumeName" }
          }
        ]
      }
    },
    "MountTarget": {
      "Type": "AWS::EFS::MountTarget",
      "Properties": {
        "FileSystemId": { "Ref": "FileSystem" },
        "SubnetId": { "Ref": "Subnet" },
        "SecurityGroups": [ { "Ref": "MountTargetSecurityGroup" } ]        
      }
    },
    "LaunchConfiguration": {
      "Type": "AWS::AutoScaling::LaunchConfiguration",
      "Metadata" : {
        "AWS::CloudFormation::Init" : {
          "configSets" : {
            "MountConfig" : [ "setup", "mount" ]
          },
          "setup" : {
            "packages" : {
              "yum" : {
                "nfs-utils" : []
              }
            },
            "files" : {
              "/home/ec2-user/post_nfsstat" : {
                "content" : { "Fn::Join" : [ "", [
                      "#!/bin/bash\n",
                      "\n",
                      "INPUT=\"$(cat)\"\n",
                      "CW_JSON_OPEN='{ \"Namespace\": \"EFS\", \"MetricData\": [ '\n",
                      "CW_JSON_CLOSE=' ] }'\n",
                      "CW_JSON_METRIC=''\n",
                      "METRIC_COUNTER=0\n",
                      "\n",
                      "for COL in 1 2 3 4 5 6; do\n",
                      "\n",
                      " COUNTER=0\n",
                      " METRIC_FIELD=$COL\n",
                      " DATA_FIELD=$(($COL+($COL-1)))\n",
                      "\n",
                      " while read line; do\n",
                      "   if [[ COUNTER -gt 0 ]]; then\n",
                      "\n",
                      "     LINE=`echo $line | tr -s ' ' `\n",
                      "     AWS_COMMAND=\"aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, "\"\n",
                      "     MOD=$(( $COUNTER % 2))\n",
                      "\n",
                      "     if [ $MOD -eq 1 ]; then\n",
                      "       METRIC_NAME=`echo $LINE | cut -d ' ' -f $METRIC_FIELD`\n",
                      "     else\n",
                      "       METRIC_VALUE=`echo $LINE | cut -d ' ' -f $DATA_FIELD`\n",
                      "     fi\n",
                      "\n",
                      "     if [[ -n \"$METRIC_NAME\" && -n \"$METRIC_VALUE\" ]]; then\n",
                      "       INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)\n",
                      "       CW_JSON_METRIC=\"$CW_JSON_METRIC { \\\"MetricName\\\": \\\"$METRIC_NAME\\\", \\\"Dimensions\\\": [{\\\"Name\\\": \\\"InstanceId\\\", \\\"Value\\\": \\\"$INSTANCE_ID\\\"} ], \\\"Value\\\": $METRIC_VALUE },\"\n",
                      "       unset METRIC_NAME\n",
                      "       unset METRIC_VALUE\n",
                      "\n",
                      "       METRIC_COUNTER=$((METRIC_COUNTER+1))\n",
                      "       if [ $METRIC_COUNTER -eq 20 ]; then\n",
                      "         # 20 is max metric collection size, so we have to submit here\n",
                      "         aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, " --cli-input-json \"`echo $CW_JSON_OPEN ${CW_JSON_METRIC%?} $CW_JSON_CLOSE`\"\n",
                      "\n",
                      "         # reset\n",
                      "         METRIC_COUNTER=0\n",
                      "         CW_JSON_METRIC=''\n",
                      "       fi\n",
                      "     fi  \n",
                      "\n",
                      "\n",
                      "\n",
                      "     COUNTER=$((COUNTER+1))\n",
                      "   fi\n",
                      "\n",
                      "   if [[ \"$line\" == \"Client nfs v4:\" ]]; then\n",
                      "     # the next line is the good stuff \n",
                      "     COUNTER=$((COUNTER+1))\n",
                      "   fi\n",
                      " done <<< \"$INPUT\"\n",
                      "done\n",
                      "\n",
                      "# submit whatever is left\n",
                      "aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, " --cli-input-json \"`echo $CW_JSON_OPEN ${CW_JSON_METRIC%?} $CW_JSON_CLOSE`\""
                    ] ] },
                "mode": "000755",
                "owner": "ec2-user",
                "group": "ec2-user"
              },
              "/home/ec2-user/crontab" : {
                "content" : { "Fn::Join" : [ "", [
                  "* * * * * /usr/sbin/nfsstat | /home/ec2-user/post_nfsstat\n"
                ] ] },
                "owner": "ec2-user",
                "group": "ec2-user"
              }
            },
            "commands" : {
              "01_createdir" : {
                "command" : {"Fn::Join" : [ "", [ "mkdir /", { "Ref" : "MountPoint" }]]}
              }
            }
          },
          "mount" : {
            "commands" : {
              "01_mount" : {
                "command" : { "Fn::Sub": "sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 ${FileSystem}.efs.${AWS::Region}.amazonaws.com:/ /${MountPoint}"}
              },
              "02_permissions" : {
                "command" : {"Fn::Join" : [ "", [ "chown ec2-user:ec2-user /", { "Ref" : "MountPoint" }]]}
              }
            }
          }
        }
      },
      "Properties": {
        "AssociatePublicIpAddress" : true,
        "ImageId": {
          "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, {
            "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ]
          } ]
        },
        "InstanceType": { "Ref": "InstanceType" },
        "KeyName": { "Ref": "KeyName" },
        "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ],
        "IamInstanceProfile" : { "Ref" : "CloudWatchPutMetricsInstanceProfile" },
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
             "#!/bin/bash -xe\n",
             "yum install -y aws-cfn-bootstrap\n",

             "/opt/aws/bin/cfn-init -v ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource LaunchConfiguration ",
             "         --configsets MountConfig ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n",

             "crontab /home/ec2-user/crontab\n",

             "/opt/aws/bin/cfn-signal -e $? ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource AutoScalingGroup ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n"
        ]]}}
      }
    },
    "AutoScalingGroup": {
      "Type": "AWS::AutoScaling::AutoScalingGroup",
      "DependsOn": ["MountTarget", "GatewayToInternet"],
      "CreationPolicy" : {
        "ResourceSignal" : {
          "Timeout" : "PT15M",
          "Count"   : { "Ref": "AsgMaxSize" }
        }
      },
      "Properties": {
        "VPCZoneIdentifier": [ { "Ref": "Subnet" } ],
        "LaunchConfigurationName": { "Ref": "LaunchConfiguration" },
        "MinSize": "1",
        "MaxSize": { "Ref": "AsgMaxSize" },
        "DesiredCapacity": { "Ref": "AsgMaxSize" },
        "Tags": [ {
          "Key": "Name",
          "Value": "EFS FileSystem Mounted Instance",
          "PropagateAtLaunch": "true"
        } ]
      }
    }
  },
  "Outputs" : {
    "MountTargetID" : {
      "Description" : "Mount target ID",
      "Value" :  { "Ref" : "MountTarget" }
    },
    "FileSystemID" : {
      "Description" : "File system ID",
      "Value" :  { "Ref" : "FileSystem" }
    }
  }
}
```

## YAML
<a name="quickref-efs-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: This template creates an Amazon EFS file system and mount target and
  associates it with Amazon EC2 instances in an Auto Scaling group. **WARNING** This
  template creates Amazon EC2 instances and related resources. You will be billed
  for the AWS resources used if you create a stack from this template.
Parameters:
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.small
    AllowedValues:
      - t1.micro
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
      - m1.small
      - m1.medium
      - m1.large
      - m1.xlarge
      - m2.xlarge
      - m2.2xlarge
      - m2.4xlarge
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
      - m4.large
      - m4.xlarge
      - m4.2xlarge
      - m4.4xlarge
      - m4.10xlarge
      - c1.medium
      - c1.xlarge
      - c3.large
      - c3.xlarge
      - c3.2xlarge
      - c3.4xlarge
      - c3.8xlarge
      - c4.large
      - c4.xlarge
      - c4.2xlarge
      - c4.4xlarge
      - c4.8xlarge
      - g2.2xlarge
      - g2.8xlarge
      - r3.large
      - r3.xlarge
      - r3.2xlarge
      - r3.4xlarge
      - r3.8xlarge
      - i2.xlarge
      - i2.2xlarge
      - i2.4xlarge
      - i2.8xlarge
      - d2.xlarge
      - d2.2xlarge
      - d2.4xlarge
      - d2.8xlarge
      - hi1.4xlarge
      - hs1.8xlarge
      - cr1.8xlarge
      - cc2.8xlarge
      - cg1.4xlarge
    ConstraintDescription: must be a valid EC2 instance type.
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: Name of an existing EC2 key pair to enable SSH access to the ECS
      instances
  AsgMaxSize:
    Type: Number
    Description: Maximum size and initial desired capacity of Auto Scaling Group
    Default: '2'
  SSHLocation:
    Description: The IP address range that can be used to connect to the EC2 instances
      by using SSH
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  VolumeName:
    Description: The name to be used for the EFS volume
    Type: String
    MinLength: '1'
    Default: myEFSvolume
  MountPoint:
    Description: The Linux mount point for the EFS volume
    Type: String
    MinLength: '1'
    Default: myEFSvolume
Mappings:
  AWSInstanceType2Arch:
    t1.micro:
      Arch: HVM64
    t2.nano:
      Arch: HVM64
    t2.micro:
      Arch: HVM64
    t2.small:
      Arch: HVM64
    t2.medium:
      Arch: HVM64
    t2.large:
      Arch: HVM64
    m1.small:
      Arch: HVM64
    m1.medium:
      Arch: HVM64
    m1.large:
      Arch: HVM64
    m1.xlarge:
      Arch: HVM64
    m2.xlarge:
      Arch: HVM64
    m2.2xlarge:
      Arch: HVM64
    m2.4xlarge:
      Arch: HVM64
    m3.medium:
      Arch: HVM64
    m3.large:
      Arch: HVM64
    m3.xlarge:
      Arch: HVM64
    m3.2xlarge:
      Arch: HVM64
    m4.large:
      Arch: HVM64
    m4.xlarge:
      Arch: HVM64
    m4.2xlarge:
      Arch: HVM64
    m4.4xlarge:
      Arch: HVM64
    m4.10xlarge:
      Arch: HVM64
    c1.medium:
      Arch: HVM64
    c1.xlarge:
      Arch: HVM64
    c3.large:
      Arch: HVM64
    c3.xlarge:
      Arch: HVM64
    c3.2xlarge:
      Arch: HVM64
    c3.4xlarge:
      Arch: HVM64
    c3.8xlarge:
      Arch: HVM64
    c4.large:
      Arch: HVM64
    c4.xlarge:
      Arch: HVM64
    c4.2xlarge:
      Arch: HVM64
    c4.4xlarge:
      Arch: HVM64
    c4.8xlarge:
      Arch: HVM64
    g2.2xlarge:
      Arch: HVMG2
    g2.8xlarge:
      Arch: HVMG2
    r3.large:
      Arch: HVM64
    r3.xlarge:
      Arch: HVM64
    r3.2xlarge:
      Arch: HVM64
    r3.4xlarge:
      Arch: HVM64
    r3.8xlarge:
      Arch: HVM64
    i2.xlarge:
      Arch: HVM64
    i2.2xlarge:
      Arch: HVM64
    i2.4xlarge:
      Arch: HVM64
    i2.8xlarge:
      Arch: HVM64
    d2.xlarge:
      Arch: HVM64
    d2.2xlarge:
      Arch: HVM64
    d2.4xlarge:
      Arch: HVM64
    d2.8xlarge:
      Arch: HVM64
    hi1.4xlarge:
      Arch: HVM64
    hs1.8xlarge:
      Arch: HVM64
    cr1.8xlarge:
      Arch: HVM64
    cc2.8xlarge:
      Arch: HVM64
  AWSRegionArch2AMI:
    us-east-1:
      HVM64: ami-0ff8a91507f77f867
      HVMG2: ami-0a584ac55a7631c0c
    us-west-2:
      HVM64: ami-a0cfeed8
      HVMG2: ami-0e09505bc235aa82d
    us-west-1:
      HVM64: ami-0bdb828fd58c52235
      HVMG2: ami-066ee5fd4a9ef77f1
    eu-west-1:
      HVM64: ami-047bb4163c506cd98
      HVMG2: ami-0a7c483d527806435
    eu-west-2:
      HVM64: ami-f976839e
      HVMG2: NOT_SUPPORTED
    eu-west-3:
      HVM64: ami-0ebc281c20e89ba4b
      HVMG2: NOT_SUPPORTED
    eu-central-1:
      HVM64: ami-0233214e13e500f77
      HVMG2: ami-06223d46a6d0661c7
    ap-northeast-1:
      HVM64: ami-06cd52961ce9f0d85
      HVMG2: ami-053cdd503598e4a9d
    ap-northeast-2:
      HVM64: ami-0a10b2721688ce9d2
      HVMG2: NOT_SUPPORTED
    ap-northeast-3:
      HVM64: ami-0d98120a9fb693f07
      HVMG2: NOT_SUPPORTED
    ap-southeast-1:
      HVM64: ami-08569b978cc4dfa10
      HVMG2: ami-0be9df32ae9f92309
    ap-southeast-2:
      HVM64: ami-09b42976632b27e9b
      HVMG2: ami-0a9ce9fecc3d1daf8
    ap-south-1:
      HVM64: ami-0912f71e06545ad88
      HVMG2: ami-097b15e89dbdcfcf4
    us-east-2:
      HVM64: ami-0b59bfac6be064b78
      HVMG2: NOT_SUPPORTED
    ca-central-1:
      HVM64: ami-0b18956f
      HVMG2: NOT_SUPPORTED
    sa-east-1:
      HVM64: ami-07b14488da8ea02a0
      HVMG2: NOT_SUPPORTED
    cn-north-1:
      HVM64: ami-0a4eaf6c4454eda75
      HVMG2: NOT_SUPPORTED
    cn-northwest-1:
      HVM64: ami-6b6a7d09
      HVMG2: NOT_SUPPORTED
Resources:
  CloudWatchPutMetricsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  CloudWatchPutMetricsRolePolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: CloudWatch_PutMetricData
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Sid: CloudWatchPutMetricData
          Effect: Allow
          Action:
          - cloudwatch:PutMetricData
          Resource:
          - "*"
      Roles:
      - Ref: CloudWatchPutMetricsRole
  CloudWatchPutMetricsInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - Ref: CloudWatchPutMetricsRole
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
      CidrBlock: 10.0.0.0/16
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackName
      - Key: Network
        Value: Public
  GatewayToInternet:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: InternetGateway
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC
  SubnetRouteTableAssoc:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId:
        Ref: RouteTable
      SubnetId:
        Ref: Subnet
  InternetGatewayRoute:
    Type: AWS::EC2::Route
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      RouteTableId:
        Ref: RouteTable
      GatewayId:
        Ref: InternetGateway
  Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      CidrBlock: 10.0.0.0/24
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VPC
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp:
          Ref: SSHLocation
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  MountTargetSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VPC
      GroupDescription: Security group for mount target
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 2049
        ToPort: 2049
        CidrIp: 0.0.0.0/0
  FileSystem:
    Type: AWS::EFS::FileSystem
    Properties:
      PerformanceMode: generalPurpose
      FileSystemTags:
      - Key: Name
        Value:
          Ref: VolumeName
  MountTarget:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId:
        Ref: FileSystem
      SubnetId:
        Ref: Subnet
      SecurityGroups:
      - Ref: MountTargetSecurityGroup
  LaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Metadata:
      AWS::CloudFormation::Init:
        configSets:
          MountConfig:
          - setup
          - mount
        setup:
          packages:
            yum:
              nfs-utils: []
          files:
            "/home/ec2-user/post_nfsstat":
              content: !Sub |
                #!/bin/bash

                INPUT="$(cat)"
                CW_JSON_OPEN='{ "Namespace": "EFS", "MetricData": [ '
                CW_JSON_CLOSE=' ] }'
                CW_JSON_METRIC=''
                METRIC_COUNTER=0

                for COL in 1 2 3 4 5 6; do

                 COUNTER=0
                 METRIC_FIELD=$COL
                 DATA_FIELD=$(($COL+($COL-1)))

                 while read line; do
                   if [[ COUNTER -gt 0 ]]; then

                     LINE=`echo $line | tr -s ' ' `
                     AWS_COMMAND="aws cloudwatch put-metric-data --region ${AWS::Region}"
                     MOD=$(( $COUNTER % 2))

                     if [ $MOD -eq 1 ]; then
                       METRIC_NAME=`echo $LINE | cut -d ' ' -f $METRIC_FIELD`
                     else
                       METRIC_VALUE=`echo $LINE | cut -d ' ' -f $DATA_FIELD`
                     fi

                     if [[ -n "$METRIC_NAME" && -n "$METRIC_VALUE" ]]; then
                       INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
                       CW_JSON_METRIC="$CW_JSON_METRIC { \"MetricName\": \"$METRIC_NAME\", \"Dimensions\": [{\"Name\": \"InstanceId\", \"Value\": \"$INSTANCE_ID\"} ], \"Value\": $METRIC_VALUE },"
                       unset METRIC_NAME
                       unset METRIC_VALUE

                       METRIC_COUNTER=$((METRIC_COUNTER+1))
                       if [ $METRIC_COUNTER -eq 20 ]; then
                         # 20 is max metric collection size, so we have to submit here
                         aws cloudwatch put-metric-data --region ${AWS::Region} --cli-input-json "`echo $CW_JSON_OPEN ${!CW_JSON_METRIC%?} $CW_JSON_CLOSE`"

                         # reset
                         METRIC_COUNTER=0
                         CW_JSON_METRIC=''
                       fi
                     fi



                     COUNTER=$((COUNTER+1))
                   fi

                   if [[ "$line" == "Client nfs v4:" ]]; then
                     # the next line is the good stuff
                     COUNTER=$((COUNTER+1))
                   fi
                 done <<< "$INPUT"
                done

                # submit whatever is left
                aws cloudwatch put-metric-data --region ${AWS::Region} --cli-input-json "`echo $CW_JSON_OPEN ${!CW_JSON_METRIC%?} $CW_JSON_CLOSE`"
              mode: '000755'
              owner: ec2-user
              group: ec2-user
            "/home/ec2-user/crontab":
              content: "* * * * * /usr/sbin/nfsstat | /home/ec2-user/post_nfsstat\n"
              owner: ec2-user
              group: ec2-user
          commands:
            01_createdir:
              command: !Sub "mkdir /${MountPoint}"
        mount:
          commands:
            01_mount:
              command: !Sub >
                mount -t nfs4 -o nfsvers=4.1 ${FileSystem}.efs.${AWS::Region}.amazonaws.com:/ /${MountPoint}
            02_permissions:
              command: !Sub "chown ec2-user:ec2-user /${MountPoint}"
    Properties:
      AssociatePublicIpAddress: true
      ImageId:
        Fn::FindInMap:
        - AWSRegionArch2AMI
        - Ref: AWS::Region
        - Fn::FindInMap:
          - AWSInstanceType2Arch
          - Ref: InstanceType
          - Arch
      InstanceType:
        Ref: InstanceType
      KeyName:
        Ref: KeyName
      SecurityGroups:
      - Ref: InstanceSecurityGroup
      IamInstanceProfile:
        Ref: CloudWatchPutMetricsInstanceProfile
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfiguration --configsets MountConfig --region ${AWS::Region}
          crontab /home/ec2-user/crontab
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource AutoScalingGroup --region ${AWS::Region}
  AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    DependsOn:
    - MountTarget
    - GatewayToInternet
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
        Count:
          Ref: AsgMaxSize
    Properties:
      VPCZoneIdentifier:
      - Ref: Subnet
      LaunchConfigurationName:
        Ref: LaunchConfiguration
      MinSize: '1'
      MaxSize:
        Ref: AsgMaxSize
      DesiredCapacity:
        Ref: AsgMaxSize
      Tags:
      - Key: Name
        Value: EFS FileSystem Mounted Instance
        PropagateAtLaunch: 'true'
Outputs:
  MountTargetID:
    Description: Mount target ID
    Value:
      Ref: MountTarget
  FileSystemID:
    Description: File system ID
    Value:
      Ref: FileSystem
```

# Fragmentos de código de plantillas de Elastic Beanstalk
<a name="quickref-elasticbeanstalk"></a>

Con Elastic Beanstalk puede implementar y administrar rápidamente aplicaciones en AWS sin tener que preocuparse por la infraestructura en la que se ejecutan esas aplicaciones. La siguiente plantilla de ejemplo puede ayudarle a describir los recursos de Elastic Beanstalk en su plantilla de CloudFormation.

## PHP de ejemplo de Elastic Beanstalk
<a name="quickref-elasticbeanstalk-sampleenv"></a>

La siguiente plantilla de ejemplo implementa una aplicación web PHP de ejemplo almacenada en un bucket de Amazon S3. El entorno también es un entorno de escalado automático y de equilibrio de carga, con un mínimo de dos instancias de Amazon EC2 y un máximo de seis. Muestra un entorno de Elastic Beanstalk que utiliza una configuración de lanzamiento heredada. *Para obtener información sobre cómo utilizar una plantilla de lanzamiento en su lugar, consulte [Plantillas de lanzamiento en la ](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-autoscaling-launch-templates.html)Guía para desarrolladores de AWS Elastic Beanstalk*.

Reemplace `solution-stack` por un nombre de pila de soluciones (versión de plataforma). Para obtener una lista de las pilas de soluciones disponibles, utilice el comando de la AWS CLI **aws elasticbeanstalk list-available-solution-stacks**.

### JSON
<a name="quickref-elasticbeanstalk-example-1.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "sampleApplication": {
            "Type": "AWS::ElasticBeanstalk::Application",
            "Properties": {
                "Description": "AWS Elastic Beanstalk Sample Application"
            }
        },
        "sampleApplicationVersion": {
            "Type": "AWS::ElasticBeanstalk::ApplicationVersion",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Application Version",
                "SourceBundle": {
                    "S3Bucket": {
                        "Fn::Sub": "elasticbeanstalk-samples-${AWS::Region}"
                    },
                    "S3Key": "php-newsample-app.zip"
                }
            }
        },
        "sampleConfigurationTemplate": {
            "Type": "AWS::ElasticBeanstalk::ConfigurationTemplate",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Configuration Template",
                "OptionSettings": [
                    {
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MinSize",
                        "Value": "2"
                    },
                    {
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MaxSize",
                        "Value": "6"
                    },
                    {
                        "Namespace": "aws:elasticbeanstalk:environment",
                        "OptionName": "EnvironmentType",
                        "Value": "LoadBalanced"
                    },
                    {
                        "Namespace": "aws:autoscaling:launchconfiguration",
                        "OptionName": "IamInstanceProfile",
                        "Value": {
                            "Ref": "MyInstanceProfile"
                        }
                    }
                ],
                "SolutionStackName": "solution-stack"
            }
        },
        "sampleEnvironment": {
            "Type": "AWS::ElasticBeanstalk::Environment",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Environment",
                "TemplateName": {
                    "Ref": "sampleConfigurationTemplate"
                },
                "VersionLabel": {
                    "Ref": "sampleApplicationVersion"
                }
            }
        },
        "MyInstanceRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Description": "Beanstalk EC2 role",
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier",
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker",
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier"
                ]
            }
        },
        "MyInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Roles": [
                    {
                        "Ref": "MyInstanceRole"
                    }
                ]
            }
        }
    }
}
```

### YAML
<a name="quickref-elasticbeanstalk-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  sampleApplication:
    Type: AWS::ElasticBeanstalk::Application
    Properties:
      Description: AWS Elastic Beanstalk Sample Application
  sampleApplicationVersion:
    Type: AWS::ElasticBeanstalk::ApplicationVersion
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Application Version
      SourceBundle:
        S3Bucket: !Sub "elasticbeanstalk-samples-${AWS::Region}"
        S3Key: php-newsample-app.zip
  sampleConfigurationTemplate:
    Type: AWS::ElasticBeanstalk::ConfigurationTemplate
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Configuration Template
      OptionSettings:
      - Namespace: aws:autoscaling:asg
        OptionName: MinSize
        Value: '2'
      - Namespace: aws:autoscaling:asg
        OptionName: MaxSize
        Value: '6'
      - Namespace: aws:elasticbeanstalk:environment
        OptionName: EnvironmentType
        Value: LoadBalanced
      - Namespace: aws:autoscaling:launchconfiguration
        OptionName: IamInstanceProfile
        Value: !Ref MyInstanceProfile        
      SolutionStackName: solution-stack
  sampleEnvironment:
    Type: AWS::ElasticBeanstalk::Environment
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Environment
      TemplateName:
        Ref: sampleConfigurationTemplate
      VersionLabel:
        Ref: sampleApplicationVersion
  MyInstanceRole:
    Type: AWS::IAM::Role
    Properties: 
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Description: Beanstalk EC2 role
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier
  MyInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties: 
      Roles:
        - !Ref MyInstanceRole
```

# Fragmentos de plantillas de Elastic Load Balancing
<a name="quickref-elb"></a>

Para crear un Equilibrador de carga de aplicación, un Equilibrador de carga de red o un equilibrador de carga de puerta de enlace, utilice los tipos de recursos de V2, que comienzan con `AWS::ElasticLoadBalancingV2`. Para crear un Equilibrador de carga clásico, use los tipos de recursos que empiezan con `AWS::ElasticLoadBalancing`.

**Topics**
+ [Recursos de ELBv2](#scenario-elbv2-load-balancer)
+ [Recursos del Equilibrador de carga clásico](#scenario-elb-load-balancer)

## Recursos de ELBv2
<a name="scenario-elbv2-load-balancer"></a>

En este ejemplo se define un Equilibrador de carga de aplicación con un oyente HTTP y una acción predeterminada que reenvía el tráfico al grupo de destino. El equilibrador de carga usa la configuración de comprobación de estado predeterminada. El grupo objetivo tiene dos instancias de EC2 registradas. 

------
#### [ YAML ]

```
Resources:
  myLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup

  myHTTPlistener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref myLoadBalancer
      Protocol: HTTP
      Port: 80
      DefaultActions:
        - Type: "forward"
          TargetGroupArn: !Ref myTargetGroup
                        
  myTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: "my-target-group"
      Protocol: HTTP
      Port: 80
      TargetType: instance
      VpcId: !Ref myVPC
      Targets:
        - Id: !GetAtt Instance1.InstanceId
          Port: 80
        - Id: !GetAtt Instance2.InstanceId
          Port: 80
```

------
#### [ JSON ]

```
{
    "Resources": {
        "myLoadBalancer": {
            "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
            "Properties": {
                "Name": "my-alb",
                "Type": "application",
                "Scheme": "internal",
                "Subnets": [
                    {
                        "Ref": "subnet-AZ1"
                    },
                    {
                        "Ref": "subnet-AZ2"
                    }
                ],
                "SecurityGroups": [
                    {
                        "Ref": "mySecurityGroup"
                    }
                ]
            }
        },
        "myHTTPlistener": {
            "Type": "AWS::ElasticLoadBalancingV2::Listener",
            "Properties": {
                "LoadBalancerArn": {
                    "Ref": "myLoadBalancer"
                },
                "Protocol": "HTTP",
                "Port": 80,
                "DefaultActions": [
                    {
                        "Type": "forward",
                        "TargetGroupArn": {
                            "Ref": "myTargetGroup"
                        }
                    }
                ]
            }
        },
        "myTargetGroup": {
            "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
            "Properties": {
                "Name": "my-target-group",
                "Protocol": "HTTP",
                "Port": 80,
                "TargetType": "instance",
                "VpcId": {
                    "Ref": "myVPC"
                },
                "Targets": [
                    {
                        "Id": {
                            "Fn::GetAtt": [
                                "Instance1",
                                "InstanceId"
                            ]
                        },
                        "Port": 80
                    },
                    {
                        "Id": {
                            "Fn::GetAtt": [
                                "Instance2",
                                "InstanceId"
                            ]
                        },
                        "Port": 80
                    }
                ]
            }
        }
    }
}
```

------

## Recursos del Equilibrador de carga clásico
<a name="scenario-elb-load-balancer"></a>

En este ejemplo se define un Equilibrador de carga clásico con un oyente HTTP y sin instancias de EC2 registradas. El equilibrador de carga usa la configuración de comprobación de estado predeterminada.

------
#### [ YAML ]

```
myLoadBalancer:
  Type: AWS::ElasticLoadBalancing::LoadBalancer
  Properties:
    AvailabilityZones:
    - "us-east-1a"
    Listeners:
    - LoadBalancerPort: '80'
      InstancePort: '80'
      Protocol: HTTP
```

------
#### [ JSON ]

```
"myLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
        "AvailabilityZones" : [ "us-east-1a" ],
        "Listeners" : [ {
            "LoadBalancerPort" : "80",
            "InstancePort" : "80",
            "Protocol" : "HTTP"
        } ]
    }
}
```

------

En este ejemplo se define un Equilibrador de carga clásico con un oyente HTTP, dos instancias de EC2 registradas y una configuración de comprobación de estado personalizada.

------
#### [ YAML ]

```
myClassicLoadBalancer:
  Type: AWS::ElasticLoadBalancing::LoadBalancer
  Properties:
    AvailabilityZones:
    - "us-east-1a"
    Instances:
    - Ref: Instance1
    - Ref: Instance2
    Listeners:
    - LoadBalancerPort: '80'
      InstancePort: '80'
      Protocol: HTTP
    HealthCheck:
      Target: HTTP:80/
      HealthyThreshold: '3'
      UnhealthyThreshold: '5'
      Interval: '30'
      Timeout: '5'
```

------
#### [ JSON ]

```
"myClassicLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
        "AvailabilityZones" : [ "us-east-1a" ],
        "Instances" : [
            { "Ref" : "Instance1" },
            { "Ref" : "Instance2" }
        ],
        "Listeners" : [ {
            "LoadBalancerPort" : "80",
            "InstancePort" : "80",
            "Protocol" : "HTTP"
        } ],

        "HealthCheck" : {
            "Target" : "HTTP:80/",
            "HealthyThreshold" : "3",
            "UnhealthyThreshold" : "5",
            "Interval" : "30",
            "Timeout" : "5"
        }
    }
}
```

------

# AWS Identity and Access ManagementFragmentos de plantillas de
<a name="quickref-iam"></a>

Esta sección contiene fragmentos de la plantilla AWS Identity and Access Management.

**Topics**
+ [Declaración de recurso de un usuario de IAM](#scenario-iam-user)
+ [Declaración de recurso de una clave de acceso IAM](#scenario-iam-accesskey)
+ [Declaración de recurso de un grupo de IAM](#scenario-iam-group)
+ [Añadir usuarios a un grupo](#scenario-iam-addusertogroup)
+ [Declaración de una política de IAM](#scenario-iam-policy)
+ [Declaración de una política de bucket de Amazon S3](#scenario-bucket-policy)
+ [Declaración de una política de tema de Amazon SNS](#scenario-sns-policy)
+ [Declaración de una política de Amazon SQS](#scenario-sqs-policy)
+ [Ejemplos de plantillas de rol de IAM](#scenarios-iamroles)

**importante**  
Al crear o actualizar una pila utilizando una plantilla que contenga recursos de IAM, debe reconocer el uso de las capacidades de IAM. Para obtener más información, consulte [Reconocimiento de recursos de IAM en plantillas de CloudFormation](control-access-with-iam.md#using-iam-capabilities).

## Declaración de recurso de un usuario de IAM
<a name="scenario-iam-user"></a>

Este fragmento muestra cómo declarar un recurso de [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) para crear un usuario de IAM. El usuario está declarado con la ruta (`"/"`) y un perfil de inicio de sesión con la contraseña (`myP@ssW0rd`).

El documento de políticas denominado `giveaccesstoqueueonly` ofrece al usuario permiso para realizar todas las acciones de Amazon SQS en el recurso de cola de Amazon SQS `myqueue` y deniega el acceso a todos los demás recursos de la cola de Amazon SQS. La función `Fn::GetAtt` obtiene el atributo Arn del recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html) `myqueue`.

El documento de políticas denominado `giveaccesstotopiconly` se añade al usuario para darle permiso para realizar todas las acciones de Amazon SNS en el recurso de tema de Amazon SNS `mytopic` y para denegar el acceso a todos los demás recursos de cola de Amazon SNS. La función `Ref`[AWS::SNS::Topic obtiene el ARN del recurso ](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html) `mytopic`.

### JSON
<a name="quickref-iam-example-1.json"></a>

```
"myuser" : {
   "Type" : "AWS::IAM::User",
   "Properties" : {
      "Path" : "/",
      "LoginProfile" : {
         "Password" : "myP@ssW0rd"
      },
      "Policies" : [ {
         "PolicyName" : "giveaccesstoqueueonly",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sqs:*" ],
               "Resource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            }, {
               "Effect" : "Deny",
               "Action" : [ "sqs:*" ],
               "NotResource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            }
         ] }
      }, {
         "PolicyName" : "giveaccesstotopiconly",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sns:*" ],
               "Resource" : [ { "Ref" : "mytopic" } ]
            }, {
               "Effect" : "Deny",
               "Action" : [ "sns:*" ],
               "NotResource" : [ { "Ref" : "mytopic" } ]
            } ]
         }
      } ]
   }
}
```

### YAML
<a name="quickref-iam-example-1.yaml"></a>

```
myuser:
  Type: AWS::IAM::User
  Properties:
    Path: "/"
    LoginProfile:
      Password: myP@ssW0rd
    Policies:
    - PolicyName: giveaccesstoqueueonly
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sqs:*
          Resource:
          - !GetAtt myqueue.Arn
        - Effect: Deny
          Action:
          - sqs:*
          NotResource:
          - !GetAtt myqueue.Arn
    - PolicyName: giveaccesstotopiconly
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sns:*
          Resource:
          - !Ref mytopic
        - Effect: Deny
          Action:
          - sns:*
          NotResource:
          - !Ref mytopic
```

## Declaración de recurso de una clave de acceso IAM
<a name="scenario-iam-accesskey"></a>

### 
<a name="quickref-iam-access-key"></a>

Este fragmento muestra un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-accesskey.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-accesskey.html). El recurso `myaccesskey` crea una clave de acceso y la asigna a un usuario de IAM que se declare como un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) en la plantilla.

#### JSON
<a name="quickref-iam-example-2.json"></a>

```
"myaccesskey" : {
   "Type" : "AWS::IAM::AccessKey",
   "Properties" : {
      "UserName" : { "Ref" : "myuser" }
   }
}
```

#### YAML
<a name="quickref-iam-example-2.yaml"></a>

```
myaccesskey:
  Type: AWS::IAM::AccessKey
  Properties:
    UserName:
      !Ref myuser
```

### 
<a name="quickref-iam-access-key-2"></a>

Puede obtener la clave secreta de un recurso `AWS::IAM::AccessKey` utilizando la función `Fn::GetAtt`. Una forma de recuperar la clave secreta es ponerla en un valor `Output`. Puede obtener la clave de acceso utilizando la función `Ref`. Las siguientes declaraciones de valor `Output` obtiene la clave de acceso y la clave secreta de `myaccesskey`.

#### JSON
<a name="quickref-iam-example-3.json"></a>

```
"AccessKeyformyaccesskey" : {
   "Value" : { "Ref" : "myaccesskey" }
},
"SecretKeyformyaccesskey" : {
   "Value" : {
      "Fn::GetAtt" : [ "myaccesskey", "SecretAccessKey" ]
   }
}
```

#### YAML
<a name="quickref-iam-example-3.yaml"></a>

```
AccessKeyformyaccesskey:
  Value:
    !Ref myaccesskey
SecretKeyformyaccesskey:
  Value: !GetAtt myaccesskey.SecretAccessKey
```

### 
<a name="quickref-iam-access-key-3"></a>

También puede pasar la clave de acceso y la clave secreta de AWS a una instancia de Amazon EC2 o un grupo de escalado automático definidos en la plantilla. La siguiente declaración [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) utiliza la propiedad `UserData` para pasar la clave de acceso y su clave secreta para el recurso `myaccesskey`.

#### JSON
<a name="quickref-iam-example-4.json"></a>

```
"myinstance" : {
   "Type" : "AWS::EC2::Instance",
   "Properties" : {
      "AvailabilityZone" : "us-east-1a",
      "ImageId" : "ami-0ff8a91507f77f867",
      "UserData" : {
         "Fn::Base64" : {
            "Fn::Join" : [
               "", [
                  "ACCESS_KEY=", {
                     "Ref" : "myaccesskey"
                  },
                  "&",
                  "SECRET_KEY=",
                  {
                     "Fn::GetAtt" : [
                        "myaccesskey",
                        "SecretAccessKey"
                     ]
                  }
               ]
            ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-4.yaml"></a>

```
myinstance:
  Type: AWS::EC2::Instance
  Properties:
    AvailabilityZone: "us-east-1a"
    ImageId: ami-0ff8a91507f77f867
    UserData:
      Fn::Base64: !Sub "ACCESS_KEY=${myaccesskey}&SECRET_KEY=${myaccesskey.SecretAccessKey}"
```

## Declaración de recurso de un grupo de IAM
<a name="scenario-iam-group"></a>

Este fragmento muestra un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html). El grupo tiene una ruta (`"/myapplication/"`). El documento de políticas denominado `myapppolicy` se añade al grupo para permitir a los usuarios del grupo realizar todas las acciones de Amazon SQS en el recurso de cola de Amazon SQS y para denegar el acceso a todos los demás recursos de Amazon SQS excepto `myqueue`.

Para asignar una política a un recurso, IAM requiere el nombre de recurso de Amazon (ARN) para el recurso. En el fragmento, la función `Fn::GetAtt` obtiene el ARN de la cola del recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html).

### JSON
<a name="quickref-iam-example-5.json"></a>

```
"mygroup" : {
   "Type" : "AWS::IAM::Group",
   "Properties" : {
      "Path" : "/myapplication/",
      "Policies" : [ {
         "PolicyName" : "myapppolicy",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sqs:*" ],
               "Resource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            },
            {
               "Effect" : "Deny",
               "Action" : [ "sqs:*" ],
               "NotResource" : [ { "Fn::GetAtt" : [ "myqueue", "Arn" ] } ]
            }
         ] }
      } ]
   }
}
```

### YAML
<a name="quickref-iam-example-5.yaml"></a>

```
mygroup:
  Type: AWS::IAM::Group
  Properties:
    Path: "/myapplication/"
    Policies:
    - PolicyName: myapppolicy
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sqs:*
          Resource: !GetAtt myqueue.Arn
        - Effect: Deny
          Action:
          - sqs:*
          NotResource: !GetAtt myqueue.Arn
```

## Añadir usuarios a un grupo
<a name="scenario-iam-addusertogroup"></a>

El recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-usertogroupaddition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-usertogroupaddition.html) añade usuarios a un grupo. En el siguiente fragmento, el recurso `addUserToGroup` añade los siguientes usuarios a un grupo existente denominado `myexistinggroup2`: el usuario existente `existinguser1` y el usuario `myuser` que se declara como recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) en la plantilla.

### JSON
<a name="quickref-iam-example-6.json"></a>

```
"addUserToGroup" : {
   "Type" : "AWS::IAM::UserToGroupAddition",
   "Properties" : {
      "GroupName" : "myexistinggroup2",
      "Users" : [ "existinguser1", { "Ref" : "myuser" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-6.yaml"></a>

```
addUserToGroup:
  Type: AWS::IAM::UserToGroupAddition
  Properties:
    GroupName: myexistinggroup2
    Users:
    - existinguser1
    - !Ref myuser
```

## Declaración de una política de IAM
<a name="scenario-iam-policy"></a>

Este fragmento muestra cómo crear una política y aplicarla a varios grupos con un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-policy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-policy.html) denominado `mypolicy`. El recurso `mypolicy` contiene una propiedad `PolicyDocument` que permite acciones `GetObject`, `PutObject` y `PutObjectAcl` en los objetos del bucket de S3 representadas por el ARN `arn:aws:s3:::myAWSBucket`. El recurso `mypolicy` aplica la política a un grupo existente denominado `myexistinggroup1` y un grupo `mygroup` declarado en la plantilla como recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html). Este ejemplo muestra cómo aplicar una política a un grupo con la propiedad `Groups`; sin embargo, también puede usar la propiedad `Users` para añadir un documento de políticas a una lista de usuarios.

### JSON
<a name="quickref-iam-example-7.json"></a>

```
"mypolicy" : {
   "Type" : "AWS::IAM::Policy",
   "Properties" : {
      "PolicyName" : "mygrouppolicy",
      "PolicyDocument" : {
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Effect" : "Allow",
            "Action" : [
               "s3:GetObject" , "s3:PutObject" , "s3:PutObjectAcl" ],
            "Resource" : "arn:aws:s3:::myAWSBucket/*"
         } ]
      },
      "Groups" : [ "myexistinggroup1", { "Ref" : "mygroup" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-7.yaml"></a>

```
mypolicy:
  Type: AWS::IAM::Policy
  Properties:
    PolicyName: mygrouppolicy
    PolicyDocument:
      Version: '2012-10-17'
      Statement:
      - Effect: Allow
        Action:
        - s3:GetObject
        - s3:PutObject
        - s3:PutObjectAcl
        Resource: arn:aws:s3:::myAWSBucket/*
    Groups:
    - myexistinggroup1
    - !Ref mygroup
```

## Declaración de una política de bucket de Amazon S3
<a name="scenario-bucket-policy"></a>

Este fragmento muestra cómo crear una política y aplicarla a un bucket de Amazon S3 usando el recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html). El recurso `mybucketpolicy` declara un documento de políticas que permite al usuario `user1` de IAM realizar la acción `GetObject` en todos los objetos del bucket de S3 para que se aplique esta política. En el fragmento, la función `Fn::GetAtt` obtiene el ARN del recurso `user1`. El recurso `mybucketpolicy` aplica la política al recurso `AWS::S3::BucketPolicy` mybucket. La función `Ref` obtiene el nombre del bucket del recurso `mybucket`.

### JSON
<a name="quickref-iam-example-8.json"></a>

```
"mybucketpolicy" : {
   "Type" : "AWS::S3::BucketPolicy",
   "Properties" : {
      "PolicyDocument" : {
         "Id" : "MyPolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "ReadAccess",
            "Action" : [ "s3:GetObject" ],
            "Effect" : "Allow",
            "Resource" : { "Fn::Join" : [
                  "", [ "arn:aws:s3:::", { "Ref" : "mybucket" } , "/*" ]
               ] },
            "Principal" : {
               "AWS" : { "Fn::GetAtt" : [ "user1", "Arn" ] }
            }
         } ]
      },
      "Bucket" : { "Ref" : "mybucket" }
   }
}
```

### YAML
<a name="quickref-iam-example-8.yaml"></a>

```
mybucketpolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    PolicyDocument:
      Id: MyPolicy
      Version: '2012-10-17'
      Statement:
      - Sid: ReadAccess
        Action:
        - s3:GetObject
        Effect: Allow
        Resource: !Sub "arn:aws:s3:::${mybucket}/*"
        Principal:
          AWS: !GetAtt user1.Arn
    Bucket: !Ref mybucket
```

## Declaración de una política de tema de Amazon SNS
<a name="scenario-sns-policy"></a>

Este fragmento muestra cómo crear una política y aplicarla a un tema de Amazon SNS usando el recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topicpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topicpolicy.html). El recurso `mysnspolicy` contiene una propiedad `PolicyDocument` que permite al recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) `myuser` realizar la acción `Publish` sobre un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html) `mytopic`. En el fragmento, la función `Fn::GetAtt` obtiene el ARN del recurso `myuser` y la función `Ref` obtiene el ARN para el recurso `mytopic`.

### JSON
<a name="quickref-iam-example-9.json"></a>

```
"mysnspolicy" : {
   "Type" : "AWS::SNS::TopicPolicy",
   "Properties" : {
      "PolicyDocument" :  {
         "Id" : "MyTopicPolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "My-statement-id",
            "Effect" : "Allow",
            "Principal" : {
               "AWS" : { "Fn::GetAtt" : [ "myuser", "Arn" ] }
            },
            "Action" : "sns:Publish",
            "Resource" : "*"
         } ]
      },
      "Topics" : [ { "Ref" : "mytopic" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-9.yaml"></a>

```
mysnspolicy:
  Type: AWS::SNS::TopicPolicy
  Properties:
    PolicyDocument:
      Id: MyTopicPolicy
      Version: '2012-10-17'
      Statement:
      - Sid: My-statement-id
        Effect: Allow
        Principal:
          AWS: !GetAtt myuser.Arn
        Action: sns:Publish
        Resource: "*"
    Topics:
    - !Ref mytopic
```

## Declaración de una política de Amazon SQS
<a name="scenario-sqs-policy"></a>

Este fragmento muestra cómo crear una política y aplicarla a una cola de Amazon SQS usando el recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queuepolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queuepolicy.html). La propiedad `PolicyDocument` permite al usuario existente `myapp` (especificado por su ARN) realizar la acción `SendMessage` en una cola existente (que especifica su URL) y un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html) myqueue. La función [Ref](resources-section-structure.md#resource-properties-ref) obtiene el ARN del recurso `myqueue`.

### JSON
<a name="quickref-iam-example-10.json"></a>

```
"mysqspolicy" : {
   "Type" : "AWS::SQS::QueuePolicy",
   "Properties" : {
      "PolicyDocument" : {
         "Id" : "MyQueuePolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "Allow-User-SendMessage",
            "Effect" : "Allow",
            "Principal" : {
               "AWS" : "arn:aws:iam::123456789012:user/myapp"
            },
            "Action" : [ "sqs:SendMessage" ],
            "Resource" : "*"
         } ]
      },
      "Queues" : [
         "https://sqs.us-east-2aws-region.amazonaws.com/123456789012/myexistingqueue",
         { "Ref" : "myqueue" }
      ]
   }
}
```

### YAML
<a name="quickref-iam-example-10.yaml"></a>

```
mysqspolicy:
  Type: AWS::SQS::QueuePolicy
  Properties:
    PolicyDocument:
      Id: MyQueuePolicy
      Version: '2012-10-17'
      Statement:
      - Sid: Allow-User-SendMessage
        Effect: Allow
        Principal:
          AWS: arn:aws:iam::123456789012:user/myapp
        Action:
        - sqs:SendMessage
        Resource: "*"
    Queues:
    - https://sqs.aws-region.amazonaws.com/123456789012/myexistingqueue
    - !Ref myqueue
```

## Ejemplos de plantillas de rol de IAM
<a name="scenarios-iamroles"></a>

Esta sección proporciona ejemplos de plantillas de CloudFormation para los roles de IAM de instancias de EC2.

Para obtener más información, consulte [Roles de IAM para Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) en la *Guía del usuario de Amazon EC2*.

### Rol de IAM con EC2
<a name="scenario-iamrole-ec2"></a>

En este ejemplo, la propiedad `IamInstanceProfile` de la instancia de EC2 hace referencia al perfil de instancia. Tanto la política de instancias como la política de roles hacen referencia a [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html).

#### JSON
<a name="quickref-iam-example-11.json"></a>

```
{
   "AWSTemplateFormatVersion": "2010-09-09",
   "Resources": {
      "myEC2Instance": {
         "Type": "AWS::EC2::Instance",
         "Version": "2009-05-15",
         "Properties": {
            "ImageId": "ami-0ff8a91507f77f867",
            "InstanceType": "m1.small",
            "Monitoring": "true",
            "DisableApiTermination": "false",
            "IamInstanceProfile": {
               "Ref": "RootInstanceProfile"
            }
         }
      },
      "RootRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
            "AssumeRolePolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [ "ec2.amazonaws.com" ]
                  },
                  "Action": [ "sts:AssumeRole" ]
               } ]
            },
            "Path": "/"
         }
      },
      "RolePolicies": {
         "Type": "AWS::IAM::Policy",
         "Properties": {
            "PolicyName": "root",
            "PolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
               } ]
            },
            "Roles": [ { "Ref": "RootRole" } ]
         }
      },
      "RootInstanceProfile": {
         "Type": "AWS::IAM::InstanceProfile",
         "Properties": {
            "Path": "/",
            "Roles": [ { "Ref": "RootRole" } ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-11.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myEC2Instance:
    Type: AWS::EC2::Instance
    Version: '2009-05-15'
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: m1.small
      Monitoring: 'true'
      DisableApiTermination: 'false'
      IamInstanceProfile:
        !Ref RootInstanceProfile
  RootRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  RolePolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: root
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action: "*"
          Resource: "*"
      Roles:
      - !Ref RootRole
  RootInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref RootRole
```

### Rol de IAM con grupo de escalado automático
<a name="scenario-iamrole-asg"></a>

En este ejemplo, la propiedad `IamInstanceProfile` de la configuración de inicialización de Amazon EC2 Auto Scaling hace referencia al perfil de instancia.

#### JSON
<a name="quickref-iam-example-12.json"></a>

```
{
   "AWSTemplateFormatVersion": "2010-09-09",
   "Resources": {
      "myLCOne": {
         "Type": "AWS::AutoScaling::LaunchConfiguration",
         "Version": "2009-05-15",
         "Properties": {
            "ImageId": "ami-0ff8a91507f77f867",
            "InstanceType": "m1.small",
            "InstanceMonitoring": "true",
            "IamInstanceProfile": { "Ref": "RootInstanceProfile" }
         }
      },
      "myASGrpOne": {
         "Type": "AWS::AutoScaling::AutoScalingGroup",
         "Version": "2009-05-15",
         "Properties": {
            "AvailabilityZones": [ "us-east-1a" ],
            "LaunchConfigurationName": { "Ref": "myLCOne" },
            "MinSize": "0",
            "MaxSize": "0",
            "HealthCheckType": "EC2",
            "HealthCheckGracePeriod": "120"
         }
      },
      "RootRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
            "AssumeRolePolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [ "ec2.amazonaws.com" ]
                  },
                  "Action": [ "sts:AssumeRole" ]
               } ]
            },
            "Path": "/"
         }
      },
      "RolePolicies": {
         "Type": "AWS::IAM::Policy",
         "Properties": {
            "PolicyName": "root",
            "PolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
               } ]
            },
            "Roles": [ { "Ref": "RootRole" } ]
         }
      },
      "RootInstanceProfile": {
         "Type": "AWS::IAM::InstanceProfile",
         "Properties": {
            "Path": "/",
            "Roles": [ { "Ref": "RootRole" } ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-12.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myLCOne:
    Type: AWS::AutoScaling::LaunchConfiguration
    Version: '2009-05-15'
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: m1.small
      InstanceMonitoring: 'true'
      IamInstanceProfile:
        !Ref RootInstanceProfile
  myASGrpOne:
    Type: AWS::AutoScaling::AutoScalingGroup
    Version: '2009-05-15'
    Properties:
      AvailabilityZones:
      - "us-east-1a"
      LaunchConfigurationName:
        !Ref myLCOne
      MinSize: '0'
      MaxSize: '0'
      HealthCheckType: EC2
      HealthCheckGracePeriod: '120'
  RootRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  RolePolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: root
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action: "*"
          Resource: "*"
      Roles:
      - !Ref RootRole
  RootInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref RootRole
```

# AWS LambdaPlantilla de
<a name="quickref-lambda"></a>

La siguiente plantilla utiliza un recurso personalizado y la función de AWS Lambda (Lambda) para adjuntar un nuevo grupo de seguridad a una lista de grupos de seguridad existentes. Esta función es útil cuando se quiere crear una lista de los grupos de seguridad de forma dinámica, de forma que la lista incluye tanto los grupos de seguridad nuevos como ya existentes. Por ejemplo, puede transferir una lista de los grupos de seguridad existentes como parámetro de valor, añadir el nuevo valor a la lista y, a continuación, asociar todos los valores a una instancia de EC2. Para obtener más información acerca del tipo de recurso de una función de Lambda, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html).

En el ejemplo, cuando CloudFormation crea el recurso personalizado `AllSecurityGroups`, CloudFormation invoca la función de Lambda `AppendItemToListFunction`. CloudFormation pasa la lista de los grupos de seguridad existentes y un nuevo grupo de seguridad (`NewSecurityGroup`) a la función, que adjunta el nuevo grupo de seguridad a la lista y, a continuación, devuelve la lista modificada. CloudFormation utiliza la lista modificada para asociar todos los grupos de seguridad al recurso de `MyEC2Instance`.

## JSON
<a name="quickref-lambda-example-1.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "ExistingSecurityGroups": {
            "Type": "List<AWS::EC2::SecurityGroup::Id>"
        },
        "ExistingVPC": {
            "Type": "AWS::EC2::VPC::Id",
            "Description": "The VPC ID that includes the security groups in the ExistingSecurityGroups parameter."
        },
        "InstanceType": {
            "Type": "String",
            "Default": "t2.micro",
            "AllowedValues": [
                "t2.micro",
                "t3.micro"
            ]
        }
    },

    "Resources": {
        "SecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Allow HTTP traffic to the host",
                "VpcId": {
                    "Ref": "ExistingVPC"
                },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    }
                ],
                "SecurityGroupEgress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        },
        "AllSecurityGroups": {
            "Type": "Custom::Split",
            "Properties": {
                "ServiceToken": {
                    "Fn::GetAtt": [
                        "AppendItemToListFunction",
                        "Arn"
                    ]
                },
                "List": {
                    "Ref": "ExistingSecurityGroups"
                },
                "AppendedItem": {
                    "Ref": "SecurityGroup"
                }
            }
        },
        "AppendItemToListFunction": {
            "Type": "AWS::Lambda::Function",
            "Properties": {
                "Handler": "index.handler",
                "Role": {
                    "Fn::GetAtt": [
                        "LambdaExecutionRole",
                        "Arn"
                    ]
                },
                "Code": {
                    "ZipFile": {
                        "Fn::Join": [
                            "",
                            [
                                "var response = require('cfn-response');",
                                "exports.handler = function(event, context) {",
                                "   var responseData = {Value: event.ResourceProperties.List};",
                                "   responseData.Value.push(event.ResourceProperties.AppendedItem);",
                                "   response.send(event, context, response.SUCCESS, responseData);",
                                "};"
                            ]
                        ]
                    }
                },
                "Runtime": "nodejs20.x"
            }
        },
        "MyEC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
                "SecurityGroupIds": {
                    "Fn::GetAtt": [
                        "AllSecurityGroups",
                        "Value"
                    ]
                },
                "InstanceType": {
                    "Ref": "InstanceType"
                }
            }
        },
        "LambdaExecutionRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17", 		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "lambda.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "root",
                        "PolicyDocument": {
                            "Version": "2012-10-17", 		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:*"
                                    ],
                                    "Resource": "arn:aws:logs:*:*:*"
                                }
                            ]
                        }
                    }
                ]
            }
        }
    },
    "Outputs": {
        "AllSecurityGroups": {
            "Description": "Security Groups that are associated with the EC2 instance",
            "Value": {
                "Fn::Join": [
                    ", ",
                    {
                        "Fn::GetAtt": [
                            "AllSecurityGroups",
                            "Value"
                        ]
                    }
                ]
            }
        }
    }
}
```

## YAML
<a name="quickref-lambda-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  ExistingSecurityGroups:
    Type: List<AWS::EC2::SecurityGroup::Id>
  ExistingVPC:
    Type: AWS::EC2::VPC::Id
    Description: The VPC ID that includes the security groups in the ExistingSecurityGroups parameter.
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t3.micro
Resources:
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP traffic to the host
      VpcId: !Ref ExistingVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
  AllSecurityGroups:
    Type: Custom::Split
    Properties:
      ServiceToken: !GetAtt AppendItemToListFunction.Arn
      List: !Ref ExistingSecurityGroups
      AppendedItem: !Ref SecurityGroup
  AppendItemToListFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile: !Join
          - ''
          - - var response = require('cfn-response');
            - exports.handler = function(event, context) {
            - '   var responseData = {Value: event.ResourceProperties.List};'
            - '   responseData.Value.push(event.ResourceProperties.AppendedItem);'
            - '   response.send(event, context, response.SUCCESS, responseData);'
            - '};'
      Runtime: nodejs20.x
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      SecurityGroupIds: !GetAtt AllSecurityGroups.Value
      InstanceType: !Ref InstanceType
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17' 		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: '2012-10-17' 		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - logs:*
                Resource: arn:aws:logs:*:*:*
Outputs:
  AllSecurityGroups:
    Description: Security Groups that are associated with the EC2 instance
    Value: !Join
      - ', '
      - !GetAtt AllSecurityGroups.Value
```

# Fragmentos de plantillas de Amazon Redshift
<a name="quickref-redshift"></a>

Amazon Redshift es un servicio de almacenamiento de datos administrado de varios petabytes en la nube. Puede usar CloudFormation para aprovisionar y administrar clústeres de Amazon Redshift.

## Clúster de Amazon Redshift
<a name="quickref-redshift-samplecluster"></a>

La siguiente plantilla de ejemplo crea un clúster de Amazon Redshift de acuerdo con los valores de los parámetros que se especifican cuando se crea la pila. El grupo de parámetros del clúster que se asocia con el clúster de Amazon Redshift permite el registro de la actividad del usuario. La plantilla también lanza clústeres de Amazon Redshift en una Amazon VPC que se define en la plantilla. La VPC incluye una gateway de Internet para que pueda acceder a los clústeres de Amazon Redshift desde Internet. Sin embargo, la comunicación entre el clúster y el puerto de enlace a Internet deben estar habilitada, lo que se realiza en la tabla de ruteo.

**nota**  
La plantilla incluye la condición `IsMultiNodeCluster`, de modo que el parámetro `NumberOfNodes` se declara solo cuando el valor del parámetro `ClusterType` está establecido en `multi-node`.

El ejemplo define el parámetro `MysqlRootPassword` con la propiedad `NoEcho` establecida en `true`. Si establece el atributo `NoEcho` en `true`, CloudFormation devuelve el valor del parámetro enmascarado como asteriscos (\$1\$1\$1\$1\$1) para cualquier llamada que describa la pila o los eventos de la pila, excepto para la información almacenada en las ubicaciones especificadas a continuación.

**importante**  
El uso del atributo `NoEcho` no enmascara ninguna información almacenada en lo que se muestra a continuación:  
La sección de la plantilla `Metadata`. CloudFormation no transforma, modifica ni redacta ninguna información que incluya en la sección `Metadata`. Para obtener más información, consulte [Metadata](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
La sección de la plantilla `Outputs`. Para obtener más información, consulte [Salidas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
El atributo `Metadata` de una definición de recurso. Para obtener más información, consulte [`Metadata` atributo](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Recomendamos encarecidamente que no utilice estos mecanismos para incluir información confidencial, como contraseñas o secretos.

**importante**  
En lugar de integrar información confidencial directamente en las plantillas de CloudFormation, se recomienda utilizar parámetros dinámicos en la plantilla de la pila para hacer referencia a la información confidencial almacenada y administrada fuera de CloudFormation, como en AWS Systems Manager Parameter Store o AWS Secrets Manager.  
Para obtener más información, consulte la práctica recomendada [No integre credenciales en sus plantillas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).

### JSON
<a name="quickref-redshift-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters" : {
    "DatabaseName" : {
      "Description" : "The name of the first database to be created when the cluster is created",
      "Type" : "String",
      "Default" : "dev",
      "AllowedPattern" : "([a-z]|[0-9])+"
    },
    "ClusterType" : {
      "Description" : "The type of cluster",
      "Type" : "String",
      "Default" : "single-node",
      "AllowedValues" : [ "single-node", "multi-node" ]
    },
    "NumberOfNodes" : {
      "Description" : "The number of compute nodes in the cluster. For multi-node clusters, the NumberOfNodes parameter must be greater than 1",
      "Type" : "Number",
      "Default" : "1"
    },
    "NodeType" : {
      "Description" : "The type of node to be provisioned",
      "Type" : "String",
      "Default" : "ds2.xlarge",
      "AllowedValues" : [ "ds2.xlarge", "ds2.8xlarge", "dc1.large", "dc1.8xlarge" ]
    }, 
    "MasterUsername" : {
      "Description" : "The user name that is associated with the master user account for the cluster that is being created",
      "Type" : "String",
      "Default" : "defaultuser",
      "AllowedPattern" : "([a-z])([a-z]|[0-9])*"
    },
    "MasterUserPassword" :  {
      "Description" : "The password that is associated with the master user account for the cluster that is being created.",
      "Type" : "String",
      "NoEcho" : "true"
    },
    "InboundTraffic" : {
      "Description" : "Allow inbound traffic to the cluster from this CIDR range.",
      "Type" : "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default" : "0.0.0.0/0",
      "AllowedPattern" : "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription" : "must be a valid CIDR range of the form x.x.x.x/x."
    },
    "PortNumber" : {
      "Description" : "The port number on which the cluster accepts incoming connections.",
      "Type" : "Number",
      "Default" : "5439"
    }
  },
  "Conditions" : {
    "IsMultiNodeCluster" : {
      "Fn::Equals" : [{ "Ref" : "ClusterType" }, "multi-node" ]        
    }
  },
  "Resources" : {
    "RedshiftCluster" : {
      "Type" : "AWS::Redshift::Cluster",
      "DependsOn" : "AttachGateway",
      "Properties" : {
        "ClusterType" : { "Ref" : "ClusterType" },
        "NumberOfNodes" : { "Fn::If" : [ "IsMultiNodeCluster",  { "Ref" : "NumberOfNodes" }, { "Ref" : "AWS::NoValue" }]},
        "NodeType" : { "Ref" : "NodeType" },
        "DBName" : { "Ref" : "DatabaseName" },
        "MasterUsername" : { "Ref" : "MasterUsername" },
        "MasterUserPassword" : { "Ref" : "MasterUserPassword" },               
        "ClusterParameterGroupName" : { "Ref" : "RedshiftClusterParameterGroup" },
        "VpcSecurityGroupIds" : [ { "Ref" : "SecurityGroup" } ],
        "ClusterSubnetGroupName" : { "Ref" : "RedshiftClusterSubnetGroup" },
        "PubliclyAccessible" : "true",
        "Port" : { "Ref" : "PortNumber" }
      }
    },
    "RedshiftClusterParameterGroup" : {
      "Type" : "AWS::Redshift::ClusterParameterGroup",
      "Properties" : {
        "Description" : "Cluster parameter group",
        "ParameterGroupFamily" : "redshift-1.0",
        "Parameters" : [{
          "ParameterName" : "enable_user_activity_logging",
          "ParameterValue" : "true"
        }]
      }
    },
    "RedshiftClusterSubnetGroup" : {
      "Type" : "AWS::Redshift::ClusterSubnetGroup",
      "Properties" : {
        "Description" : "Cluster subnet group",
        "SubnetIds" : [ { "Ref" : "PublicSubnet" } ]
      }
    },
    "VPC" : {
      "Type" : "AWS::EC2::VPC",
      "Properties" : {
        "CidrBlock" : "10.0.0.0/16"
      }
    },
    "PublicSubnet" : {
      "Type" : "AWS::EC2::Subnet",
      "Properties" : {
        "CidrBlock" : "10.0.0.0/24",
        "VpcId" : { "Ref" : "VPC" }
      }
    },
    "SecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Security group",
        "SecurityGroupIngress" : [ {
          "CidrIp" : { "Ref": "InboundTraffic" },
          "FromPort" : { "Ref" : "PortNumber" },
          "ToPort" : { "Ref" : "PortNumber" },
          "IpProtocol" : "tcp"
        } ],
        "VpcId" : { "Ref" : "VPC" }
      }
    },
    "myInternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway"
    },
    "AttachGateway" : {
      "Type" : "AWS::EC2::VPCGatewayAttachment",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "InternetGatewayId" : { "Ref" : "myInternetGateway" }
      }
    },
    "PublicRouteTable" : {
      "Type" : "AWS::EC2::RouteTable",
      "Properties" : {
        "VpcId" : {
          "Ref" : "VPC"
        }
      }
    },
    "PublicRoute" : {
      "Type" : "AWS::EC2::Route",
      "DependsOn" : "AttachGateway",
      "Properties"  : {
        "RouteTableId" : {
          "Ref" : "PublicRouteTable"
        },
        "DestinationCidrBlock" : "0.0.0.0/0",
        "GatewayId" : {
          "Ref" : "myInternetGateway"
        }
      }
    },
    "PublicSubnetRouteTableAssociation" : {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "SubnetId" : {
          "Ref" : "PublicSubnet"
        },
        "RouteTableId" : {
          "Ref" : "PublicRouteTable"
        }
      }
    }
  },
  "Outputs" : {
    "ClusterEndpoint" : {
      "Description" : "Cluster endpoint",
      "Value" : { "Fn::Join" : [ ":", [ { "Fn::GetAtt" : [ "RedshiftCluster", "Endpoint.Address" ] }, { "Fn::GetAtt" : [ "RedshiftCluster", "Endpoint.Port" ] } ] ] }
    },
    "ClusterName" : {
      "Description" : "Name of cluster",
      "Value" : { "Ref" : "RedshiftCluster" }
    },
    "ParameterGroupName" : {
      "Description" : "Name of parameter group",
      "Value" : { "Ref" : "RedshiftClusterParameterGroup" }
    },
    "RedshiftClusterSubnetGroupName" : {
      "Description" : "Name of cluster subnet group",
      "Value" : { "Ref" : "RedshiftClusterSubnetGroup" }
    },
    "RedshiftClusterSecurityGroupName" : {
      "Description" : "Name of cluster security group",
      "Value" : { "Ref" : "SecurityGroup" }
    }
  }
}
```

### YAML
<a name="quickref-redshift-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  DatabaseName:
    Description: The name of the first database to be created when the cluster is
      created
    Type: String
    Default: dev
    AllowedPattern: "([a-z]|[0-9])+"
  ClusterType:
    Description: The type of cluster
    Type: String
    Default: single-node
    AllowedValues:
    - single-node
    - multi-node
  NumberOfNodes:
    Description: The number of compute nodes in the cluster. For multi-node clusters,
      the NumberOfNodes parameter must be greater than 1
    Type: Number
    Default: '1'
  NodeType:
    Description: The type of node to be provisioned
    Type: String
    Default: ds2.xlarge
    AllowedValues:
    - ds2.xlarge
    - ds2.8xlarge
    - dc1.large
    - dc1.8xlarge
  MasterUsername:
    Description: The user name that is associated with the master user account for
      the cluster that is being created
    Type: String
    Default: defaultuser
    AllowedPattern: "([a-z])([a-z]|[0-9])*"
  MasterUserPassword:
    Description: The password that is associated with the master user account for
      the cluster that is being created.
    Type: String
    NoEcho: 'true'
  InboundTraffic:
    Description: Allow inbound traffic to the cluster from this CIDR range.
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: must be a valid CIDR range of the form x.x.x.x/x.
  PortNumber:
    Description: The port number on which the cluster accepts incoming connections.
    Type: Number
    Default: '5439'
Conditions:
  IsMultiNodeCluster:
    Fn::Equals:
    - Ref: ClusterType
    - multi-node
Resources:
  RedshiftCluster:
    Type: AWS::Redshift::Cluster
    DependsOn: AttachGateway
    Properties:
      ClusterType:
        Ref: ClusterType
      NumberOfNodes:
        Fn::If:
        - IsMultiNodeCluster
        - Ref: NumberOfNodes
        - Ref: AWS::NoValue
      NodeType:
        Ref: NodeType
      DBName:
        Ref: DatabaseName
      MasterUsername:
        Ref: MasterUsername
      MasterUserPassword:
        Ref: MasterUserPassword
      ClusterParameterGroupName:
        Ref: RedshiftClusterParameterGroup
      VpcSecurityGroupIds:
      - Ref: SecurityGroup
      ClusterSubnetGroupName:
        Ref: RedshiftClusterSubnetGroup
      PubliclyAccessible: 'true'
      Port:
        Ref: PortNumber
  RedshiftClusterParameterGroup:
    Type: AWS::Redshift::ClusterParameterGroup
    Properties:
      Description: Cluster parameter group
      ParameterGroupFamily: redshift-1.0
      Parameters:
      - ParameterName: enable_user_activity_logging
        ParameterValue: 'true'
  RedshiftClusterSubnetGroup:
    Type: AWS::Redshift::ClusterSubnetGroup
    Properties:
      Description: Cluster subnet group
      SubnetIds:
      - Ref: PublicSubnet
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId:
        Ref: VPC
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group
      SecurityGroupIngress:
      - CidrIp:
          Ref: InboundTraffic
        FromPort:
          Ref: PortNumber
        ToPort:
          Ref: PortNumber
        IpProtocol: tcp
      VpcId:
        Ref: VPC
  myInternetGateway:
    Type: AWS::EC2::InternetGateway
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: myInternetGateway
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId:
        Ref: PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId:
        Ref: myInternetGateway
  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: PublicSubnet
      RouteTableId:
        Ref: PublicRouteTable
Outputs:
  ClusterEndpoint:
    Description: Cluster endpoint
    Value: !Sub "${RedshiftCluster.Endpoint.Address}:${RedshiftCluster.Endpoint.Port}"
  ClusterName:
    Description: Name of cluster
    Value:
      Ref: RedshiftCluster
  ParameterGroupName:
    Description: Name of parameter group
    Value:
      Ref: RedshiftClusterParameterGroup
  RedshiftClusterSubnetGroupName:
    Description: Name of cluster subnet group
    Value:
      Ref: RedshiftClusterSubnetGroup
  RedshiftClusterSecurityGroupName:
    Description: Name of cluster security group
    Value:
      Ref: SecurityGroup
```

## Véase también
<a name="w2aac11c41c72b7"></a>

[AWS::Redshift::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html)

# Fragmentos de las plantillas de Amazon RDS
<a name="quickref-rds"></a>

**Topics**
+ [Recurso de instancia de la base de datos de Amazon RDS](#scenario-rds-instance)
+ [Recurso de instancia de base de datos de Oracle de Amazon RDS](#scenario-rds-oracleinstance)
+ [Recurso de DBSecurityGroup de Amazon RDS para rango de CIDR](#scenario-rds-security-group-cidr)
+ [DBSecurityGroup de Amazon RDS con un grupo de seguridad de Amazon EC2](#scenario-rds-security-group-ec2)
+ [Múltiples grupos de seguridad de VPC](#scenario-multiple-vpc-security-groups)
+ [Instancia de base de datos de Amazon RDS en un grupo de seguridad de VPC](#w2aac11c41c76c15)

## Recurso de instancia de la base de datos de Amazon RDS
<a name="scenario-rds-instance"></a>

En este ejemplo se muestra un recurso de instancia de base de datos de Amazon RDS con contraseña de usuario maestro administrada. Para obtener más información, consulte [Administración de contraseñas con AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) en la *Guía del usuario de Amazon RDS* y [Administración de contraseñas con AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html) en la *Guía del usuario de Aurora*. Dado que no se especifica la propiedad `EngineVersion` opcional, se usa la versión del motor predeterminado para esta instancia de base de datos. Para más detalles acerca de la versión del motor predeterminado y otros ajustes predeterminados, consulte [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html). La propiedad `DBSecurityGroups` autoriza la entrada de la red a los recursos `AWS::RDS::DBSecurityGroup` denominados `MyDbSecurityByEC2SecurityGroup` y myDBSecurityByCIDripGroup. Para obtener más información, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html). El recurso de la instancia de base de datos también tiene un atributo `DeletionPolicy` y establecido como `Snapshot`. Con `Snapshot` establecido en `DeletionPolicy`, CloudFormation toma una instantánea de esta instancia de base de datos antes de eliminarla durante la eliminación de la pila.

### JSON
<a name="quickref-rds-example-1.json"></a>

```
 1. "MyDB" : {
 2.  "Type" : "AWS::RDS::DBInstance",
 3.  "Properties" : {
 4.      "DBSecurityGroups" : [
 5.         {"Ref" : "MyDbSecurityByEC2SecurityGroup"}, {"Ref" : "MyDbSecurityByCIDRIPGroup"} ],
 6.      "AllocatedStorage" : "5",
 7.      "DBInstanceClass" : "db.t2.small",
 8.      "Engine" : "MySQL",
 9.      "MasterUsername" : "MyName",
10.      "ManageMasterUserPassword" : true,
11.      "MasterUserSecret" : {
12.         "KmsKeyId" : {"Ref" : "KMSKey"}
13.      }
14.  },
15.  "DeletionPolicy" : "Snapshot"
16. }
```

### YAML
<a name="quickref-rds-example-1.yaml"></a>

```
 1. MyDB:
 2.   Type: AWS::RDS::DBInstance
 3.   Properties:
 4.     DBSecurityGroups:
 5.     - Ref: MyDbSecurityByEC2SecurityGroup
 6.     - Ref: MyDbSecurityByCIDRIPGroup
 7.     AllocatedStorage: '5'
 8.     DBInstanceClass: db.t2.small
 9.     Engine: MySQL
10.     MasterUsername: MyName
11.     ManageMasterUserPassword: true
12.     MasterUserSecret:
13.       KmsKeyId: !Ref KMSKey
14.   DeletionPolicy: Snapshot
```

## Recurso de instancia de base de datos de Oracle de Amazon RDS
<a name="scenario-rds-oracleinstance"></a>

En este ejemplo se crea un recurso de instancia de base de datos de Oracle Database con contraseña de usuario maestro administrada. Para obtener más información, consulte [Administración de contraseñas con AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) en la *Guía del usuario de Amazon RDS*. En el ejemplo se especifica el `Engine` como `oracle-ee` con un modelo de licencia de tipo traiga su propia licencia. Para más detalles acerca de las instancias de base de datos de Oracle Database, consulte [CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html). La propiedad DBSecurityGroups autoriza el acceso a la red de los recursos de `AWS::RDS::DBSecurityGroup` denominados MyDbSecurityByEC2SecurityGroup y MyDbSecurityByCIDRIPGroup. Para obtener más información, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html). El recurso de la instancia de base de datos también tiene un atributo `DeletionPolicy` y establecido como `Snapshot`. Con `Snapshot` establecido en `DeletionPolicy`, CloudFormation toma una instantánea de esta instancia de base de datos antes de eliminarla durante la eliminación de la pila.

### JSON
<a name="quickref-rds-example-2.json"></a>

```
 1. "MyDB" : {
 2.  "Type" : "AWS::RDS::DBInstance",
 3.  "Properties" : {
 4.      "DBSecurityGroups" : [
 5.         {"Ref" : "MyDbSecurityByEC2SecurityGroup"}, {"Ref" : "MyDbSecurityByCIDRIPGroup"} ],
 6.      "AllocatedStorage" : "5",
 7.      "DBInstanceClass" : "db.t2.small",
 8.      "Engine" : "oracle-ee",
 9.      "LicenseModel" : "bring-your-own-license",
10.      "MasterUsername" : "master",
11.      "ManageMasterUserPassword" : true,
12.      "MasterUserSecret" : {
13.         "KmsKeyId" : {"Ref" : "KMSKey"}
14.      }
15.  },
16.  "DeletionPolicy" : "Snapshot"
17. }
```

### YAML
<a name="quickref-rds-example-2.yaml"></a>

```
 1. MyDB:
 2.   Type: AWS::RDS::DBInstance
 3.   Properties:
 4.     DBSecurityGroups:
 5.     - Ref: MyDbSecurityByEC2SecurityGroup
 6.     - Ref: MyDbSecurityByCIDRIPGroup
 7.     AllocatedStorage: '5'
 8.     DBInstanceClass: db.t2.small
 9.     Engine: oracle-ee
10.     LicenseModel: bring-your-own-license
11.     MasterUsername: master
12.     ManageMasterUserPassword: true
13.     MasterUserSecret:
14.       KmsKeyId: !Ref KMSKey
15.   DeletionPolicy: Snapshot
```

## Recurso de DBSecurityGroup de Amazon RDS para rango de CIDR
<a name="scenario-rds-security-group-cidr"></a>

En este ejemplo se muestra un recurso `DBSecurityGroup` de Amazon RDS con autorización de entrada para el rango de CIDR especificado en el formato `ddd.ddd.ddd.ddd/dd`. Para obtener más información, consulte [AWS::RDS::DBSecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) e [Ingress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-rds-dbsecuritygroup-ingress.html).

### JSON
<a name="quickref-rds-example-3.json"></a>

```
1. "MyDbSecurityByCIDRIPGroup" : {
2.  "Type" : "AWS::RDS::DBSecurityGroup",
3.  "Properties" : {
4.      "GroupDescription" : "Ingress for CIDRIP",
5.      "DBSecurityGroupIngress" : {
6.          "CIDRIP" : "192.168.0.0/32"
7.      }
8.  }
9. }
```

### YAML
<a name="quickref-rds-example-3.yaml"></a>

```
1. MyDbSecurityByCIDRIPGroup:
2.   Type: AWS::RDS::DBSecurityGroup
3.   Properties:
4.     GroupDescription: Ingress for CIDRIP
5.     DBSecurityGroupIngress:
6.       CIDRIP: "192.168.0.0/32"
```

## DBSecurityGroup de Amazon RDS con un grupo de seguridad de Amazon EC2
<a name="scenario-rds-security-group-ec2"></a>

En este ejemplo se muestra un recurso [AWS::RDS::DBSecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) con autorización de entrada de un grupo de seguridad de Amazon EC2 al que hace referencia `MyEc2SecurityGroup`.

Para ello, debe definir un grupo de seguridad de EC2 y, a continuación, usar la función `Ref` intrínseca para consultar el grupo de seguridad de EC2 en su `DBSecurityGroup`.

### JSON
<a name="quickref-rds-example-4.json"></a>

```
"DBInstance" : {
   "Type": "AWS::RDS::DBInstance",
   "Properties": {
      "DBName"            : { "Ref" : "DBName" },
      "Engine"            : "MySQL",
      "MasterUsername"    : { "Ref" : "DBUsername" },
      "DBInstanceClass"   : { "Ref" : "DBClass" },
      "DBSecurityGroups"  : [ { "Ref" : "DBSecurityGroup" } ],
      "AllocatedStorage"  : { "Ref" : "DBAllocatedStorage" },
      "MasterUserPassword": { "Ref" : "DBPassword" }
   }
},

"DBSecurityGroup": {
   "Type": "AWS::RDS::DBSecurityGroup",
   "Properties": {
      "DBSecurityGroupIngress": {
         "EC2SecurityGroupName": {
            "Fn::GetAtt": ["WebServerSecurityGroup", "GroupName"]
         }
      },
      "GroupDescription" : "Frontend Access"
   }
},

"WebServerSecurityGroup" : {
   "Type" : "AWS::EC2::SecurityGroup",
   "Properties" : {
      "GroupDescription" : "Enable HTTP access via port 80 and SSH access",
      "SecurityGroupIngress" : [
         {"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0"},
         {"IpProtocol" : "tcp", "FromPort" : 22, "ToPort" : 22, "CidrIp" : "0.0.0.0/0"}
      ]
   }
}
```

### YAML
<a name="quickref-rds-example-4.yaml"></a>

Este ejemplo está sacado del siguiente ejemplo completo: [Drupal\$1Single\$1Instance\$1With\$1RDS.template](https://s3.amazonaws.com/cloudformation-templates-us-east-1/Drupal_Single_Instance_With_RDS.template).

```
DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBName:
      Ref: DBName
    Engine: MySQL
    MasterUsername:
      Ref: DBUsername
    DBInstanceClass:
      Ref: DBClass
    DBSecurityGroups:
    - Ref: DBSecurityGroup
    AllocatedStorage:
      Ref: DBAllocatedStorage
    MasterUserPassword:
      Ref: DBPassword
DBSecurityGroup:
  Type: AWS::RDS::DBSecurityGroup
  Properties:
    DBSecurityGroupIngress:
      EC2SecurityGroupName:
        Ref: WebServerSecurityGroup
    GroupDescription: Frontend Access
WebServerSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Enable HTTP access via port 80 and SSH access
    SecurityGroupIngress:
    - IpProtocol: tcp
      FromPort: 80
      ToPort: 80
      CidrIp: 0.0.0.0/0
    - IpProtocol: tcp
      FromPort: 22
      ToPort: 22
      CidrIp: 0.0.0.0/0
```

## Múltiples grupos de seguridad de VPC
<a name="scenario-multiple-vpc-security-groups"></a>

En este ejemplo se muestra un recurso [AWS::RDS::DBSecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) con autorización de entrada de múltiples grupos de seguridad VPC de Amazon EC2 en [AWS::RDS::DBSecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroupingress.html).

### JSON
<a name="quickref-rds-example-5.json"></a>

```
{
   "Resources" : {
      "DBinstance" : {
         "Type" : "AWS::RDS::DBInstance",
         "Properties" : {
            "AllocatedStorage" : "5",
            "DBInstanceClass" : "db.t2.small",
           "DBName" : {"Ref": "MyDBName" },
            "DBSecurityGroups" : [ { "Ref" : "DbSecurityByEC2SecurityGroup" } ],
            "DBSubnetGroupName" : { "Ref" : "MyDBSubnetGroup" },
            "Engine" : "MySQL",
           "MasterUserPassword": { "Ref" : "MyDBPassword" },
           "MasterUsername"    : { "Ref" : "MyDBUsername" }
        },
         "DeletionPolicy" : "Snapshot"
      },
      "DbSecurityByEC2SecurityGroup" : {
         "Type" : "AWS::RDS::DBSecurityGroup",
         "Properties" : {
            "GroupDescription" : "Ingress for Amazon EC2 security group",
           "EC2VpcId" : { "Ref" : "MyVPC" },
            "DBSecurityGroupIngress" : [ {
               "EC2SecurityGroupId" : "sg-b0ff1111",
               "EC2SecurityGroupOwnerId" : "111122223333"
            }, {
               "EC2SecurityGroupId" : "sg-ffd722222",
               "EC2SecurityGroupOwnerId" : "111122223333"
            } ]
         }
      }
   }
}
```

### YAML
<a name="quickref-rds-example-5.yaml"></a>

```
Resources:
  DBinstance:
    Type: AWS::RDS::DBInstance
    Properties:
      AllocatedStorage: '5'
      DBInstanceClass: db.t2.small
      DBName:
        Ref: MyDBName
      DBSecurityGroups:
      - Ref: DbSecurityByEC2SecurityGroup
      DBSubnetGroupName:
        Ref: MyDBSubnetGroup
      Engine: MySQL
      MasterUserPassword:
        Ref: MyDBPassword
      MasterUsername:
        Ref: MyDBUsername
    DeletionPolicy: Snapshot
  DbSecurityByEC2SecurityGroup:
    Type: AWS::RDS::DBSecurityGroup
    Properties:
      GroupDescription: Ingress for Amazon EC2 security group
      EC2VpcId:
        Ref: MyVPC
      DBSecurityGroupIngress:
      - EC2SecurityGroupId: sg-b0ff1111
        EC2SecurityGroupOwnerId: '111122223333'
      - EC2SecurityGroupId: sg-ffd722222
        EC2SecurityGroupOwnerId: '111122223333'
```

## Instancia de base de datos de Amazon RDS en un grupo de seguridad de VPC
<a name="w2aac11c41c76c15"></a>

En este ejemplo se muestra una instancia de base de datos de Amazon RDS asociada a un grupo de seguridad de VPC de Amazon EC2.

### JSON
<a name="quickref-rds-example-6.json"></a>

```
{
  "DBEC2SecurityGroup": {
    "Type": "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription": "Open database for access",
      "SecurityGroupIngress" : [{
        "IpProtocol" : "tcp",
        "FromPort" : 3306,
        "ToPort" : 3306,
        "SourceSecurityGroupName" : { "Ref" : "WebServerSecurityGroup" }
      }]
    }
  },
  "DBInstance" : {
    "Type": "AWS::RDS::DBInstance",
    "Properties": {
      "DBName"            : { "Ref" : "DBName" },
      "Engine"            : "MySQL",
      "MultiAZ"           : { "Ref": "MultiAZDatabase" },
      "MasterUsername"    : { "Ref" : "DBUser" },
      "DBInstanceClass"   : { "Ref" : "DBClass" },
      "AllocatedStorage"  : { "Ref" : "DBAllocatedStorage" },
      "MasterUserPassword": { "Ref" : "DBPassword" },
      "VPCSecurityGroups" : [ { "Fn::GetAtt": [ "DBEC2SecurityGroup", "GroupId" ] } ]
    }
  }
}
```

### YAML
<a name="quickref-rds-example-6.yaml"></a>

```
DBEC2SecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Open database for access
    SecurityGroupIngress:
    - IpProtocol: tcp
      FromPort: 3306
      ToPort: 3306
      SourceSecurityGroupName:
        Ref: WebServerSecurityGroup
DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBName:
      Ref: DBName
    Engine: MySQL
    MultiAZ:
      Ref: MultiAZDatabase
    MasterUsername:
      Ref: DBUser
    DBInstanceClass:
      Ref: DBClass
    AllocatedStorage:
      Ref: DBAllocatedStorage
    MasterUserPassword:
      Ref: DBPassword
    VPCSecurityGroups:
    - !GetAtt DBEC2SecurityGroup.GroupId
```

# Fragmentos de plantilla de Route 53
<a name="quickref-route53"></a>

**Topics**
+ [Conjunto de registros de recursos de Amazon Route 53 con el ID o nombre de zona hospedada](#scenario-route53-recordset-by-host)
+ [Uso de RecordSetGroup para la configuración de conjuntos de registros de recursos ponderados](#scenario-recordsetgroup-weighted)
+ [Uso de RecordSetGroup para configurar un conjunto de registros de recursos de alias](#scenario-recordsetgroup-zoneapex)
+ [Conjunto de registros de recursos de alias para una distribución de CloudFront](#scenario-user-friendly-url-for-cloudfront-distribution)

## Conjunto de registros de recursos de Amazon Route 53 con el ID o nombre de zona hospedada
<a name="scenario-route53-recordset-by-host"></a>

Al crear un conjunto de registros de recursos de Amazon Route 53, debe especificar la zona alojada donde desee agregarlo. CloudFormation ofrece dos formas de especificar una zona alojada:
+ Puede especificar explícitamente la zona hospedada mediante la propiedad `HostedZoneId`.
+ Puede solicitar que CloudFormation busque la zona alojada con la propiedad `HostedZoneName`. Si utiliza la propiedad `HostedZoneName` y hay varias zonas alojadas con el mismo nombre, CloudFormation no crea la pila.

### Adición de RecordSet mediante HostedZoneId
<a name="scenario-recordset-using-id"></a>

En este ejemplo se agrega un conjunto de registros de recursos de Amazon Route 53 que contiene un registro `SPF` para el nombre de dominio `mysite.example.com` que utiliza la propiedad `HostedZoneId` para especificar la zona alojada.

#### JSON
<a name="quickref-route53-example-1.json"></a>

```
 1. "myDNSRecord" : {
 2.   "Type" : "AWS::Route53::RecordSet",
 3.   "Properties" : 
 4.   {
 5.     "HostedZoneId" : "Z3DG6IL3SJCGPX",
 6.     "Name" : "mysite.example.com.",
 7.     "Type" : "SPF",
 8.     "TTL" : "900",
 9.     "ResourceRecords" : [ "\"v=spf1 ip4:192.168.0.1/16 -all\"" ]
10.   }
11. }
```

#### YAML
<a name="quickref-route53-example-1.yaml"></a>

```
1. myDNSRecord:
2.   Type: AWS::Route53::RecordSet
3.   Properties:
4.     HostedZoneId: Z3DG6IL3SJCGPX
5.     Name: mysite.example.com.
6.     Type: SPF
7.     TTL: '900'
8.     ResourceRecords:
9.     - '"v=spf1 ip4:192.168.0.1/16 -all"'
```

### Adición de RecordSet mediante HostedZoneName
<a name="scenario-recordset-using-name"></a>

En este ejemplo se agrega un conjunto de registros de recursos de Amazon Route 53 para el nombre de dominio “mysite.example.com” mediante la propiedad `HostedZoneName` para especificar la zona hospedada.

#### JSON
<a name="quickref-route53-example-2.json"></a>

```
 1. "myDNSRecord2" : {
 2.             "Type" : "AWS::Route53::RecordSet",
 3.             "Properties" : {
 4.                 "HostedZoneName" : "example.com.",
 5.                 "Name" : "mysite.example.com.",
 6.                 "Type" : "A",
 7.                 "TTL" : "900",
 8.                 "ResourceRecords" : [
 9.                     "192.168.0.1",
10.                     "192.168.0.2"
11.                 ]
12.             }
13.         }
```

#### YAML
<a name="quickref-route53-example-2.yaml"></a>

```
 1. myDNSRecord2:
 2.   Type: AWS::Route53::RecordSet
 3.   Properties:
 4.     HostedZoneName: example.com.
 5.     Name: mysite.example.com.
 6.     Type: A
 7.     TTL: '900'
 8.     ResourceRecords:
 9.     - 192.168.0.1
10.     - 192.168.0.2
```

## Uso de RecordSetGroup para la configuración de conjuntos de registros de recursos ponderados
<a name="scenario-recordsetgroup-weighted"></a>

En este ejemplo, se utiliza el recurso [AWS::Route53::RecordSetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) para configurar dos registros CNAME para “example.com”. zona alojada. La propiedad `RecordSets` contiene los conjuntos de registros de CNAME para el nombre de DNS “mysite.example.com”. Cada conjunto de registros contiene un identificador (`SetIdentifier`) y un peso (`Weight`). La proporción de tráfico de Internet que se enruta a los recursos se basa en los siguientes cálculos:
+ `Frontend One`: `140/(140+60)` = `140/200` = 70 %
+ `Frontend Two`: `60/(140+60)` = `60/200` = 30 %

Para obtener más información sobre los conjuntos de registros de recursos ponderados, consulte [Ruteo ponderado](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html) en la *Guía para desarrolladores de Amazon Route 53*.

### JSON
<a name="quickref-route53-example-3.json"></a>

```
 1.         "myDNSOne" : {
 2.             "Type" : "AWS::Route53::RecordSetGroup",
 3.             "Properties" : {
 4.                 "HostedZoneName" : "example.com.",
 5.                 "Comment" : "Weighted RR for my frontends.",
 6.                 "RecordSets" : [
 7.                   {
 8.                     "Name" : "mysite.example.com.",
 9.                     "Type" : "CNAME",
10.                     "TTL" : "900",
11.                     "SetIdentifier" : "Frontend One",
12.                     "Weight" : "140",
13.                     "ResourceRecords" : ["example-ec2.amazonaws.com"]
14.                   },
15.                   {
16.                     "Name" : "mysite.example.com.",
17.                     "Type" : "CNAME",
18.                     "TTL" : "900",
19.                     "SetIdentifier" : "Frontend Two",
20.                     "Weight" : "60",
21.                     "ResourceRecords" : ["example-ec2-larger.amazonaws.com"]
22.                   }
23.                   ]
24.             }
25.         }
```

### YAML
<a name="quickref-route53-example-3.yaml"></a>

```
 1. myDNSOne:
 2.   Type: AWS::Route53::RecordSetGroup
 3.   Properties:
 4.     HostedZoneName: example.com.
 5.     Comment: Weighted RR for my frontends.
 6.     RecordSets:
 7.     - Name: mysite.example.com.
 8.       Type: CNAME
 9.       TTL: '900'
10.       SetIdentifier: Frontend One
11.       Weight: '140'
12.       ResourceRecords:
13.       - example-ec2.amazonaws.com
14.     - Name: mysite.example.com.
15.       Type: CNAME
16.       TTL: '900'
17.       SetIdentifier: Frontend Two
18.       Weight: '60'
19.       ResourceRecords:
20.       - example-ec2-larger.amazonaws.com
```

## Uso de RecordSetGroup para configurar un conjunto de registros de recursos de alias
<a name="scenario-recordsetgroup-zoneapex"></a>

En los ejemplos siguientes se utiliza [AWS::Route53::RecordSetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) para configurar un conjunto de registros de recursos de alias denominado `example.com` que enruta el tráfico a un balanceador de carga de ELB, versión 1 (Classic) y a un balanceador de carga de la versión 2 (Application o Network). La propiedad [AliasTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-route53-recordset-aliastarget.html) especifica el ID de zona alojada y el nombre de DNS para `myELB` `LoadBalancer` mediante la función intrínseca `GetAtt`. `GetAtt` recupera diferentes propiedades del recurso `myELB`, en función de si se dirige el tráfico a un equilibrador de carga versión 1 o versión 2:
+ Balanceador de carga versión 1: `CanonicalHostedZoneNameID` y `DNSName`
+ Balanceador de carga de la versión 2: `CanonicalHostedZoneID` y `DNSName`

Para obtener más información sobre los conjuntos de registros de recursos de alias, consulte [Elección entre registros de alias y sin alias](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html) en la *Guía para desarrolladores de Route 53*.

### JSON para balanceador de carga, versión 1
<a name="quickref-route53-example-4.json"></a>

```
 1.       "myELB" : {
 2.         "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
 3.         "Properties" : {
 4.             "AvailabilityZones" : [ "us-east-1a" ],
 5.             "Listeners" : [ {
 6.                 "LoadBalancerPort" : "80",
 7.                 "InstancePort" : "80",
 8.                 "Protocol" : "HTTP"
 9.             } ]
10.         }
11.       },
12.       "myDNS" : {
13.         "Type" : "AWS::Route53::RecordSetGroup",
14.         "Properties" : {
15.           "HostedZoneName" : "example.com.",
16.           "Comment" : "Zone apex alias targeted to myELB LoadBalancer.",
17.           "RecordSets" : [
18.             {
19.               "Name" : "example.com.",
20.               "Type" : "A",
21.               "AliasTarget" : {
22.                   "HostedZoneId" : { "Fn::GetAtt" : ["myELB", "CanonicalHostedZoneNameID"] },
23.                   "DNSName" : { "Fn::GetAtt" : ["myELB","DNSName"] }
24.               }
25.             }
26.           ]
27.         }
28.     }
```

### YAML para balanceador de carga, versión 1
<a name="quickref-route53-example-4.yaml"></a>

```
 1. myELB:
 2.   Type: AWS::ElasticLoadBalancing::LoadBalancer
 3.   Properties:
 4.     AvailabilityZones:
 5.     - "us-east-1a"
 6.     Listeners:
 7.     - LoadBalancerPort: '80'
 8.       InstancePort: '80'
 9.       Protocol: HTTP
10. myDNS:
11.   Type: AWS::Route53::RecordSetGroup
12.   Properties:
13.     HostedZoneName: example.com.
14.     Comment: Zone apex alias targeted to myELB LoadBalancer.
15.     RecordSets:
16.     - Name: example.com.
17.       Type: A
18.       AliasTarget:
19.         HostedZoneId: !GetAtt 'myELB.CanonicalHostedZoneNameID'
20.         DNSName: !GetAtt 'myELB.DNSName'
```

### JSON para balanceador de carga, versión 2
<a name="quickref-route53-example-4-v2.json"></a>

```
 1.       "myELB" : {
 2.         "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
 3.         "Properties" : {
 4.             "Subnets" : [ 
 5.                 {"Ref": "SubnetAZ1"}, 
 6.                 {"Ref" : "SubnetAZ2"}
 7.             ]
 8.         }
 9.       },
10.       "myDNS" : {
11.         "Type" : "AWS::Route53::RecordSetGroup",
12.         "Properties" : {
13.           "HostedZoneName" : "example.com.",
14.           "Comment" : "Zone apex alias targeted to myELB LoadBalancer.",
15.           "RecordSets" : [
16.             {
17.               "Name" : "example.com.",
18.               "Type" : "A",
19.               "AliasTarget" : {
20.                   "HostedZoneId" : { "Fn::GetAtt" : ["myELB", "CanonicalHostedZoneID"] },
21.                   "DNSName" : { "Fn::GetAtt" : ["myELB","DNSName"] }
22.               }
23.             }
24.           ]
25.         }
26.     }
```

### YAML para balanceador de carga, versión 2
<a name="quickref-route53-example-4-v2.yaml"></a>

```
 1. myELB:
 2.   Type: AWS::ElasticLoadBalancingV2::LoadBalancer
 3.   Properties:
 4.     Subnets:
 5.     - Ref: SubnetAZ1
 6.     - Ref: SubnetAZ2
 7. myDNS:
 8.   Type: AWS::Route53::RecordSetGroup
 9.   Properties:
10.     HostedZoneName: example.com.
11.     Comment: Zone apex alias targeted to myELB LoadBalancer.
12.     RecordSets:
13.     - Name: example.com.
14.       Type: A
15.       AliasTarget:
16.         HostedZoneId: !GetAtt 'myELB.CanonicalHostedZoneID'
17.         DNSName: !GetAtt 'myELB.DNSName'
```

## Conjunto de registros de recursos de alias para una distribución de CloudFront
<a name="scenario-user-friendly-url-for-cloudfront-distribution"></a>

En el siguiente ejemplo se crea un registro de alias A que dirige un nombre de dominio personalizado a una distribución de CloudFront existente. Se asume que `myHostedZoneID` es una referencia a un recurso `AWS::Route53::HostedZone` real en la misma plantilla o un parámetro. `myCloudFrontDistribution` hace referencia a un recurso `AWS::CloudFront::Distribution` dentro de la misma plantilla. El registro de alias utiliza el ID de zona alojada estándar de CloudFront (`Z2FDTNDATAQYW2`) y resuelve automáticamente el nombre de dominio de la distribución mediante `Fn::GetAtt`. Esta configuración permite enrutar el tráfico web desde el dominio personalizado a la distribución de CloudFront sin necesidad de una dirección IP.

**nota**  
Cuando se crean conjuntos de registros de recursos de alias, debe especificar `Z2FDTNDATAQYW2` para la propiedad `HostedZoneId`. Los conjuntos de registros de recursos de alias para CloudFront no se pueden crear en una zona privada.

### JSON
<a name="quickref-route53-example-5.json"></a>

```
 1. {
 2.     "myDNS": {
 3.         "Type": "AWS::Route53::RecordSetGroup",
 4.         "Properties": {
 5.             "HostedZoneId": {
 6.                 "Ref": "myHostedZoneID"
 7.             },
 8.             "RecordSets": [
 9.                 {
10.                     "Name": {
11.                         "Ref": "myRecordSetDomainName"
12.                     },
13.                     "Type": "A",
14.                     "AliasTarget": {
15.                         "HostedZoneId": "Z2FDTNDATAQYW2",
16.                         "DNSName": {
17.                             "Fn::GetAtt": [
18.                                 "myCloudFrontDistribution",
19.                                 "DomainName"
20.                             ]
21.                         },
22.                         "EvaluateTargetHealth": false
23.                     }
24.                 }
25.             ]
26.         }
27.     }
28. }
```

### YAML
<a name="quickref-route53-example-5.yaml"></a>

```
 1. myDNS:
 2.   Type: AWS::Route53::RecordSetGroup
 3.   Properties:
 4.     HostedZoneId: !Ref myHostedZoneID
 5.     RecordSets:
 6.       - Name: !Ref myRecordSetDomainName
 7.         Type: A
 8.         AliasTarget:
 9.           HostedZoneId: Z2FDTNDATAQYW2
10.           DNSName: !GetAtt 
11.             - myCloudFrontDistribution
12.             - DomainName
13.           EvaluateTargetHealth: false
```

# Fragmentos de código de plantillas de Amazon S3
<a name="quickref-s3"></a>

Utilice estas plantillas de ejemplo de Amazon S3 para ayudar a describir los buckets de Amazon S3 con CloudFormation. Para obtener más ejemplos, consulte la sección [Ejemplos](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html#aws-resource-s3-bucket--examples) del recurso de `AWS::S3::Bucket`.

**Topics**
+ [Creación de un bucket de Amazon S3 con valores predeterminados](#scenario-s3-bucket)
+ [Creación de un bucket de Amazon S3 para el alojamiento de sitios web y con `DeletionPolicy`](#scenario-s3-bucket-website)
+ [Creación de un sitio web estático con un dominio personalizado](#scenario-s3-bucket-website-customdomain)

## Creación de un bucket de Amazon S3 con valores predeterminados
<a name="scenario-s3-bucket"></a>

Este ejemplo utiliza un [AWS::S3::Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html) para crear un bucket con configuración predeterminada.

### JSON
<a name="quickref-s3-example-1.json"></a>

```
1. "myS3Bucket" : {
2.       "Type" : "AWS::S3::Bucket"
3.       }
```

### YAML
<a name="quickref-s3-example-1.yaml"></a>

```
1. MyS3Bucket:
2.     Type: AWS::S3::Bucket
```

## Creación de un bucket de Amazon S3 para el alojamiento de sitios web y con `DeletionPolicy`
<a name="scenario-s3-bucket-website"></a>

En este ejemplo se crea un bucket como sitio web y se deshabilita el bloqueo de acceso público (los permisos de lectura públicos son necesarios para los buckets configurados para el alojamiento de sitios web). A continuación, se agrega una política de bucket pública al bucket. Dado que el recurso de este bucket tiene un atributo `DeletionPolicy` establecido en `Retain`, CloudFormation no eliminará este bucket cuando elimine la pila. La sección `Output` usa `Fn::GetAtt` para recuperar el atributo `WebsiteURL` y el atributo `DomainName` del recurso `S3Bucket`.

**nota**  
En los ejemplos siguientes se supone que las configuraciones de bloqueo de acceso público `BlockPublicPolicy` y `RestrictPublicBuckets` están deshabilitadas en la cuenta. 

### JSON
<a name="quickref-s3-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion": "2010-09-09",
 3.     "Resources": {
 4.         "S3Bucket": {
 5.             "Type": "AWS::S3::Bucket",
 6.             "Properties": {
 7.                 "PublicAccessBlockConfiguration": {
 8.                     "BlockPublicAcls": false,
 9.                     "BlockPublicPolicy": false,
10.                     "IgnorePublicAcls": false,
11.                     "RestrictPublicBuckets": false
12.                 },
13.                 "WebsiteConfiguration": {
14.                     "IndexDocument": "index.html",
15.                     "ErrorDocument": "error.html"
16.                 }
17.             },
18.             "DeletionPolicy": "Retain",
19.             "UpdateReplacePolicy": "Retain"
20.         },
21.         "BucketPolicy": {
22.             "Type": "AWS::S3::BucketPolicy",
23.             "Properties": {
24.                 "PolicyDocument": {
25.                     "Id": "MyPolicy",
26.                     "Version": "2012-10-17", 		 	 	 
27.                     "Statement": [
28.                         {
29.                             "Sid": "PublicReadForGetBucketObjects",
30.                             "Effect": "Allow",
31.                             "Principal": "*",
32.                             "Action": "s3:GetObject",
33.                             "Resource": {
34.                                 "Fn::Join": [
35.                                     "",
36.                                     [
37.                                         "arn:aws:s3:::",
38.                                         {
39.                                             "Ref": "S3Bucket"
40.                                         },
41.                                         "/*"
42.                                     ]
43.                                 ]
44.                             }
45.                         }
46.                     ]
47.                 },
48.                 "Bucket": {
49.                     "Ref": "S3Bucket"
50.                 }
51.             }
52.         }
53.     },
54.     "Outputs": {
55.         "WebsiteURL": {
56.             "Value": {
57.                 "Fn::GetAtt": [
58.                     "S3Bucket",
59.                     "WebsiteURL"
60.                 ]
61.             },
62.             "Description": "URL for website hosted on S3"
63.         },
64.         "S3BucketSecureURL": {
65.             "Value": {
66.                 "Fn::Join": [
67.                     "",
68.                     [
69.                         "https://",
70.                         {
71.                             "Fn::GetAtt": [
72.                                 "S3Bucket",
73.                                 "DomainName"
74.                             ]
75.                         }
76.                     ]
77.                 ]
78.             },
79.             "Description": "Name of S3 bucket to hold website content"
80.         }
81.     }
82. }
```

### YAML
<a name="quickref-s3-example-2.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Resources:
 3.   S3Bucket:
 4.     Type: AWS::S3::Bucket
 5.     Properties:
 6.       PublicAccessBlockConfiguration:
 7.         BlockPublicAcls: false
 8.         BlockPublicPolicy: false
 9.         IgnorePublicAcls: false
10.         RestrictPublicBuckets: false
11.       WebsiteConfiguration:
12.         IndexDocument: index.html
13.         ErrorDocument: error.html
14.     DeletionPolicy: Retain
15.     UpdateReplacePolicy: Retain
16.   BucketPolicy:
17.     Type: AWS::S3::BucketPolicy
18.     Properties:
19.       PolicyDocument:
20.         Id: MyPolicy
21.         Version: 2012-10-17 		 	 	 
22.         Statement:
23.           - Sid: PublicReadForGetBucketObjects
24.             Effect: Allow
25.             Principal: '*'
26.             Action: 's3:GetObject'
27.             Resource: !Join 
28.               - ''
29.               - - 'arn:aws:s3:::'
30.                 - !Ref S3Bucket
31.                 - /*
32.       Bucket: !Ref S3Bucket
33. Outputs:
34.   WebsiteURL:
35.     Value: !GetAtt 
36.       - S3Bucket
37.       - WebsiteURL
38.     Description: URL for website hosted on S3
39.   S3BucketSecureURL:
40.     Value: !Join 
41.       - ''
42.       - - 'https://'
43.         - !GetAtt 
44.           - S3Bucket
45.           - DomainName
46.     Description: Name of S3 bucket to hold website content
```

## Creación de un sitio web estático con un dominio personalizado
<a name="scenario-s3-bucket-website-customdomain"></a>

Puede utilizar Route 53 con un dominio registrado. El siguiente ejemplo presupone que ya ha creado una zona alojada en Route 53 para su dominio. El ejemplo crea dos buckets para el alojamiento de sitios web. El bucket raíz hospeda el contenido y los bukcets restantes redireccionan las solicitudes de `www.domainname.com` al bucket raíz. Los conjuntos de registros asignan su nombre de dominio a los puntos de enlace de Amazon S3. 

También deberá agregar una política de bucket, tal y como se muestra en los ejemplos anteriores.

Para obtener más información acerca del uso de un dominio personalizado, consulte [Tutorial: Configuración de un sitio web estático mediante un dominio personalizado registrado con Route 53](https://docs.aws.amazon.com/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html) en la *Guía del usuario de Amazon Simple Storage Service*.

**nota**  
En los ejemplos siguientes se supone que las configuraciones de bloqueo de acceso público `BlockPublicPolicy` y `RestrictPublicBuckets` están deshabilitadas en la cuenta. 

### JSON
<a name="quickref-s3-example-3.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Mappings" : {
        "RegionMap" : {
            "us-east-1" : { "S3hostedzoneID" : "Z3AQBSTGFYJSTF", "websiteendpoint" : "s3-website-us-east-1.amazonaws.com" },
            "us-west-1" : { "S3hostedzoneID" : "Z2F56UZL2M1ACD", "websiteendpoint" : "s3-website-us-west-1.amazonaws.com" },
            "us-west-2" : { "S3hostedzoneID" : "Z3BJ6K6RIION7M", "websiteendpoint" : "s3-website-us-west-2.amazonaws.com" },            
            "eu-west-1" : { "S3hostedzoneID" : "Z1BKCTXD74EZPE", "websiteendpoint" : "s3-website-eu-west-1.amazonaws.com" },
            "ap-southeast-1" : { "S3hostedzoneID" : "Z3O0J2DXBE1FTB", "websiteendpoint" : "s3-website-ap-southeast-1.amazonaws.com" },
            "ap-southeast-2" : { "S3hostedzoneID" : "Z1WCIGYICN2BYD", "websiteendpoint" : "s3-website-ap-southeast-2.amazonaws.com" },
            "ap-northeast-1" : { "S3hostedzoneID" : "Z2M4EHUR26P7ZW", "websiteendpoint" : "s3-website-ap-northeast-1.amazonaws.com" },
            "sa-east-1" : { "S3hostedzoneID" : "Z31GFT0UA1I2HV", "websiteendpoint" : "s3-website-sa-east-1.amazonaws.com" }
        }
    },
    "Parameters": {
        "RootDomainName": {
            "Description": "Domain name for your website (example.com)",
            "Type": "String"
        }
    },
    "Resources": {
        "RootBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName" : {"Ref":"RootDomainName"},
                "PublicAccessBlockConfiguration": {
                    "BlockPublicAcls": false,
                    "BlockPublicPolicy": false,
                    "IgnorePublicAcls": false,
                    "RestrictPublicBuckets": false
                },
                "WebsiteConfiguration": {
                    "IndexDocument":"index.html",
                    "ErrorDocument":"404.html"
                }
            }
        },
        "WWWBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": {
                    "Fn::Join": ["", ["www.", {"Ref":"RootDomainName"}]]
                },
                "AccessControl": "BucketOwnerFullControl",
                "WebsiteConfiguration": {
                    "RedirectAllRequestsTo": {
                        "HostName": {"Ref": "RootBucket"}
                    }
                }
            }
        },
        "myDNS": {
            "Type": "AWS::Route53::RecordSetGroup",
            "Properties": {
                "HostedZoneName": {
                    "Fn::Join": ["", [{"Ref": "RootDomainName"}, "."]]
                },
                "Comment": "Zone apex alias.",
                "RecordSets": [
                    {
                        "Name": {"Ref": "RootDomainName"},
                        "Type": "A",
                        "AliasTarget": {
                            "HostedZoneId": {"Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "S3hostedzoneID"]},
                            "DNSName": {"Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "websiteendpoint"]}
                        }
                    },
                    {
                        "Name": {
                            "Fn::Join": ["", ["www.", {"Ref":"RootDomainName"}]]
                        },
                        "Type": "CNAME",
                        "TTL" : "900",
                        "ResourceRecords" : [
                            {"Fn::GetAtt":["WWWBucket", "DomainName"]}
                        ]
                    }
                ]
            }
        }
    },
    "Outputs": {
        "WebsiteURL": {
            "Value": {"Fn::GetAtt": ["RootBucket", "WebsiteURL"]},
            "Description": "URL for website hosted on S3"
        }
    }
}
```

### YAML
<a name="quickref-s3-example-3.yaml"></a>

```
Parameters:
  RootDomainName:
    Description: Domain name for your website (example.com)
    Type: String
Mappings:
  RegionMap:
    us-east-1:
      S3hostedzoneID: Z3AQBSTGFYJSTF
      websiteendpoint: s3-website-us-east-1.amazonaws.com
    us-west-1:
      S3hostedzoneID: Z2F56UZL2M1ACD
      websiteendpoint: s3-website-us-west-1.amazonaws.com
    us-west-2:
      S3hostedzoneID: Z3BJ6K6RIION7M
      websiteendpoint: s3-website-us-west-2.amazonaws.com
    eu-west-1:
      S3hostedzoneID: Z1BKCTXD74EZPE
      websiteendpoint: s3-website-eu-west-1.amazonaws.com
    ap-southeast-1:
      S3hostedzoneID: Z3O0J2DXBE1FTB
      websiteendpoint: s3-website-ap-southeast-1.amazonaws.com
    ap-southeast-2:
      S3hostedzoneID: Z1WCIGYICN2BYD
      websiteendpoint: s3-website-ap-southeast-2.amazonaws.com
    ap-northeast-1:
      S3hostedzoneID: Z2M4EHUR26P7ZW
      websiteendpoint: s3-website-ap-northeast-1.amazonaws.com
    sa-east-1:
      S3hostedzoneID: Z31GFT0UA1I2HV
      websiteendpoint: s3-website-sa-east-1.amazonaws.com
Resources:
  RootBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref RootDomainName
      PublicAccessBlockConfiguration:
        BlockPublicAcls: false
        BlockPublicPolicy: false
        IgnorePublicAcls: false
        RestrictPublicBuckets: false
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: 404.html
  WWWBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub
        - www.${Domain}
        - Domain: !Ref RootDomainName
      AccessControl: BucketOwnerFullControl
      WebsiteConfiguration:
        RedirectAllRequestsTo:
          HostName: !Ref RootBucket
  myDNS:
    Type: AWS::Route53::RecordSetGroup
    Properties:
      HostedZoneName: !Sub 
        - ${Domain}.
        - Domain: !Ref RootDomainName
      Comment: Zone apex alias.
      RecordSets:
        - Name: !Ref RootDomainName
          Type: A
          AliasTarget:
            HostedZoneId: !FindInMap [ RegionMap, !Ref 'AWS::Region', S3hostedzoneID]
            DNSName: !FindInMap [ RegionMap, !Ref 'AWS::Region', websiteendpoint]
        - Name: !Sub
            - www.${Domain}
            - Domain: !Ref RootDomainName
          Type: CNAME
          TTL: 900
          ResourceRecords:
            - !GetAtt WWWBucket.DomainName
Outputs:
  WebsiteURL:
    Value: !GetAtt RootBucket.WebsiteURL
    Description: URL for website hosted on S3
```

# Fragmentos de plantillas de Amazon SNS
<a name="quickref-sns"></a>

Este ejemplo muestra un recurso de tema Amazon SNS. Requiere una dirección de correo electrónico válida.

## JSON
<a name="quickref-sns-example-1.json"></a>

```
1. "MySNSTopic" : {
2.     "Type" : "AWS::SNS::Topic",
3.     "Properties" : {
4.         "Subscription" : [ {
5.             "Endpoint" : "add valid email address",
6.             "Protocol" : "email"
7.         } ]
8.     }
9. }
```

## YAML
<a name="quickref-sns-example-1.yaml"></a>

```
1. MySNSTopic:
2.   Type: AWS::SNS::Topic
3.   Properties:
4.     Subscription:
5.     - Endpoint: "add valid email address"
6.       Protocol: email
```

# Fragmentos de código de plantillas de Amazon SQS
<a name="scenario-sqs-queue"></a>

Este ejemplo muestra una cola de Amazon SQS.

## JSON
<a name="scenario-sqs-queue-example-1.json"></a>

```
1. "MyQueue" : {
2.     "Type" : "AWS::SQS::Queue",
3.     "Properties" : {
4.         "VisibilityTimeout" : "value"
5.     }
6. }
```

## YAML
<a name="scenario-sqs-queue-example-1.yaml"></a>

```
1. MyQueue:
2.   Type: AWS::SQS::Queue
3.   Properties:
4.     VisibilityTimeout: value
```

# Fragmentos de plantilla de Amazon Timestream
<a name="scenario-timestream-queue"></a>

Amazon Timestream para InfluxDB le facilita a los desarrolladores de aplicaciones y a los equipos de DevOps la ejecución de bases de datos de InfluxDB totalmente administradas en AWS para aplicaciones de series temporales en tiempo real mediante las API de código abierto. Puede crear rápidamente una base de datos de InfluxDB que administre cargas de trabajo exigentes basadas en series temporales. Con unas simples llamadas a la API, puede configurar, migrar, operar y escalar una base de datos de InfluxDB en AWS mediante la aplicación automática de parches, copias de seguridad y recuperación de software. También puede encontrar estos ejemplos en [awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream-influxdb](https://github.com/awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream-influxdb) en GitHub.

**Topics**
+ [Muestra mínima con valores predeterminados](#scenario-timestream-influxdb-example-1)
+ [Un ejemplo más completo con parámetros](#scenario-timestream-influxdb-example-2)

Estas plantillas de CloudFormation crean los siguientes recursos necesarios para crear, conectar y supervisar correctamente una instancia de Amazon Timestream para InfluxDB:

**Amazon VPC**
+ `VPC`
+ Una `Subnet` o más
+ `InternetGateway`
+ `RouteTable`
+ `SecurityGroup`

**Amazon S3**
+ `Bucket`

**Amazon Timestream**
+ `InfluxDBInstance`

## Muestra mínima con valores predeterminados
<a name="scenario-timestream-influxdb-example-1"></a>

En este ejemplo, se implementa una instancia con múltiples zonas de disponibilidad y de acceso público utilizando los valores predeterminados siempre que sea posible.

### JSON
<a name="scenario-timestream-influxdb-example-1.json"></a>

```
{
  "Metadata": {
    "AWS::CloudFormation::Interface": {
      "ParameterGroups": [
        {
          "Label": {"default": "Amazon Timestream for InfluxDB Configuration"},
          "Parameters": [
            "DbInstanceName",
            "InfluxDBPassword"
          ]
        }
      ],
      "ParameterLabels": {
        "VPCCIDR": {"default": "VPC CIDR"}
      }
    }
  },
  "Parameters": {
    "DbInstanceName": {
      "Description": "The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.",
      "Type": "String",
      "Default": "mydbinstance",
      "MinLength": 3,
      "MaxLength": 40,
      "AllowedPattern": "^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$"
    },
    "InfluxDBPassword": {
      "Description": "The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "NoEcho": true,
      "MinLength": 8,
      "MaxLength": 64,
      "AllowedPattern": "^[a-zA-Z0-9]+$"
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {"CidrBlock": "10.0.0.0/16"}
    },
    "InternetGateway": {"Type": "AWS::EC2::InternetGateway"},
    "InternetGatewayAttachment": {
      "Type": "AWS::EC2::VPCGatewayAttachment",
      "Properties": {
        "InternetGatewayId": {"Ref": "InternetGateway"},
        "VpcId": {"Ref": "VPC"}
      }
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            0,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            0,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": true
      }
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            1,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            1,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": true
      }
    },
    "RouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "Properties": {
        "VpcId": {"Ref": "VPC"}
      }
    },
    "DefaultRoute": {
      "Type": "AWS::EC2::Route",
      "DependsOn": "InternetGatewayAttachment",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {"Ref": "InternetGateway"}
      }
    },
    "Subnet1RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet1"}
      }
    },
    "Subnet2RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet2"}
      }
    },
    "InfluxDBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupName": "influxdb-sg",
        "GroupDescription": "Security group allowing port 8086 ingress for InfluxDB",
        "VpcId": {"Ref": "VPC"}
      }
    },
    "InfluxDBSecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {"Ref": "InfluxDBSecurityGroup"},
        "IpProtocol": "tcp",
        "CidrIp": "0.0.0.0/0",
        "FromPort": 8086,
        "ToPort": 8086
      }
    },
    "InfluxDBLogsS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DeletionPolicy": "Retain"
    },
    "InfluxDBLogsS3BucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {"Ref": "InfluxDBLogsS3Bucket"},
        "PolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "s3:PutObject",
              "Effect": "Allow",
              "Resource": {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*"},
              "Principal": {"Service": "timestream-influxdb.amazonaws.com"}
            },
            {
              "Action": "s3:*",
              "Effect": "Deny",
              "Resource": [
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/*"},
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}"}
              ],
              "Principal": "*",
              "Condition": {
                "Bool": {"aws:SecureTransport": false}
              }
            }
          ]
        }
      }
    },
    "DbInstance": {
      "Type": "AWS::Timestream::InfluxDBInstance",
      "DependsOn": "InfluxDBLogsS3BucketPolicy",
      "Properties": {
        "AllocatedStorage": 20,
        "DbInstanceType": "db.influx.medium",
        "Name": {"Ref": "DbInstanceName"},
        "Password": {"Ref": "InfluxDBPassword"},
        "PubliclyAccessible": true,
        "DeploymentType": "WITH_MULTIAZ_STANDBY",
        "VpcSecurityGroupIds": [
          {"Ref": "InfluxDBSecurityGroup"}
        ],
        "VpcSubnetIds": [
          {"Ref": "Subnet1"},
          {"Ref": "Subnet2"}
        ],
        "LogDeliveryConfiguration": {
          "S3Configuration": {
            "BucketName": {"Ref": "InfluxDBLogsS3Bucket"},
            "Enabled": true
          }
        }
      }
    }
  },
  "Outputs": {
    "VPC": {
      "Description": "A reference to the VPC used to create network resources",
      "Value": {"Ref": "VPC"}
    },
    "Subnets": {
      "Description": "A list of the subnets created",
      "Value": {
        "Fn::Join": [
          ",",
          [
            {"Ref": "Subnet1"},
            {"Ref": "Subnet2"}
          ]
        ]
      }
    },
    "Subnet1": {
      "Description": "A reference to the subnet in the 1st Availability Zone",
      "Value": {"Ref": "Subnet1"}
    },
    "Subnet2": {
      "Description": "A reference to the subnet in the 2nd Availability Zone",
      "Value": {"Ref": "Subnet2"}
    },
    "InfluxDBSecurityGroup": {
      "Description": "Security group with port 8086 ingress rule",
      "Value": {"Ref": "InfluxDBSecurityGroup"}
    },
    "InfluxDBLogsS3Bucket": {
      "Description": "S3 Bucket containing InfluxDB logs from the DB instance",
      "Value": {"Ref": "InfluxDBLogsS3Bucket"}
    },
    "DbInstance": {
      "Description": "A reference to the Timestream for InfluxDB DB instance",
      "Value": {"Ref": "DbInstance"}
    },
    "InfluxAuthParametersSecretArn": {
      "Description": "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password.",
      "Value": {
        "Fn::GetAtt": [
          "DbInstance",
          "InfluxAuthParametersSecretArn"
        ]
      }
    },
    "Endpoint": {
      "Description": "The endpoint URL to connect to InfluxDB",
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://",
            {
              "Fn::GetAtt": [
                "DbInstance",
                "Endpoint"
              ]
            },
            ":8086"
          ]
        ]
      }
    }
  }
}
```

### YAML
<a name="scenario-timestream-influxdb-example-1.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Label:
          default: "Amazon Timestream for InfluxDB Configuration"
        Parameters:
          - DbInstanceName
          - InfluxDBPassword
    ParameterLabels:
      VPCCIDR:
        default: VPC CIDR

Parameters:
  DbInstanceName:
    Description: The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.
    Type: String
    Default: mydbinstance
    MinLength: 3
    MaxLength: 40
    AllowedPattern: ^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$
  InfluxDBPassword:
    Description: The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 64
    AllowedPattern: ^[a-zA-Z0-9]+$

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  InternetGateway:
    Type: AWS::EC2::InternetGateway
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: true
  Subnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [1, !GetAZs  '']
      CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: true
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  DefaultRoute:
    Type: AWS::EC2::Route
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet1
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet2
  InfluxDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "influxdb-sg"
      GroupDescription: "Security group allowing port 8086 ingress for InfluxDB"
      VpcId: !Ref VPC
  InfluxDBSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref InfluxDBSecurityGroup
      IpProtocol: tcp
      CidrIp: 0.0.0.0/0
      FromPort: 8086
      ToPort: 8086
  InfluxDBLogsS3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
  InfluxDBLogsS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref InfluxDBLogsS3Bucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*
            Principal:
              Service: timestream-influxdb.amazonaws.com
          - Action: "s3:*"
            Effect: Deny
            Resource:
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/*
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}
            Principal: "*"
            Condition:
              Bool:
                aws:SecureTransport: false
  DbInstance:
    Type: AWS::Timestream::InfluxDBInstance
    DependsOn: InfluxDBLogsS3BucketPolicy
    Properties:
      AllocatedStorage: 20
      DbInstanceType: db.influx.medium
      Name: !Ref DbInstanceName
      Password: !Ref InfluxDBPassword
      PubliclyAccessible: true
      DeploymentType: WITH_MULTIAZ_STANDBY
      VpcSecurityGroupIds: 
        - !Ref InfluxDBSecurityGroup
      VpcSubnetIds:
        - !Ref Subnet1
        - !Ref Subnet2
      LogDeliveryConfiguration:
        S3Configuration:
          BucketName: !Ref InfluxDBLogsS3Bucket
          Enabled: true

Outputs:
  # Network Resources
  VPC:
    Description: A reference to the VPC used to create network resources
    Value: !Ref VPC
  Subnets:
    Description: A list of the subnets created
    Value: !Join [",", [!Ref Subnet1, !Ref Subnet2]]
  Subnet1:
    Description: A reference to the subnet in the 1st Availability Zone
    Value: !Ref Subnet1
  Subnet2:
    Description: A reference to the subnet in the 2nd Availability Zone
    Value: !Ref Subnet2
  InfluxDBSecurityGroup:
    Description: Security group with port 8086 ingress rule
    Value: !Ref InfluxDBSecurityGroup

  # Timestream for InfluxDB Resources
  InfluxDBLogsS3Bucket:
    Description: S3 Bucket containing InfluxDB logs from the DB instance
    Value: !Ref InfluxDBLogsS3Bucket
  DbInstance:
    Description: A reference to the Timestream for InfluxDB DB instance
    Value: !Ref DbInstance
  InfluxAuthParametersSecretArn:
    Description: "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password."
    Value: !GetAtt DbInstance.InfluxAuthParametersSecretArn
  Endpoint:
    Description: The endpoint URL to connect to InfluxDB
    Value: !Join ["", ["https://", !GetAtt DbInstance.Endpoint, ":8086"]]
```

## Un ejemplo más completo con parámetros
<a name="scenario-timestream-influxdb-example-2"></a>

Esta plantilla de ejemplo altera dinámicamente los recursos de la red en función de los parámetros proporcionados. Los parámetros incluyen a `PubliclyAccessible` y `DeploymentType`.

### JSON
<a name="scenario-timestream-influxdb-example-2.json"></a>

```
{
  "Metadata": {
    "AWS::CloudFormation::Interface": {
      "ParameterGroups": [
        {
          "Label": {"default": "Network Configuration"},
          "Parameters": ["VPCCIDR"]
        },
        {
          "Label": {"default": "Amazon Timestream for InfluxDB Configuration"},
          "Parameters": [
            "DbInstanceName",
            "InfluxDBUsername",
            "InfluxDBPassword",
            "InfluxDBOrganization",
            "InfluxDBBucket",
            "DbInstanceType",
            "DbStorageType",
            "AllocatedStorage",
            "PubliclyAccessible",
            "DeploymentType"
          ]
        }
      ],
      "ParameterLabels": {
        "VPCCIDR": {"default": "VPC CIDR"}
      }
    }
  },
  "Parameters": {
    "VPCCIDR": {
      "Description": "Please enter the IP range (CIDR notation) for the new VPC",
      "Type": "String",
      "Default": "10.0.0.0/16"
    },
    "DbInstanceName": {
      "Description": "The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.",
      "Type": "String",
      "Default": "mydbinstance",
      "MinLength": 3,
      "MaxLength": 40,
      "AllowedPattern": "^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$"
    },
    "InfluxDBUsername": {
      "Description": "The username of the initial admin user created in InfluxDB. Must start with a letter and can't end with a hyphen or contain two consecutive hyphens. For example, my-user1. This username will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "Default": "admin",
      "MinLength": 1,
      "MaxLength": 64
    },
    "InfluxDBPassword": {
      "Description": "The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "NoEcho": true,
      "MinLength": 8,
      "MaxLength": 64,
      "AllowedPattern": "^[a-zA-Z0-9]+$"
    },
    "InfluxDBOrganization": {
      "Description": "The name of the initial organization for the initial admin user in InfluxDB. An InfluxDB organization is a workspace for a group of users.",
      "Type": "String",
      "Default": "org",
      "MinLength": 1,
      "MaxLength": 64
    },
    "InfluxDBBucket": {
      "Description": "The name of the initial InfluxDB bucket. All InfluxDB data is stored in a bucket. A bucket combines the concept of a database and a retention period (the duration of time that each data point persists). A bucket belongs to an organization.",
      "Type": "String",
      "Default": "bucket",
      "MinLength": 2,
      "MaxLength": 64,
      "AllowedPattern": "^[^_\\\"][^\\\"]*$"
    },
    "DeploymentType": {
      "Description": "Specifies whether the Timestream for InfluxDB is deployed as Single-AZ or with a MultiAZ Standby for High availability",
      "Type": "String",
      "Default": "WITH_MULTIAZ_STANDBY",
      "AllowedValues": [
        "SINGLE_AZ",
        "WITH_MULTIAZ_STANDBY"
      ]
    },
    "AllocatedStorage": {
      "Description": "The amount of storage to allocate for your DB storage type in GiB (gibibytes).",
      "Type": "Number",
      "Default": 400,
      "MinValue": 20,
      "MaxValue": 16384
    },
    "DbInstanceType": {
      "Description": "The Timestream for InfluxDB DB instance type to run InfluxDB on.",
      "Type": "String",
      "Default": "db.influx.medium",
      "AllowedValues": [
        "db.influx.medium",
        "db.influx.large",
        "db.influx.xlarge",
        "db.influx.2xlarge",
        "db.influx.4xlarge",
        "db.influx.8xlarge",
        "db.influx.12xlarge",
        "db.influx.16xlarge"
      ]
    },
    "DbStorageType": {
      "Description": "The Timestream for InfluxDB DB storage type to read and write InfluxDB data.",
      "Type": "String",
      "Default": "InfluxIOIncludedT1",
      "AllowedValues": [
        "InfluxIOIncludedT1",
        "InfluxIOIncludedT2",
        "InfluxIOIncludedT3"
      ]
    },
    "PubliclyAccessible": {
      "Description": "Configures the DB instance with a public IP to facilitate access.",
      "Type": "String",
      "Default": true,
      "AllowedValues": [
        true,
        false
      ]
    }
  },
  "Conditions": {
    "IsMultiAZ": {
      "Fn::Equals": [
        {"Ref": "DeploymentType"},
        "WITH_MULTIAZ_STANDBY"
      ]
    },
    "IsPublic": {
      "Fn::Equals": [
        {"Ref": "PubliclyAccessible"},
        true
      ]
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": {"Ref": "VPCCIDR"}
      }
    },
    "InternetGateway": {
      "Type": "AWS::EC2::InternetGateway",
      "Condition": "IsPublic"
    },
    "InternetGatewayAttachment": {
      "Type": "AWS::EC2::VPCGatewayAttachment",
      "Condition": "IsPublic",
      "Properties": {
        "InternetGatewayId": {"Ref": "InternetGateway"},
        "VpcId": {"Ref": "VPC"}
      }
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            0,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            0,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        }
      }
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet",
      "Condition": "IsMultiAZ",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            1,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            1,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        }
      }
    },
    "RouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "Properties": {
        "VpcId": {"Ref": "VPC"}
      }
    },
    "DefaultRoute": {
      "Type": "AWS::EC2::Route",
      "Condition": "IsPublic",
      "DependsOn": "InternetGatewayAttachment",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {"Ref": "InternetGateway"}
      }
    },
    "Subnet1RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet1"}
      }
    },
    "Subnet2RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Condition": "IsMultiAZ",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet2"}
      }
    },
    "InfluxDBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupName": "influxdb-sg",
        "GroupDescription": "Security group allowing port 8086 ingress for InfluxDB",
        "VpcId": {"Ref": "VPC"}
      }
    },
    "InfluxDBSecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {"Ref": "InfluxDBSecurityGroup"},
        "IpProtocol": "tcp",
        "CidrIp": "0.0.0.0/0",
        "FromPort": 8086,
        "ToPort": 8086
      }
    },
    "InfluxDBLogsS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DeletionPolicy": "Retain"
    },
    "InfluxDBLogsS3BucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {"Ref": "InfluxDBLogsS3Bucket"},
        "PolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "s3:PutObject",
              "Effect": "Allow",
              "Resource": {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*"},
              "Principal": {"Service": "timestream-influxdb.amazonaws.com"}
            },
            {
              "Action": "s3:*",
              "Effect": "Deny",
              "Resource": [
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/*"},
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}"}
              ],
              "Principal": "*",
              "Condition": {
                "Bool": {"aws:SecureTransport": false}
              }
            }
          ]
        }
      }
    },
    "DbInstance": {
      "Type": "AWS::Timestream::InfluxDBInstance",
      "DependsOn": "InfluxDBLogsS3BucketPolicy",
      "Properties": {
        "DbStorageType": {"Ref": "DbStorageType"},
        "AllocatedStorage": {"Ref": "AllocatedStorage"},
        "DbInstanceType": {"Ref": "DbInstanceType"},
        "Name": {"Ref": "DbInstanceName"},
        "Username": {"Ref": "InfluxDBUsername"},
        "Password": {"Ref": "InfluxDBPassword"},
        "Organization": {"Ref": "InfluxDBOrganization"},
        "Bucket": {"Ref": "InfluxDBBucket"},
        "PubliclyAccessible": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        },
        "DeploymentType": {"Ref": "DeploymentType"},
        "VpcSecurityGroupIds": [
          {"Ref": "InfluxDBSecurityGroup"}
        ],
        "VpcSubnetIds": {
          "Fn::If": [
            "IsMultiAZ",
            [
              {"Ref": "Subnet1"},
              {"Ref": "Subnet2"}
            ],
            [
              {"Ref": "Subnet1"}
            ]
          ]
        },
        "LogDeliveryConfiguration": {
          "S3Configuration": {
            "BucketName": {"Ref": "InfluxDBLogsS3Bucket"},
            "Enabled": true
          }
        }
      }
    }
  },
  "Outputs": {
    "VPC": {
      "Description": "A reference to the VPC used to create network resources",
      "Value": {"Ref": "VPC"}
    },
    "Subnets": {
      "Description": "A list of the subnets created",
      "Value": {
        "Fn::If": [
          "IsMultiAZ",
          {
            "Fn::Join": [
              ",",
              [
                {"Ref": "Subnet1"},
                {"Ref": "Subnet2"}
              ]
            ]
          },
          {"Ref": "Subnet1"}
        ]
      }
    },
    "Subnet1": {
      "Description": "A reference to the subnet in the 1st Availability Zone",
      "Value": {"Ref": "Subnet1"}
    },
    "Subnet2": {
      "Condition": "IsMultiAZ",
      "Description": "A reference to the subnet in the 2nd Availability Zone",
      "Value": {"Ref": "Subnet2"}
    },
    "InfluxDBSecurityGroup": {
      "Description": "Security group with port 8086 ingress rule",
      "Value": {"Ref": "InfluxDBSecurityGroup"}
    },
    "InfluxDBLogsS3Bucket": {
      "Description": "S3 Bucket containing InfluxDB logs from the DB instance",
      "Value": {"Ref": "InfluxDBLogsS3Bucket"}
    },
    "DbInstance": {
      "Description": "A reference to the Timestream for InfluxDB DB instance",
      "Value": {"Ref": "DbInstance"}
    },
    "InfluxAuthParametersSecretArn": {
      "Description": "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password.",
      "Value": {
        "Fn::GetAtt": [
          "DbInstance",
          "InfluxAuthParametersSecretArn"
        ]
      }
    },
    "Endpoint": {
      "Description": "The endpoint URL to connect to InfluxDB",
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://",
            {
              "Fn::GetAtt": [
                "DbInstance",
                "Endpoint"
              ]
            },
            ":8086"
          ]
        ]
      }
    }
  }
}
```

### YAML
<a name="scenario-timestream-influxdb-example-2.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: "Network Configuration"
        Parameters:
          - VPCCIDR
      -
        Label:
          default: "Amazon Timestream for InfluxDB Configuration"
        Parameters:
          - DbInstanceName
          - InfluxDBUsername
          - InfluxDBPassword
          - InfluxDBOrganization
          - InfluxDBBucket
          - DbInstanceType
          - DbStorageType
          - AllocatedStorage
          - PubliclyAccessible
          - DeploymentType
    ParameterLabels:
      VPCCIDR:
        default: VPC CIDR

Parameters:
  # Network Configuration
  VPCCIDR:
    Description: Please enter the IP range (CIDR notation) for the new VPC
    Type: String
    Default: 10.0.0.0/16
  # Timestream for InfluxDB Configuration
  DbInstanceName:
    Description: The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.
    Type: String
    Default: mydbinstance
    MinLength: 3
    MaxLength: 40    
    AllowedPattern: ^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$
  # InfluxDB initial user configurations
  InfluxDBUsername:
    Description: The username of the initial admin user created in InfluxDB. Must start with a letter and can't end with a hyphen or contain two consecutive hyphens. For example, my-user1. This username will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.
    Type: String
    Default: admin
    MinLength: 1
    MaxLength: 64
  InfluxDBPassword:
    Description: The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS in your account.
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 64
    AllowedPattern: ^[a-zA-Z0-9]+$
  InfluxDBOrganization:
    Description: The name of the initial organization for the initial admin user in InfluxDB. An InfluxDB organization is a workspace for a group of users.
    Type: String
    Default: org
    MinLength: 1
    MaxLength: 64
  InfluxDBBucket:
    Description: The name of the initial InfluxDB bucket. All InfluxDB data is stored in a bucket. A bucket combines the concept of a database and a retention period (the duration of time that each data point persists). A bucket belongs to an organization.
    Type: String
    Default: bucket
    MinLength: 2
    MaxLength: 64
    AllowedPattern: ^[^_\"][^\"]*$
  DeploymentType:
    Description: Specifies whether the Timestream for InfluxDB is deployed as Single-AZ or with a MultiAZ Standby for High availability
    Type: String
    Default: WITH_MULTIAZ_STANDBY
    AllowedValues:
      - SINGLE_AZ
      - WITH_MULTIAZ_STANDBY
  AllocatedStorage:
    Description: The amount of storage to allocate for your DB storage type in GiB (gibibytes).
    Type: Number
    Default: 400
    MinValue: 20
    MaxValue: 16384
  DbInstanceType:
    Description: The Timestream for InfluxDB DB instance type to run InfluxDB on.
    Type: String
    Default: db.influx.medium
    AllowedValues:
      - db.influx.medium
      - db.influx.large
      - db.influx.xlarge
      - db.influx.2xlarge
      - db.influx.4xlarge
      - db.influx.8xlarge
      - db.influx.12xlarge
      - db.influx.16xlarge
  DbStorageType:
    Description: The Timestream for InfluxDB DB storage type to read and write InfluxDB data.
    Type: String
    Default: InfluxIOIncludedT1
    AllowedValues:
      - InfluxIOIncludedT1
      - InfluxIOIncludedT2
      - InfluxIOIncludedT3
  PubliclyAccessible:
    Description: Configures the DB instance with a public IP to facilitate access.
    Type: String
    Default: true
    AllowedValues:
      - true
      - false

Conditions:
  IsMultiAZ: !Equals [!Ref DeploymentType, WITH_MULTIAZ_STANDBY]
  IsPublic: !Equals [!Ref PubliclyAccessible, true]

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCIDR
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Condition: IsPublic
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Condition: IsPublic
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: !If [IsPublic, true, false]
  Subnet2:
    Type: AWS::EC2::Subnet
    Condition: IsMultiAZ
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [1, !GetAZs  '']
      CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: !If [IsPublic, true, false]
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  DefaultRoute:
    Type: AWS::EC2::Route
    Condition: IsPublic
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet1
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Condition: IsMultiAZ
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet2
  InfluxDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "influxdb-sg"
      GroupDescription: "Security group allowing port 8086 ingress for InfluxDB"
      VpcId: !Ref VPC
  InfluxDBSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref InfluxDBSecurityGroup
      IpProtocol: tcp
      CidrIp: 0.0.0.0/0
      FromPort: 8086
      ToPort: 8086
  InfluxDBLogsS3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
  InfluxDBLogsS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref InfluxDBLogsS3Bucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*
            Principal:
              Service: timestream-influxdb.amazonaws.com
          - Action: "s3:*"
            Effect: Deny
            Resource:
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/*
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}
            Principal: "*"
            Condition:
              Bool:
                aws:SecureTransport: false
  DbInstance:
    Type: AWS::Timestream::InfluxDBInstance
    DependsOn: InfluxDBLogsS3BucketPolicy
    Properties:
      DbStorageType: !Ref DbStorageType
      AllocatedStorage: !Ref AllocatedStorage
      DbInstanceType: !Ref DbInstanceType
      Name: !Ref DbInstanceName
      Username: !Ref InfluxDBUsername
      Password: !Ref InfluxDBPassword
      Organization: !Ref InfluxDBOrganization
      Bucket: !Ref InfluxDBBucket
      PubliclyAccessible: !If [IsPublic, true, false]
      DeploymentType: !Ref DeploymentType
      VpcSecurityGroupIds: 
        - !Ref InfluxDBSecurityGroup
      VpcSubnetIds: !If
        - IsMultiAZ
        -
          - !Ref Subnet1
          - !Ref Subnet2
        -
          - !Ref Subnet1
      LogDeliveryConfiguration:
        S3Configuration:
          BucketName: !Ref InfluxDBLogsS3Bucket
          Enabled: true

Outputs:
  # Network Resources
  VPC:
    Description: A reference to the VPC used to create network resources
    Value: !Ref VPC
  Subnets:
    Description: A list of the subnets created
    Value: !If
      - IsMultiAZ
      - !Join [",", [!Ref Subnet1, !Ref Subnet2]]
      - !Ref Subnet1
  Subnet1:
    Description: A reference to the subnet in the 1st Availability Zone
    Value: !Ref Subnet1
  Subnet2:
    Condition: IsMultiAZ
    Description: A reference to the subnet in the 2nd Availability Zone
    Value: !Ref Subnet2
  InfluxDBSecurityGroup:
    Description: Security group with port 8086 ingress rule
    Value: !Ref InfluxDBSecurityGroup

  # Timestream for InfluxDB Resources
  InfluxDBLogsS3Bucket:
    Description: S3 Bucket containing InfluxDB logs from the DB instance
    Value: !Ref InfluxDBLogsS3Bucket
  DbInstance:
    Description: A reference to the Timestream for InfluxDB DB instance
    Value: !Ref DbInstance
  InfluxAuthParametersSecretArn:
    Description: "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password."
    Value: !GetAtt DbInstance.InfluxAuthParametersSecretArn
  Endpoint:
    Description: The endpoint URL to connect to InfluxDB
    Value: !Join ["", ["https://", !GetAtt DbInstance.Endpoint, ":8086"]]
```

# Implementación de pilas basadas en Windows usando CloudFormation
<a name="cfn-windows-stacks"></a>

Esta página proporciona enlaces a la documentación de referencia técnica para los recursos de CloudFormation que se utilizan habitualmente en las implementaciones basadas en Windows.

CloudFormation proporciona soporte para implementar y administrar pilas de Microsoft Windows a través de Infrastructure as Code (IaC). Puede usar CloudFormation para el aprovisionamiento automatizado de instancias de EC2 basadas en Windows, SQL Server en Amazon RDS y el Active Directory de Microsoft a través de Directory Service.

AWS proporciona imágenes de máquina de Amazon (AMI) preconfiguradas diseñadas específicamente para plataformas Windows que le ayudan a implementar aplicaciones rápidamente en Amazon EC2. Estas AMI incluyen configuraciones predeterminadas de Microsoft y personalizaciones específicas de AWS. Con CloudFormation, puede elegir una AMI adecuada, inicializar una instancia y acceder a ella utilizando Conexión a Escritorio remoto, como lo haría con cualquier otro Windows Server. Las AMI contienen componentes de software esenciales, incluyendo EC2Launch (las versiones varían según la edición de Windows Server), AWS Systems Manager, CloudFormation, Herramientas de AWS para PowerShell y varios controladores de red, almacenamiento y gráficos para garantizar un rendimiento y una compatibilidad óptimos con los servicios de AWS. Para obtener más información, consulte la [Referencia de la AMI de Windows de AWS](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html).

CloudFormation también admite herramientas de configuración de software, como scripts `UserData`, que pueden ejecutar comandos PowerShell o por lotes cuando se inicia una instancia de EC2 por primera vez. También ofrece scripts auxiliares (`cfn-init`, `cfn-signal`, `cfn-get-metadata` y `cfn-hup`) y admite los metadatos `AWS::CloudFormation::Init` para administrar paquetes, archivos y servicios en instancias de Windows.

Para entornos empresariales, CloudFormation permite la unión de dominios, la administración de licencias de Windows mediante modelos de licencias de EC2 y la gestión segura de credenciales con AWS Secrets Manager. En combinación con plantillas con control de versiones e implementaciones repetibles, CloudFormation ayuda a las organizaciones a mantener entornos de Windows consistentes, seguros y escalables en múltiples cuentas y Regiones de AWS.

Para obtener información detallada sobre los recursos de CloudFormation que se utilizan habitualmente en las implementaciones basadas en Windows, consulte los siguientes temas de referencia técnica.


| Tipo de recurso | Descripción | 
| --- | --- | 
|  [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)  |  Para inicializar instancias de EC2 en Windows.  | 
|  [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)  |  Para definir las reglas de firewall para cargas de trabajo de Windows.  | 
|  [AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)  |  Para escalar instancias de EC2 en Windows.  | 
|  [AWS::DirectoryService::MicrosoftAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html)  |  Para implementar el Active Directory de Microsoft.  | 
|  [AWS::FSx::FileSystem](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-fsx-filesystem.html)  |  Para implementar FSx para Windows File Server.  | 
|  [AWS::RDS::DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)  |  Para aprovisionar SQL Server en Amazon RDS.  | 
|  [AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html)  |  Se utiliza en los metadatos de EC2 para configurar instancias.  Para obtener más información, consulte [Arranque de pilas de CloudFormation basadas en Windows](cfn-windows-stacks-bootstrapping.md).  | 
|  [AWS::SecretsManager::Secret](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-secretsmanager-secret.html)  |  Para administrar de forma segura las credenciales y contraseñas de Windows.  | 
|  [AWS::SSM::Parameter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ssm-parameter.html)  |  Para almacenar los valores de configuración de forma segura.  | 
|  [AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-instanceprofile.html) [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)  |  Para conceder permisos a aplicaciones que se ejecutan en instancias de EC2.  | 

# Arranque de pilas de CloudFormation basadas en Windows
<a name="cfn-windows-stacks-bootstrapping"></a>

En este tema se describe cómo arrancar una pila de Windows y solucionar problemas de creación de pila. 

**Topics**
+ [Datos de usuario en instancias de EC2](#cfn-windows-bootstrapping-user-data)
+ [Scripts auxiliares de CloudFormation](#cfn-windows-bootstrapping-helper-scripts)
+ [Ejemplo de arranque de una pila de Windows](#cfn-windows-bootstrapping-example)
+ [Evite las barras invertidas en las rutas de los archivos de Windows](#cfn-windows-stacks-escape-backslashes)
+ [Administración de servicios de Windows](#cfn-windows-stacks-manage-windows-services)
+ [Cómo solucionar problemas de creación de pila](#cfn-windows-stacks-troubleshooting)

## Datos de usuario en instancias de EC2
<a name="cfn-windows-bootstrapping-user-data"></a>

Los datos de usuario son una característica de Amazon EC2 que le permite pasar scripts o información de configuración a una instancia de EC2 cuando se lanza. 

En el caso de las instancias de EC2 de Windows:
+ Puede utilizar scripts por lotes (mediante etiquetas `<script>`) o scripts PowerShell (mediante etiquetas `<powershell>`).
+ EC2Launch gestiona la ejecución del script.

**importante**  
Si va a crear su propia AMI de Windows para usarla con CloudFormation, asegúrese de que EC2Launch v2 esté configurada correctamente. EC2Launch v2 es necesario para que las herramientas de arranque de CloudFormation inicialicen y configuren correctamente las instancias de Windows durante la creación de la pila. Para obtener más información, consulte [Uso del agente EC2Launch v2 para realizar tareas durante la inicialización de una instancia de EC2 Windows](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html) en la *Guía del usuario de Amazon EC2*.  
Para obtener información sobre las AMI de Windows de AWS, consulte [AWS Windows AMI Reference](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html).

## Scripts auxiliares de CloudFormation
<a name="cfn-windows-bootstrapping-helper-scripts"></a>

Los scripts auxiliares son utilidades para configurar instancias durante el proceso de arranque. Se utilizan con los datos de usuario de Amazon EC2 y ofrecen opciones eficaces de configuración.

CloudFormation proporciona los siguientes scripts auxiliares de Python que puede utilizar para instalar software e iniciar servicios en una instancia de Amazon EC2 que cree como parte de la pila:
+  `cfn-init`: se utiliza para recuperar e interpretar los metadatos de los recursos, instalar paquetes, crear archivos e iniciar servicios.
+  `cfn-signal`: se utiliza para señalizar con una `CreationPolicy`, de modo que se puedan sincronizar otros recursos de la pila cuando esté listo el recurso o la aplicación de requisitos previos.
+  `cfn-get-metadata`: se utiliza para recuperar los metadatos de un recurso o de la ruta a una clave específica.
+  `cfn-hup`: se utiliza para comprobar si hay actualizaciones de metadatos y ejecutar enlaces personalizados cuando se detectan cambios.

Los scripts se llaman directamente desde la plantilla. Los scripts funcionan junto con los metadatos de los recursos que están definidos en la misma plantilla. Los scripts se ejecutan en la instancia Amazon EC2 durante el proceso de creación de la pila.

Para obtener más información, consulte [Referencia de scripts auxiliares de CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) en la *Guía de referencia de plantillas de CloudFormation*.

## Ejemplo de arranque de una pila de Windows
<a name="cfn-windows-bootstrapping-example"></a>

Examinemos fragmentos de ejemplo de una plantilla de Windows Server que realiza las siguientes acciones:
+ Lanza una instancia de EC2 con el nombre `TestInstance` de una AMI de Windows Server de 2022.
+ Crea un archivo de prueba sencillo para verificar que `cfn-init` está funcionando.
+ Configura `cfn-hup` para la administración continua de la configuración.
+ Utiliza una `CreationPolicy` para garantizar que la instancia señale la finalización exitosa.

El script auxiliar `cfn-init` se utiliza para llevar a cabo cada una de estas acciones en función de la información del recurso `AWS::CloudFormation::Init` de la plantilla.

La sección `AWS::CloudFormation::Init` se denomina `TestInstance` y comienza con la siguiente instrucción.

```
TestInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      configSets:
        default:
          - create_files
          - start_services
```

Después de esto, la sección `files` de `AWS::CloudFormation::Init` se declara.

```
      create_files:
        files:
          c:\cfn\test.txt:
            content: !Sub |
              Hello from ${AWS::StackName}
          c:\cfn\cfn-hup.conf:
            content: !Sub |
              [main]
              stack=${AWS::StackName}
              region=${AWS::Region}
              interval=2
          c:\cfn\hooks.d\cfn-auto-reloader.conf:
            content: !Sub |
              [cfn-auto-reloader-hook]
              triggers=post.update
              path=Resources.TestInstance.Metadata.AWS::CloudFormation::Init
              action=cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
```

Aquí se crean tres archivos, que se colocan en el directorio `C:\cfn` de la instancia del servidor:
+ `test.txt`, un archivo de prueba simple que verifica que `cfn-init` funciona correctamente y puede crear archivos con contenido dinámico.
+ `cfn-hup.conf`, el archivo de configuración para `cfn-hup` con un intervalo de verificación de 2 minutos.
+ `cfn-auto-reloader.conf`, el archivo de configuración para el enlace que usa `cfn-hup` para iniciar una actualización (mediante llamada a `cfn-init`) cuando cambian los metadatos en `AWS::CloudFormation::Init`.

La siguiente es la sección `start_services` que configura los servicios de Windows.

```
      start_services:
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

Esta sección garantiza que el servicio `cfn-hup` se inicie y se reinicie automáticamente si se modifican los archivos de configuración. El servicio supervisa los cambios en los metadatos de CloudFormation y vuelve a ejecutar `cfn-init` cuando se detectan actualizaciones.

A continuación está la sección `Properties`.

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Metadata:
    AWS::CloudFormation::Init:
      # ... metadata configuration ...
  Properties:
    InstanceType: t2.large
    ImageId: '{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base}}'
    SecurityGroupIds:
      - !Ref InstanceSecurityGroup
    KeyName: !Ref KeyPairName
    UserData:
      Fn::Base64: !Sub |
        <powershell>
        cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
        cfn-signal.exe -e $lastexitcode --stack ${AWS::StackName} --resource TestInstance --region ${AWS::Region}
        </powershell>
```

En esta sección, la propiedad `UserData` contiene un script PowerShell que ejecutará EC2Launch, rodeado de etiquetas `<powershell>`. El script ejecuta `cfn-init` con el ConfigSet `default` y luego utiliza `cfn-signal` para informar el código de salida a CloudFormation. La `CreationPolicy` se utiliza para garantizar que la instancia está configurada correctamente antes de que se dé por finalizada la creación de la pila.

La propiedad `ImageId` utiliza un parámetro público de Systems Manager Parameter Store para recuperar automáticamente el último ID de AMI del Windows Server de 2022. Este enfoque elimina la necesidad de mapeos de AMI específicos de la región y garantiza que usted siempre obtenga la AMI más reciente. El uso de parámetros de Systems Manager para los ID de AMI es una práctica recomendada para mantener las referencias de AMI actuales. Si planea conectarse a su instancia, asegúrese de que la propiedad `SecurityGroupIds` haga referencia a un grupo de seguridad que permita el acceso RDP.

La `CreationPolicy` se declara como parte de las propiedades del recurso y especifica un periodo de tiempo de espera. El comando `cfn-signal` en las señales de datos de usuario indica cuándo se ha completado la configuración de la instancia:

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Properties:
    # ... other properties ...
```

Como el proceso de arranque es mínimo y solo crea archivos e inicia los servicios, la `CreationPolicy` espera 20 minutos (PT20M) antes de que se agote el tiempo de espera. El tiempo de espera se especifica mediante el formato de duración ISO 8601. Tenga en cuenta que las instancias de Windows suelen tardar más en lanzarse que las instancias de Linux, por lo que debe realizar pruebas exhaustivas para determinar los valores de tiempo de espera más adecuados para sus necesidades.

Si todo va bien, la `CreationPolicy` se completa correctamente y usted puede acceder a la instancia del Windows Server mediante su dirección IP pública. Una vez completada la creación de la pila, el ID de la instancia y la dirección IP aparecerán en la pestaña **Salidas** de la consola de CloudFormation. 

```
Outputs:
  InstanceId:
    Value: !Ref TestInstance
    Description: Instance ID of the Windows Server
  PublicIP:
    Value: !GetAtt TestInstance.PublicIp
    Description: Public IP address of the Windows Server
```

También puede comprobar manualmente que el arranque ha funcionado correctamente conectándote a la instancia mediante RDP y comprobando que el archivo `C:\cfn\test.txt` existe y contiene el contenido esperado. Para obtener información acerca de cómo conectarse a una instancias de Windows, consulte [Conexión a la instancia de Windows mediante RDP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connecting_to_windows_instance.html) en la *Guía del usuario de Amazon EC2*.

## Evite las barras invertidas en las rutas de los archivos de Windows
<a name="cfn-windows-stacks-escape-backslashes"></a>

Al hacer referencia a las rutas de Windows en las plantillas de CloudFormation, recuerde siempre evitar correctamente las barras invertidas (`\`) según el formato de plantilla que utilice.
+ En el caso de las plantillas JSON, debe usar barras invertidas dobles en las rutas de los archivos de Windows, ya que JSON trata a la barra invertida como un carácter de escape. La primera barra invertida escapa a la segunda, lo que da como resultado la interpretación de una sola barra invertida literal.

  ```
  "commands" : {
    "1-extract" : {
      "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
    }
  }
  ```
+ En el caso de las plantillas YAML, las barras invertidas únicas suelen ser suficientes.

  ```
  commands:
    1-extract:
      command: C:\SharePoint\SharePointFoundation2010.exe /extract:C:\SharePoint\SPF2010 /quiet /log:C:\SharePoint\SharePointFoundation2010-extract.log
  ```

## Administración de servicios de Windows
<a name="cfn-windows-stacks-manage-windows-services"></a>

Puede administrar los servicios de Windows de la misma forma que los servicios de Linux, salvo que use una clave `windows` en lugar de `sysvinit`. El siguiente ejemplo inicia el servicio `cfn-hup`, lo establece en automático y reinicia el servicio si `cfn-init` modifica los archivos de configuración `c:\cfn\cfn-hup.conf` o `c:\cfn\hooks.d\cfn-auto-reloader.conf`.

```
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

Puede administrar otros servicios de Windows de la misma forma mediante el nombre, no el nombre de visualización, para hacer referencia al servicio.

## Cómo solucionar problemas de creación de pila
<a name="cfn-windows-stacks-troubleshooting"></a>

Si la pila falla durante la creación, el comportamiento predeterminado es de restauración en caso de error. Mientras que normalmente dicho comportamiento es bueno, ya que evita gastos innecesarios, dificulta la depuración de por qué falla la creación de la pila.

Para desactivar este comportamiento al crear o actualizar la pila con la consola de CloudFormation, seleccione la opción **Preservar los recursos aprovisionados correctamente** en **Opciones de error de pila**. Para obtener más información, consulte [Elija cómo gestionar los errores al aprovisionar recursos](stack-failure-options.md). Esto le permite iniciar sesión en la instancia y ver el archivo de registros para identificar los problemas encontrados al ejecutar sus scripts de arranque.

Es importante fijarse en estos registros:
+ El registro de configuración de EC2 en `%ProgramData%\Amazon\EC2Launch\log\agent.log`
+ El registro **cfn-init** en `C:\cfn\log\cfn-init.log` (comprueba los códigos de salida y los mensajes de error para ver si hay puntos de fallo específicos)

Para obtener más registros, consulte los siguientes temas en la *Guía del usuario de Amazon EC2*:
+ [EC2Launch Estructura de directorios de](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2config-service.html#UsingConfigXML_WinAMI)
+ [EC2Launch Estructura de directorios de v](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html#ec2launch-v2-directory)

Para obtener más información sobre la solución de problemas de arranque, consulte [¿Cómo se solucionan los problemas de los scripts auxiliares que no se inician en una pila de CloudFormation con instancias de Windows?](https://repost.aws/knowledge-center/cloudformation-helper-scripts-windows).

# Amplíe las capacidades de su plantilla con los tipos de recursos proporcionados por CloudFormation
<a name="cloudformation-supplied-resource-types"></a>

CloudFormation ofrece varios tipos de recursos que puede usar en las plantillas de pila para ampliar sus capacidades más allá de las de una plantilla de pila simple.

Estos tipos de recursos incluyen:


| Tipo de recurso | Descripción | Documentación | 
| --- | --- | --- | 
|  Recursos personalizados  |  El tipo de recurso `AWS::CloudFormation::CustomResource` permite crear recursos personalizados capaces de realizar tareas de aprovisionamiento específicas o incluir recursos que no están disponibles como tipos de recursos de CloudFormation.  |  [Recursos personalizados](template-custom-resources.md) | 
|  Macros  |  El tipo de recurso `AWS::CloudFormation::Macro` define una pieza de código reutilizable capaz de realizar procesamientos personalizados en plantillas de CloudFormation. Las macros pueden modificar las plantillas, generar recursos adicionales o realizar otras operaciones personalizadas durante la creación o las actualizaciones de las pilas.  | [Macros de plantillas](template-macros.md) | 
|  Pilas anidadas  |  El tipo de recurso `AWS::CloudFormation::Stack` permite crear pilas anidadas en las plantillas de CloudFormation para obtener arquitecturas de pilas más modulares y reutilizables.  | [Pilas anidadas](using-cfn-nested-stacks.md) | 
|  StackSet  |  El tipo de recurso `AWS::CloudFormation::StackSet` crea o actualiza un StackSet de CloudFormation, que es un contenedor de pilas que se pueden implementar en varias Cuentas de AWS y regiones.  | [Administración de pilas con StackSets](what-is-cfnstacksets.md) | 
|  Condición de espera  |  El tipo de recurso `AWS::CloudFormation::WaitCondition` detiene la creación o actualización de la pila hasta que se cumpla una condición específica, como la finalización satisfactoria de un proceso prolongado o la disponibilidad de recursos externos.   | [Condiciones de espera](using-cfn-waitcondition.md) | 
|  Identificador de condición de espera  |  El tipo de recurso `AWS::CloudFormation::WaitConditionHandle` funciona conjuntamente con el tipo de recurso `AWS::CloudFormation::WaitCondition`. Proporciona una URL prefirmada que se utiliza para enviar señales que indican que se ha cumplido una condición específica. Estas señales permiten continuar con el proceso de creación o actualización de la pila.  | [Condiciones de espera](using-cfn-waitcondition.md) | 

# Crear una lógica de aprovisionamiento personalizada con recursos personalizados
<a name="template-custom-resources"></a>

Los recursos personalizados le permiten escribir la lógica de aprovisionamiento personalizada en sus plantillas de CloudFormation y hacer que CloudFormation la ejecute cada vez que cree, actualice (si ha cambiado el recurso personalizado) o elimine una pila. Esto puede resultar útil cuando sus requisitos de aprovisionamiento implican una lógica compleja o flujos de trabajo que no se pueden expresar con los tipos de recursos integrados de CloudFormation.

Por ejemplo, es posible que desee incluir recursos que no están disponibles como tipos de recursos de CloudFormation. Puede incluir esos recursos usando recursos personalizados. De esta forma, puede seguir administrando todos los recursos relacionados en una sola pila.

Para definir un recurso personalizado en su plantilla de CloudFormation, se usan los tipos de recurso `AWS::CloudFormation::CustomResource` o `Custom::MyCustomResourceTypeName`. Los recursos personalizados requieren una propiedad, el token de servicio, que especifica a dónde envía CloudFormation las solicitudes, como un tema de Amazon SNS o una función de Lambda.

En los siguientes temas se proporciona información sobre cómo utilizar recursos personalizados.

**Topics**
+ [Cómo funcionan los recursos personalizados](#how-custom-resources-work)
+ [Tiempo de espera de respuesta](#response-timeout)
+ [Referencia de solicitud y respuesta de recursos personalizados de CloudFormation](crpg-ref.md)
+ [Recursos personalizados y respaldados por Amazon SNS](template-custom-resources-sns.md)
+ [Recursos personalizados y respaldados por Lambda](template-custom-resources-lambda.md)

**nota**  
El registro de CloudFormation y los recursos personalizados ofrecen sus propias ventajas. Los recursos personalizados ofrecen las siguientes ventajas:  
No es necesario registrar el recurso.
Puede incluir un recurso completo como parte de una plantilla sin necesidad de registrarse.
Son compatibles con las operaciones `Create`, `Update` y `Delete`.
Entre las ventajas de los recursos basados en el registro se encuentran:  
Compatibilidad con el modelado, el aprovisionamiento y la administración de recursos de aplicaciones de terceros
Compatibilidad con las operaciones `Create`, `Read`, `Update`, `Delete` y `List` (`CRUDL`)
Compatibilidad con la detección de desviaciones en tipos de recursos privados y de terceros
A diferencia de los recursos personalizados, los recursos basados en registros no necesitarán asociar un tema de Amazon SNS o una función de Lambda para realizar operaciones `CRUDL`. Para obtener más información, consulte [Administración de extensiones a través del registro de CloudFormation](registry.md).

## Cómo funcionan los recursos personalizados
<a name="how-custom-resources-work"></a>

El proceso general para configurar un nuevo recurso personalizado incluye los siguientes pasos. Estos pasos implican dos funciones: el *proveedor de recursos personalizados*, que es el propietario del recurso personalizado, y el *desarrollador de plantillas*, que crea una plantilla que incluye un tipo de recurso personalizado. Puede ser la misma persona, pero si no lo es, el proveedor de recursos personalizados debe colaborar con el desarrollador de plantillas.

1. El proveedor de recursos personalizados escribe una lógica que determina cómo gestionar las solicitudes de CloudFormation y llevar a cabo acciones en el recurso personalizado. 

1. El proveedor de recursos personalizados crea el tema de Amazon SNS o la función de Lambda a la que CloudFormation puede enviar solicitudes. El tema de Amazon SNS o la función de Lambda deben estar en la misma región en la que se creará la pila.

1. El proveedor de recursos personalizados proporciona el ARN del tema de Amazon SNS o el ARN de la función de Lambda al desarrollador de plantillas.

1. El desarrollador de plantillas define el recurso personalizado en su plantilla de CloudFormation. Esto incluye un token de servicio y los parámetros de datos de entrada. El proveedor de recursos personalizados define el token de servicio y la estructura de los datos de entrada. El token de servicio, que siempre es obligatorio, especifica el ARN del tema de Amazon SNS o el ARN de la función de Lambda. Los datos de entrada son opcionales según el recurso personalizado.

Ahora, cada vez que se utiliza la plantilla para crear, actualizar o eliminar el recurso personalizado, CloudFormation envía una solicitud al token de servicio especificado y espera una respuesta antes de proceder con la operación de la pila. 

A continuación, se resume el flujo de creación de una pila a partir de la plantilla: 

1. CloudFormation envía una solicitud al token de servicio especificado. La solicitud incluye información como el tipo de solicitud y una URL prefirmada de bucket de Amazon S3, donde el recurso personalizado envía sus respuestas. Para obtener más información acerca de lo que se incluye en la solicitud, consulte [Referencia de solicitud y respuesta de recursos personalizados de CloudFormation](crpg-ref.md).

   A continuación, se presenta un ejemplo de los datos que CloudFormation incluye en una solicitud de `Create`: En este ejemplo, `ResourceProperties` permite a CloudFormation crear una carga personalizada que se enviará a la función de Lambda.

   ```
   {
      "RequestType" : "Create",
      "RequestId" : "unique id for this create request",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::TestResource",
      "LogicalResourceId" : "MyTestResource",
      "ResourceProperties" : {
         "Name" : "Value",
         "List" : [ "1", "2", "3" ]
      }
   }
   ```

1. El proveedor de recursos personalizados procesa la solicitud de CloudFormation y devuelve una respuesta `SUCCESS` o `FAILED` a la URL prefirmada. custom resource provider proporciona la respuesta en un archivo con formato JSON y la carga a la URL de S3 prefirmada. Para obtener más información, consulte [Carga de objetos con URL prefirmadas](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html) en la *Guía para usuarios de Amazon Simple Storage Service*.

   En la respuesta, el custom resource provider también puede incluir pares de nombre-valor a los que el template developer puede obtener acceso. Por ejemplo, la respuesta puede incluir datos de salida si la solicitud ha funcionado o un mensaje de error si ha fallado. Para obtener más información acerca de las respuestas, consulte [Referencia de solicitud y respuesta de recursos personalizados de CloudFormation](crpg-ref.md).
**importante**  
Si los pares nombre-valor contienen información confidencial, debe usar el campo `NoEcho` para enmascarar la salida del recurso personalizado. De lo contrario, los valores son visibles a través de las API que muestran valores de propiedades (como `DescribeStackEvents`).  
Para obtener más información sobre el uso de `NoEcho` para enmascarar información confidencial, consulte la práctica recomendada de [No integre credenciales en sus plantillas](security-best-practices.md#creds).

   custom resource provider es responsable de escuchar y responder a la solicitud. Por ejemplo, en el caso de las notificaciones de Amazon SNS, el proveedor de recursos personalizados debe escuchar las notificaciones que se envían al ARN de un tema específico y responder a ellas. CloudFormation espera y escucha una respuesta en la ubicación de la URL prefirmada.

   Los siguientes datos de ejemplo muestran lo que un recurso personalizado podría incluir en una respuesta:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique id for this create request",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MyTestResource",
      "PhysicalResourceId" : "TestResource1",
      "Data" : {
         "OutputName1" : "Value1",
         "OutputName2" : "Value2",
      }
   }
   ```

1. Después de obtener una respuesta `SUCCESS`, CloudFormation continúa con la operación de la pila. Si se recibe una respuesta `FAILED` o ninguna respuesta, la operación genera un error. Todo dato de salida del recurso personalizado se almacena en la ubicación de la URL prefirmada. El desarrollador de plantillas puede recuperar los datos usando la función [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt).

**nota**  
Si utiliza AWS PrivateLink, los recursos personalizados de la VPC deben tener acceso a buckets de S3 específicos de CloudFormation. Los recursos personalizados deben enviar las respuestas a una URL de Amazon S3 prefirmada. Si no pueden enviar respuestas a Amazon S3, CloudFormation no recibirá una respuesta y la operación de pila producirá un error. Para obtener más información, consulte [Acceso a CloudFormation a través de un punto de conexión de la interfaz (AWS PrivateLink)](vpc-interface-endpoints.md).

## Tiempo de espera de respuesta
<a name="response-timeout"></a>

El tiempo de espera predeterminado para un recurso personalizado es de 3600 segundos (1 hora). Si no se recibe una respuesta en este tiempo, la operación de la pila se considerará fallida.

Puede ajustar el valor del tiempo de espera en función del tiempo que estime que tomará la respuesta del recurso personalizado. Por ejemplo, al aprovisionar un recurso personalizado que invoca una función de Lambda y se espera que responda en cinco minutos, puede establecer un tiempo de espera de cinco minutos en la plantilla de la pila al especificar la propiedad `ServiceTimeout`. Para obtener más información, consulte [Referencia de solicitud y respuesta de recursos personalizados de CloudFormation](crpg-ref.md). De esta forma, si hay un error en la función de Lambda que provoca que se bloquee, CloudFormation no podrá realizar la operación de la pila después de cinco minutos, en lugar de esperar toda una hora. 

Sin embargo, procure no establecer un valor de tiempo de espera demasiado bajo. Para evitar tiempos de espera inesperados, asegúrese de que su recurso personalizado disponga de tiempo suficiente para completar las acciones necesarias y devolver una respuesta.

# Referencia de solicitud y respuesta de recursos personalizados de CloudFormation
<a name="crpg-ref"></a>

CloudFormation administra los recursos personalizados mediante un protocolo de solicitud-respuesta que se comunica con su proveedor de recursos personalizados. Cada solicitud incluye un tipo de solicitud (`Create`, `Update` o `Delete`) y sigue este flujo de trabajo de alto nivel:

1. Un desarrollador de plantillas define un recurso personalizado con un `ServiceToken` y `ServiceTimeout` en la plantilla e inicia una operación de pila.

1. CloudFormation envía una solicitud JSON al proveedor de recursos personalizados a través de SNS o Lambda.

1. El proveedor de recursos personalizados procesa la solicitud y devuelve una respuesta JSON a una URL de bucket de Amazon S3 prefirmada antes de que venza el tiempo de espera.

1. CloudFormation lee la respuesta y continúa con la operación de la pila. Si no se recibe respuesta alguna antes de que finalice el tiempo de espera, se considera que la solicitud no se ha realizado en la forma correcta y la operación de la pila fallará.

Para obtener más información, consulte [Cómo funcionan los recursos personalizados](template-custom-resources.md#how-custom-resources-work).

En esta sección se describen la estructura, los parámetros y las respuestas esperadas para cada tipo de solicitud.

**nota**  
El tamaño total del cuerpo de la respuesta no puede superar los 4096 bytes.

## Configuración de la plantilla
<a name="crpg-ref-template-setup"></a>

Al definir un recurso personalizado en una plantilla, el desarrollador de la plantilla utiliza [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html) con las siguientes propiedades:

`ServiceToken`  
Un ARN de tema de Amazon SNS o un ARN de función de Lambda de la misma región que la pila.  
*Obligatorio*: sí  
*Tipo:* cadena

`ServiceTimeout`  
El tiempo máximo, en segundos, antes de que una operación de recurso personalizado agote el tiempo de espera. Este valor debe estar entre 1 y 3600. Valor predeterminado: 3600 segundos (1 hora).  
*Obligatorio*: no  
*Tipo:* cadena

Se admiten las propiedades del recurso adicional. Las propiedades de los recursos se incluirán como `ResourceProperties` en la solicitud. El proveedor de recursos personalizados debe determinar qué propiedades son válidas y sus valores aceptables.

## Objeto de solicitud
<a name="crpg-ref-requesttypes"></a>

------
#### [ Create ]

Cuando el desarrollador de la plantilla crea una pila que contiene un recurso personalizado, CloudFormation envía una solicitud con `RequestType` establecido en `Create`.

Cree solicitudes que contengan los siguientes campos:

`RequestType`  
`Create`.  
*Obligatorio*: sí  
*Tipo:* cadena

`RequestId`  
Un ID único para la solicitud.  
La combinación de `StackId` con `RequestId` forma un valor que puede usar para identificar de forma única una solicitud en un recurso personalizado en particular.  
*Obligatorio*: sí  
*Tipo:* cadena

`StackId`  
El nombre de recurso de Amazon (ARN) que identifica la pila que contiene el recurso personalizado.  
La combinación de `StackId` con `RequestId` forma un valor que puede usar para identificar de forma única una solicitud en un recurso personalizado en particular.  
*Obligatorio*: sí  
*Tipo:* cadena

`ResponseURL`  
La URL de respuesta identifica un bucket de S3 prefirmado que recibe respuestas del proveedor de recursos personalizados para CloudFormation.  
*Obligatorio*: sí  
*Tipo:* cadena

`ResourceType`  
El tipo de recurso elegido por el desarrollador de plantillas del recurso personalizado en la plantilla de CloudFormation. Los nombres de tipos de recursos personalizados pueden tener una longitud máxima de 60 caracteres y pueden incluir caracteres alfanuméricos y los siguientes caracteres: `_@-`.  
*Obligatorio*: sí  
*Tipo:* cadena

`LogicalResourceId`  
El nombre elegido por el desarrollador de la plantilla (ID lógico) del recurso personalizado en la plantilla de CloudFormation.  
*Obligatorio*: sí  
*Tipo:* cadena

`ResourceProperties`  
Este campo contiene el contenido del objeto `Properties` enviado por el desarrollador de la plantilla. El proveedor de recursos personalizado define su contenido.  
*Obligatorio*: no  
*Tipo*: objeto JSON

*Ejemplo*

```
{
   "RequestType" : "Create",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-create-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Update ]

Cuando el desarrollador de la plantilla realiza cambios en las propiedades de un recurso personalizado dentro de la plantilla y actualiza la pila, CloudFormation envía una solicitud al proveedor del recurso personalizado con `RequestType` establecido en `Update`. Esto significa que el código de su recurso personalizado no tiene que detectar cambios en los recursos, porque sabe que sus propiedades cambiaron cuando el tipo de solicitud es `Update`.

Actualice solicitudes que contengan los siguientes campos:

`RequestType`  
`Update`.  
*Obligatorio*: sí  
*Tipo:* cadena

`RequestId`  
Un ID único para la solicitud.  
La combinación de `StackId` con `RequestId` forma un valor que puede usar para identificar de forma única una solicitud en un recurso personalizado en particular.  
*Obligatorio*: sí  
*Tipo:* cadena

`StackId`  
El nombre de recurso de Amazon (ARN) que identifica la pila que contiene el recurso personalizado.  
La combinación de `StackId` con `RequestId` forma un valor que puede usar para identificar de forma única una solicitud en un recurso personalizado en particular.  
*Obligatorio*: sí  
*Tipo:* cadena

`ResponseURL`  
La URL de respuesta identifica un bucket de S3 prefirmado que recibe respuestas del proveedor de recursos personalizados para CloudFormation.  
*Obligatorio*: sí  
*Tipo:* cadena

`ResourceType`  
El tipo de recurso elegido por el desarrollador de plantillas del recurso personalizado en la plantilla de CloudFormation. Los nombres de tipos de recursos personalizados pueden tener una longitud máxima de 60 caracteres y pueden incluir caracteres alfanuméricos y los siguientes caracteres: `_@-`. No puede cambiar el tipo durante una actualización.  
*Obligatorio*: sí  
*Tipo:* cadena

`LogicalResourceId`  
El nombre elegido por el desarrollador de la plantilla (ID lógico) del recurso personalizado en la plantilla de CloudFormation.  
*Obligatorio*: sí  
*Tipo:* cadena

`PhysicalResourceId`  
Un ID físico definido por el proveedor de recursos personalizados que es exclusivo de dicho proveedor.  
*Obligatorio*: sí  
*Tipo:* cadena

`ResourceProperties`  
Este campo contiene el contenido del objeto `Properties` enviado por el desarrollador de la plantilla. El proveedor de recursos personalizado define su contenido.  
*Obligatorio*: no  
*Tipo*: objeto JSON

`OldResourceProperties`  
Usado solo para solicitudes `Update`. Los valores de propiedades de recursos declarados con anterioridad por el desarrollador de plantillas en la plantilla de CloudFormation.  
*Obligatorio*: sí  
*Tipo*: objeto JSON

*Ejemplo*

```
{
   "RequestType" : "Update",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-update-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "new-string",
      "key2" : [ "new-list" ],
      "key3" : { "key4" : "new-map" }
   },
   "OldResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Delete ]

Cuando el desarrollador de la plantilla elimina la pila o elimina el recurso personalizado de la pila y, a continuación, actualiza la pila, CloudFormation envía una solicitud con `RequestType` establecido en `Delete`.

Elimine las solicitudes que contienen los siguientes campos:

`RequestType`  
`Delete`.  
*Obligatorio*: sí  
*Tipo:* cadena

`RequestId`  
Un ID único para la solicitud.  
*Obligatorio*: sí  
*Tipo:* cadena

`StackId`  
El nombre de recurso de Amazon (ARN) que identifica la pila que contiene el recurso personalizado.  
*Obligatorio*: sí  
*Tipo:* cadena

`ResponseURL`  
La URL de respuesta identifica un bucket de S3 prefirmado que recibe respuestas del proveedor de recursos personalizados para CloudFormation.  
*Obligatorio*: sí  
*Tipo:* cadena

`ResourceType`  
El tipo de recurso elegido por el desarrollador de plantillas del recurso personalizado en la plantilla de CloudFormation. Los nombres de tipos de recursos personalizados pueden tener una longitud máxima de 60 caracteres y pueden incluir caracteres alfanuméricos y los siguientes caracteres: `_@-`.  
*Obligatorio*: sí  
*Tipo:* cadena

`LogicalResourceId`  
El nombre elegido por el desarrollador de la plantilla (ID lógico) del recurso personalizado en la plantilla de CloudFormation.  
*Obligatorio*: sí  
*Tipo:* cadena

`PhysicalResourceId`  
Un ID físico definido por el proveedor de recursos personalizados que es exclusivo de dicho proveedor.  
*Obligatorio*: sí  
*Tipo:* cadena

`ResourceProperties`  
Este campo contiene el contenido del objeto `Properties` enviado por el desarrollador de la plantilla. El proveedor de recursos personalizado define su contenido.  
*Obligatorio*: no  
*Tipo*: objeto JSON

*Ejemplo*

```
{
   "RequestType" : "Delete",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-delete-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------

## Objeto de respuesta
<a name="crpg-ref-responses"></a>

El proveedor de recursos personalizados envía una respuesta a la URL prefirmada para todos los tipos de recursos. Si el proveedor de recursos personalizados no envía una respuesta, CloudFormation espera hasta que se agote el tiempo de espera de la operación.

La respuesta debe ser un objeto JSON con los campos siguientes:

`Status`  
Debe ser `SUCCESS` o `FAILED`.  
*Obligatorio*: sí  
*Tipo:* cadena

`RequestId`  
Un ID único para la solicitud. Copie este valor exactamente como aparece en la solicitud.  
*Obligatorio*: sí  
*Tipo:* cadena

`StackId`  
El nombre de recurso de Amazon (ARN) que identifica la pila que contiene el recurso personalizado. Copie este valor exactamente como aparece en la solicitud.  
*Obligatorio*: sí  
*Tipo:* cadena

`LogicalResourceId`  
El nombre elegido por el desarrollador de la plantilla (ID lógico) del recurso personalizado en la plantilla de CloudFormation. Copie este valor exactamente como aparece en la solicitud.  
*Obligatorio*: sí  
*Tipo:* cadena

`PhysicalResourceId`  
Este valor debe ser un identificador exclusivo del proveedor de recursos personalizados y puede tener un tamaño máximo de 1 KB. El valor debe ser una cadena que no esté vacía y debe ser idéntica para todas las respuestas del mismo recurso.  
Al actualizar los recursos personalizados, el valor devuelto para `PhysicalResourceId` determina el comportamiento de la actualización. Si el valor devuelto es el mismo, CloudFormation lo considera una actualización normal. Si el valor cambia, CloudFormation interpreta la actualización como un reemplazo y envía una solicitud de eliminación al antiguo recurso. Para obtener más información, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).  
*Obligatorio*: sí  
*Tipo:* cadena

`Reason`  
Describe el motivo de una respuesta de error.  
Obligatorio si `Status` es `FAILED`. De lo contrario, es opcional.  
*Obligatorio*: condicional  
*Tipo:* cadena

`NoEcho`  
Indique si se enmascara la salida del recurso personalizado cuando se recupera con la función `Fn::GetAtt`. Si se establece en `true`, todos los valores devueltos se enmascaran con asteriscos (\$1\$1\$1\$1\$1), *excepto los almacenados en la sección `Metadata` de la plantilla*. CloudFormation no transforma, modifica ni redacta ninguna información que incluya en la sección `Metadata`. El valor predeterminado es `false`.  
Para obtener más información sobre el uso de `NoEcho` para enmascarar información confidencial, consulte la práctica recomendada de [No integre credenciales en sus plantillas](security-best-practices.md#creds).  
Disponible solo para respuestas `Create` y `Update`. No se admite para las respuestas `Delete`.  
*Obligatorio*: no  
*Tipo*: booleano

`Data`  
Los pares de nombre-valor definidos por el proveedor de recursos personalizados que se enviarán con la respuesta. Puede acceder a los valores proporcionados aquí por nombre en la plantilla con `Fn::GetAtt`.  
Disponible solo para respuestas `Create` y `Update`. No se admite para las respuestas `Delete`.  
Si los pares nombre-valor contienen información confidencial, debe usar el campo `NoEcho` para enmascarar la salida del recurso personalizado. De lo contrario, los valores son visibles a través de las API que muestran valores de propiedades (como `DescribeStackEvents`).
*Obligatorio*: no  
*Tipo*: objeto JSON

### Ejemplos de respuestas satisfactorias
<a name="crpg-ref-success-response-examples"></a>

#### Respuesta `Create` y `Update`
<a name="crpg-ref-success-response-example-1"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id",
   "NoEcho": true,
   "Data": {
      "key1": "value1",
      "key2": "value2"
   }
}
```

#### `Delete`Respuesta de
<a name="crpg-ref-success-response-example-2"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id"
}
```

### Respuesta de ejemplo con error
<a name="crpg-ref-failed-response-example"></a>

```
{
   "Status": "FAILED",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id",
   "PhysicalResourceId": "provider-defined-physical-id",
   "Reason": "Required failure reason string"
}
```

# Recursos personalizados y respaldados por Amazon SNS
<a name="template-custom-resources-sns"></a>

En el siguiente tema se muestra cómo configurar un recurso personalizado con un token de servicio que especifica el tema de Amazon SNS al que CloudFormation envía las solicitudes. También aprenderá la secuencia de eventos y mensajes enviados y recibidos como resultado de la creación, las actualizaciones y la eliminación de pilas de recursos personalizados.

Con los recursos personalizados y Amazon SNS, puede habilitar escenarios como añadir nuevos recursos a una pila e inyectar datos dinámicos a una pila. Por ejemplo, al crear una pila, CloudFormation puede enviar una solicitud `Create` a un tema supervisado por una aplicación que se ejecute en una instancia de Amazon EC2. La notificación de Amazon SNS activa la aplicación para llevar a cabo tareas de aprovisionamiento adicionales, como recuperar un grupo de IP elásticas de direcciones IP. Después de este proceso, la aplicación envía una respuesta (y los datos de salida) que le notifica a CloudFormation que puede seguir con la operación de la pila.

Cuando se especifica un tema de Amazon SNS como destino de un recurso personalizado, CloudFormation envía mensajes al tema de SNS especificado durante las operaciones de pila que involucran el recurso personalizado. Para procesar estos mensajes y realizar las acciones necesarias, debe tener un punto de conexión compatible suscrito al tema de SNS.

Para obtener una introducción a los recursos personalizados y a su funcionamiento, consulte [Cómo funcionan los recursos personalizados](template-custom-resources.md#how-custom-resources-work). Para obtener más información sobre Amazon SNS y su funcionamiento, consulte la [Guía para desarrolladores de Amazon Simple Notification Service](https://docs.aws.amazon.com/sns/latest/dg/).

## Uso de Amazon SNS para crear recursos personalizados
<a name="walkthrough-custom-resources-sns-adding-nonaws-resource"></a>

**Topics**
+ [Paso 1: Creación de una pila](#crpg-walkthrough-stack-creation)
+ [Paso 2: Actualizaciones de pila](#crpg-walkthrough-stack-updates)
+ [Paso 3: Eliminación de pila](#crpg-walkthrough-stack-deletion)

### Paso 1: Creación de una pila
<a name="crpg-walkthrough-stack-creation"></a>

1. <a name="crpg-walkthrough-stack-creation-customer-template"></a>El desarrollador de plantillas crea una pila de CloudFormation que contiene un recurso personalizado. 

   En el siguiente ejemplo de plantilla, usamos el nombre de tipo de recurso personalizado `Custom::SeleniumTester` para el recurso personalizado con ID lógico `MySeleniumTest`. Los nombres del tipo de recurso personalizado deben ser alfanuméricos y pueden tener una longitud máxima de 60 caracteres. 

   El tipo de recurso personalizado se declara con un token de servicio, propiedades específicas de proveedores opcionales y atributos [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt) opcionales que define el proveedor de recursos personalizados. Se pueden usar estas propiedades y atributos para pasar a la información del template developer a custom resource provider y viceversa. El token de servicio especifica un tema de Amazon SNS que el proveedor de recursos ha configurado.

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "MySeleniumTest" : {
            "Type": "Custom::SeleniumTester",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest",
               "seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
            }
         }
      },
      "Outputs" : {
         "topItem" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
         },
         "numRespondents" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
         }
      }
   }
   ```
**nota**  
Los nombres y los valores de los datos a los que se accede con `Fn::GetAtt` los devuelve el proveedor de recursos personalizados durante la respuesta del proveedor a CloudFormation. Si custom resource provider es de terceros, template developer debe obtener los nombres de estos valores de devolución desde custom resource provider.

1. <a name="crpg-walkthrough-stack-creation-provider-request"></a>CloudFormation envía una notificación de Amazon SNS al proveedor de recursos con un `"RequestType" : "Create"` que contiene información sobre la pila, las propiedades de recursos personalizados de la plantilla de pila y una URL de S3 para la respuesta.

   El tema de SNS que se usa para enviar la notificación está incrustado en la plantilla en la propiedad `ServiceToken`. Para evitar el uso de un valor codificado, un desarrollador de plantillas puede usar un parámetro de plantilla para que el valor se ingrese en el momento en que se lanza la pila.

   El siguiente ejemplo muestra una solicitud de recurso `Create` personalizado que incluye un nombre de tipo de recurso personalizado, `Custom::SeleniumTester`, creado con un `LogicalResourceId` de `MySeleniumTester`:

   ```
   {
      "RequestType" : "Create",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Para obtener información detallada sobre el objeto de solicitud de las solicitudes `Create`, consulte el tema [Referencia de solicitud y respuesta](crpg-ref.md).

1. <a name="crpg-walkthrough-stack-creation-provider-response"></a>El custom resource provider procesa los datos enviados por el template developer y determina si la solicitud `Create` se realizó correctamente. El proveedor de recursos usa luego la URL de S3 que CloudFormation ha enviado para remitir una respuesta `SUCCESS` o `FAILED`.

   En función del tipo de respuesta, CloudFormation esperará diferentes campos de respuesta. Para obtener información sobre los campos de respuesta de un tipo de solicitud concreto, consulte la documentación correspondiente a ese tipo de solicitud en la sección [Referencia de solicitud y respuesta](crpg-ref.md).

   En respuesta a una solicitud de creación o actualización, el proveedor de recursos personalizados puede devolver los elementos de datos en el campo `Data` de la respuesta. Estos son pares de nombre/valor y los *nombres* corresponden a los atributos `Fn::GetAtt` que se utilizan con el recurso personalizado de la plantilla de pila. Los *valores* son los datos que se devuelven cuando el desarrollador de la plantilla llama a `Fn::GetAtt` por el recurso con el nombre de atributo.

   El siguiente es un ejemplo de respuesta de recursos personalizados:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "Data" : {
         "resultsPage" : "http://www.myexampledomain/test-results/guid",
         "lastUpdate" : "2012-11-14T03:30Z"
      }
   }
   ```

   Para obtener información detallada sobre el objeto de respuesta de las solicitudes `Create`, consulte el tema [Referencia de solicitud y respuesta](crpg-ref.md).

   Los campos `StackId`, `RequestId` y `LogicalResourceId` deben copiarse textualmente de la solicitud.

1. <a name="crpg-walkthrough-stack-creation-stack-status"></a> CloudFormation declara el estado de pila como `CREATE_COMPLETE` o `CREATE_FAILED`. Si la pila se creó correctamente, el desarrollador de plantillas puede utilizar los valores de salida del recurso personalizado que se creó, accediendo a ellos con [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt).

   Por ejemplo, la plantilla de recursos personalizados empleados para ilustrar usó `Fn::GetAtt` para copiar salidas de recursos en las salidas de pila:

   ```
   "Outputs" : {
      "topItem" : {
         "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
      },
      "numRespondents" : {
         "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
      }
   }
   ```

### Paso 2: Actualizaciones de pila
<a name="crpg-walkthrough-stack-updates"></a>

Para actualizar una pila existente, debe enviar una plantilla que especifique las actualizaciones de las propiedades de recursos de la pila, tal y como se muestra en el ejemplo siguiente. CloudFormation actualiza únicamente los recursos que tengan los cambios especificados en la plantilla. Para obtener más información, consulte [Comprensión de los comportamientos de actualización de los recursos de la pila](using-cfn-updating-stacks-update-behaviors.md).

Puede actualizar los recursos personalizados que requieren una sustitución del recurso físico subyacente. Al actualizar un recurso personalizado en una plantilla de CloudFormation, CloudFormation envía una solicitud de actualización a dicho recurso personalizado. Si un recurso personalizado requiere una sustitución, el nuevo recurso personalizado debe enviar una respuesta con el nuevo ID físico. Cuando CloudFormation recibe la respuesta, compara el `PhysicalResourceId` entre los recursos personalizados antiguos y nuevos. Si son diferentes, CloudFormation reconoce la actualización como sustitución y envía una solicitud de eliminación al antiguo recurso, tal y como se muestra en [Paso 3: Eliminación de pila](#crpg-walkthrough-stack-deletion).

**nota**  
Si no realizó cambios en el recurso personalizado, CloudFormation no le enviará solicitudes durante la actualización de una pila.

1. <a name="crpg-walkthrough-stack-updates-customer-template"></a>template developer inicia una actualización de la pila que contiene un recurso personalizado. Durante una actualización, template developer puede especificar nuevas propiedades en la plantilla de pila.

   El siguiente es un ejemplo de `Update` para la plantilla de pila que usa un tipo de recurso personalizado:

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "MySeleniumTest" : {
            "Type": "Custom::SeleniumTester",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest",
               "seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
                  "http://mynewsite.com" ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
            }
         }
      },
      "Outputs" : {
         "topItem" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
         },
         "numRespondents" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
         }
      }
   }
   ```

1. <a name="crpg-walkthrough-stack-updates-provider-request"></a>CloudFormation envía una notificación de Amazon SNS al proveedor de recursos con un `"RequestType" : "Update"` que contiene información similar a la llamada `Create`, salvo que el campo `OldResourceProperties` contiene las propiedades del antiguo recurso y ResourceProperties contiene las del recurso actualizado (si existe).

   El siguiente es un ejemplo de una solicitud de `Update`:

   ```
   {
      "RequestType" : "Update",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      },
      "OldResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Para obtener información detallada sobre el objeto de solicitud de las solicitudes `Update`, consulte el tema [Referencia de solicitud y respuesta](crpg-ref.md).

1. <a name="crpg-walkthrough-stack-updates-provider-response"></a>El proveedor de recursos personalizados procesa los datos que CloudFormation envía. El recurso personalizado realiza la actualización y envía una respuesta `SUCCESS` o `FAILED` a la URL de S3. CloudFormation compara entonces los valores de `PhysicalResourceIDs` de los recursos personalizados antiguos y nuevos. Si son diferentes, CloudFormation reconoce que la actualización requiere una sustitución y envía una solicitud de eliminación al antiguo recurso. El siguiente ejemplo demuestra la respuesta de custom resource provider a una solicitud de `Update`.

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester2"
   }
   ```

   Para obtener información detallada sobre el objeto de respuesta de las solicitudes `Update`, consulte el tema [Referencia de solicitud y respuesta](crpg-ref.md).

   Los campos `StackId`, `RequestId` y `LogicalResourceId` deben copiarse textualmente de la solicitud.

1. <a name="crpg-walkthrough-stack-updates-stack-status"></a>CloudFormation declara el estado de pila como `UPDATE_COMPLETE` o `UPDATE_FAILED`. Si falla la actualización, la pila vuelve a su estado anterior. Si la pila se ha actualizado correctamente, template developer puede obtener acceso a cualquier nuevo valor de salida del recurso personalizado creado con `Fn::GetAtt`.

### Paso 3: Eliminación de pila
<a name="crpg-walkthrough-stack-deletion"></a>

1. <a name="crpg-walkthrough-stack-deletion-customer-template"></a>El desarrollador de plantillas elimina una pila que contiene un recurso personalizado. CloudFormation obtiene las propiedades actuales especificadas en la plantilla de pila junto con el tema de SNS y se prepara para realizar una solicitud al proveedor de recursos personalizados.

1. <a name="crpg-walkthrough-stack-deletion-provider-request"></a>CloudFormation envía una notificación de Amazon SNS al proveedor de recursos con un `"RequestType" : "Delete"` que contiene información actual sobre la pila, las propiedades de recursos personalizados de la plantilla de pila y una URL de S3 para la respuesta.

   Cuando se elimina una pila o se hace una actualización que elimina o sustituye el recurso personalizado, CloudFormation compara el valor de `PhysicalResourceId` de los recursos personalizados antiguos con los nuevos. Si son diferentes, CloudFormation reconoce la actualización como sustitución y envía una solicitud de eliminación para el recurso anterior (`OldPhysicalResource`), tal y como se muestra en el siguiente ejemplo de una solicitud `Delete`.

   ```
   {
      "RequestType" : "Delete",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      }
   }
   ```

   Para obtener información detallada sobre el objeto de solicitud de las solicitudes `Delete`, consulte el tema [Referencia de solicitud y respuesta](crpg-ref.md).

   `DescribeStackResource`, `DescribeStackResources` y `ListStackResources` muestran el nombre definido por el usuario en caso de que se haya especificado.

1. <a name="crpg-walkthrough-stack-deletion-provider-response"></a>El proveedor de recursos personalizados procesa los datos enviados por CloudFormation y determina si la solicitud `Delete` se realizó correctamente. El proveedor de recursos usa luego la URL de S3 que CloudFormation ha enviado para remitir una respuesta `SUCCESS` o `FAILED`. Para poder eliminar correctamente una pila con un recurso personalizado, el custom resource provider debe responder correctamente a una solicitud de eliminación.

   A continuación se muestra un ejemplo de respuesta de custom resource provider a una solicitud de `Delete`:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1"
   }
   ```

   Para obtener información detallada sobre el objeto de respuesta de las solicitudes `Delete`, consulte el tema [Referencia de solicitud y respuesta](crpg-ref.md).

   Los campos `StackId`, `RequestId` y `LogicalResourceId` deben copiarse textualmente de la solicitud.

1. <a name="crpg-walkthrough-stack-updates-stack-status-delete"></a>CloudFormation declara el estado de pila como `DELETE_COMPLETE` o `DELETE_FAILED`.

# Recursos personalizados y respaldados por Lambda
<a name="template-custom-resources-lambda"></a>

Al asociar una función de Lambda con un recurso personalizado, la función se invoca siempre que se crea, actualiza o elimina el recurso personalizado. CloudFormation llama a una API de Lambda para invocar la función y transferir todos los datos de la solicitud (como el tipo de solicitud y las propiedades de recursos) a la función. La potencia y la posibilidad de personalización de funciones de Lambda en combinación con CloudFormation permiten una amplia variedad de situaciones, como, por ejemplo, las búsquedas de ID de AMI de forma dinámica durante la creación de la pila o la implementación y el uso de las funciones de utilidad, tales como las funciones de reversión de cadenas.

Para obtener una introducción a los recursos personalizados y a su funcionamiento, consulte [Cómo funcionan los recursos personalizados](template-custom-resources.md#how-custom-resources-work).

**Topics**
+ [Explicación: cómo crear un mecanismo de retardo mediante un recurso personalizado respaldado por Lambda](walkthrough-lambda-backed-custom-resources.md)
+ [`cfn-response`Módulo de](cfn-lambda-function-code-cfnresponsemodule.md)

# Explicación: cómo crear un mecanismo de retardo mediante un recurso personalizado respaldado por Lambda
<a name="walkthrough-lambda-backed-custom-resources"></a>

En este tutorial, se muestra cómo configurar e inicializar un recurso personalizado respaldado por Lambda mediante una plantilla de muestra de CloudFormation. Esta plantilla crea un mecanismo de retraso que pausa las implementaciones de pilas durante un tiempo específico. Esto puede resultar útil cuando se necesita introducir retrasos deliberados durante el aprovisionamiento de recursos; por ejemplo, cuando se espera a que los recursos se estabilicen antes de que se creen los recursos dependientes.

**nota**  
Si bien anteriormente se recomendaban recursos personalizados respaldados por Lambda para recuperar los ID de AMI, ahora recomendamos usar parámetros AWS Systems Manager. Este enfoque hace que sus plantillas sean más reutilizables y fáciles de mantener. Para obtener más información, consulte [Obtención de un valor de texto sin formato del Almacén de parámetros de Systems Manager](dynamic-references-ssm.md). 

**Topics**
+ [Descripción general](#walkthrough-lambda-backed-custom-resources-overview)
+ [Plantilla de muestra](#walkthrough-lambda-backed-custom-resources-sample-template)
+ [Explicación de la plantilla de ejemplo](#walkthrough-lambda-backed-custom-resources-sample-template-walkthrough)
+ [Requisitos previos](#walkthrough-lambda-backed-custom-resources-prerequisites)
+ [Lanzamiento de la pila](#walkthrough-lambda-backed-custom-resources-createfunction-createstack)
+ [Saneamiento de recursos](#walkthrough-lambda-backed-custom-resources-createfunction-cleanup)
+ [Información relacionada](#w2aac11c45b9c24b9c23)

## Descripción general
<a name="walkthrough-lambda-backed-custom-resources-overview"></a>

La plantilla de pila de ejemplo utilizada en este tutorial crea un recurso personalizado respaldado por Lambda. Este recurso personalizado introduce un retraso configurable (60 segundos por defecto) durante la creación de la pila. El retraso se produce durante las actualizaciones de la pila solo cuando se modifican las propiedades del recurso personalizado.

Esta plantilla proporciona los siguientes recursos:
+ un recurso personalizado,
+ una función de Lambda y
+ un rol de IAM que permite a Lambda escribir registros en CloudWatch.

También define dos salidas:
+ El tiempo real que esperó la función.
+ Un identificador único generado durante cada ejecución de la función de Lambda.



**nota**  
CloudFormation es un servicio gratuito, pero Lambda cobra en función del número de solicitudes de sus funciones y del tiempo de ejecución de su código. Para obtener más información acerca de los precios de Lambda, consulte [Precios de AWS Lambda](https://aws.amazon.com/lambda/pricing/).

## Plantilla de muestra
<a name="walkthrough-lambda-backed-custom-resources-sample-template"></a>

A continuación, puede ver la plantilla de ejemplo de un recurso personalizado respaldado por Lambda con el mecanismo de retardo:

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-yaml"></a>

```
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
```

## Explicación de la plantilla de ejemplo
<a name="walkthrough-lambda-backed-custom-resources-sample-template-walkthrough"></a>

Los siguientes fragmentos explican partes relevantes de la plantilla de ejemplo que ayudan a comprender cómo la función de Lambda se asocia a un recurso personalizado y a entender la salida.

`CFNWaiter` del recurso [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)  
El recurso `AWS::Lambda::Function` especifica el código fuente de la función, el nombre del controlador, el entorno del tiempo de ejecución y el nombre de recurso de Amazon (ARN).  
La propiedad `Handler` está establecida en `index.handler`, ya que utiliza un código fuente de Python. Para obtener más información sobre los identificadores de controlador aceptados al usar código fuente de funciones en línea, consulte [AWS::Lambda::Function Code](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-zipfile).  
El `Runtime` se especifica como `python3.9`, ya que el archivo de origen está escrito en Python.  
El `Timeout` se establece en 900 segundos.  
La propiedad `Role` utiliza la función `Fn::GetAtt` para obtener el ARN del rol de ejecución `LambdaExecutionRole` que se declara en el recurso `AWS::IAM::Role` en la plantilla.  
La propiedad `Code` define el código de la función en línea mediante una función de Python. La función de Python en la plantilla de ejemplo hace lo siguiente:  
+ Crear un ID único utilizando el UUID
+ Verifica si se trata de una solicitud de creación o de actualización
+ Duerme durante el tiempo especificado por `ServiceTimeout` durante solicitudes de `Create` o `Update`
+ Devuelve el tiempo de espera y el identificador único

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-json"></a>

```
...
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-yaml"></a>

```
...
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
...
```

`LambdaExecutionRole` del recurso [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)  
El recurso `AWS::IAM:Role` crea un rol de ejecución para la función de Lambda, con una política de asunción que autoriza a Lambda a utilizar dicho rol. También contiene una política que permite el acceso a Registros de CloudWatch.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-json"></a>

```
...
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-yaml"></a>

```
...
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
...
```

`CFNWaiterCustomResource` de recurso [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)  
El recurso personalizado se vincula a la función de Lambda con su ARN mediante `!GetAtt CFNWaiter.Arn`. Establecerá un tiempo de espera de 60 segundos para las operaciones de creación y actualización, conforme a lo dispuesto en `ServiceTimeout`. El recurso solo se invocará para una operación de actualización si se modifican las propiedades.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-json"></a>

```
...
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-yaml"></a>

```
...
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
...
```

`Outputs`  
Esta plantilla produce como `Outputs` el `TimeWaited` y el `WaiterId`. El valor `TimeWaited` utiliza una función de `Fn::GetAtt` para indicar la cantidad de tiempo que el recurso de espera realmente esperó. El `WaiterId` utiliza una función de `Fn::GetAtt` para proporcionar el identificador único que se generó y se asoció a la ejecución.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-json"></a>

```
...
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-yaml"></a>

```
...
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
...
```

## Requisitos previos
<a name="walkthrough-lambda-backed-custom-resources-prerequisites"></a>

Se necesitan permisos de IAM para utilizar todos los servicios correspondientes, como Lambda y CloudFormation.

## Lanzamiento de la pila
<a name="walkthrough-lambda-backed-custom-resources-createfunction-createstack"></a>

**Para crear la pila**

1. Busque la plantilla que prefiera (YAML o JSON) en la sección [Plantilla de muestra](#walkthrough-lambda-backed-custom-resources-sample-template) y guárdela en la máquina con el nombre `samplelambdabackedcustomresource.template`.

1. Abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/).

1. En la página **Pilas**, seleccione **Crear pila** en la parte superior derecha y, a continuación, seleccione **Con recursos nuevos (estándar)**.

1. En **Requisito previo: preparar la plantilla**, elija **Seleccione una plantilla existente**.

1. En **Especificar plantilla**, seleccione **Cargar un archivo de plantilla** y, a continuación, elija **Elegir archivo**.

1. Seleccione el archivo de plantilla `samplelambdabackedcustomresource.template` que guardó anteriormente.

1. Elija **Siguiente**.

1. En **Nombre de la pila**, escriba **SampleCustomResourceStack** y, a continuación, elija **Siguiente**.

1. Para este tutorial, no tiene que añadir etiquetas ni especificar una configuración avanzada, así que elija **Next (Siguiente)**.

1. Verifique que el nombre de la pila sea correcto y luego seleccione **Crear**.

CloudFormation puede tardar varios minutos en crear la pila. Para monitorizar el progreso, vea los eventos de la pila. Para obtener más información, consulte [Visualización de la información de la pila desde la consola de CloudFormation](cfn-console-view-stack-data-resources.md).

Si se crea la pila correctamente, se crean todos los recursos de la pila, como la función Lambda y el recurso personalizado. Ha utilizado correctamente una función de Lambda y un recurso personalizado.

Si la función de Lambda devuelve un error, vea los registros de la función en la [consola](https://console.aws.amazon.com/cloudwatch/home#logs:) de Registros de CloudWatch. El nombre de la flujo de registros es el ID físico del recurso personalizado, que puede encontrar al visualizar los recursos de la pila. Para obtener más información, consulte la sección de [Visualización de datos de registro](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData) en la *Guía del usuario de Amazon CloudWatch*.

## Saneamiento de recursos
<a name="walkthrough-lambda-backed-custom-resources-createfunction-cleanup"></a>

Elimine la pila para limpiar todos los recursos de la pila que creó para que no se le cobren los recursos innecesarios.

**Para eliminar la pila**

1. En la consola de CloudFormation, elija la pila **SampleCustomResourceStack**.

1. Elija **Actions (Acciones)** y, a continuación, **Delete Stack (Eliminar pila)**.

1. En el mensaje de confirmación, elija **Yes, Delete (Sí, eliminar)**.

Se eliminan todos los recursos que creó.

Ahora que comprende cómo crear y utilizar un recurso personalizado respaldado por Lambda, puede utilizar la plantilla y el código de ejemplo de esta guía para crear y experimentar con otras pilas y funciones.

## Información relacionada
<a name="w2aac11c45b9c24b9c23"></a>
+ [Referencia de recursos personalizados de CloudFormation](crpg-ref.md)
+ [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)

# `cfn-response`Módulo de
<a name="cfn-lambda-function-code-cfnresponsemodule"></a>

En su plantilla de CloudFormation puede especificar una función de Lambda como destino de un recurso personalizado. Al utilizar la propiedad `ZipFile` para especificar el código fuente de la [función](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html), puede cargar el módulo `cfn-response` para enviar las respuestas desde su función de Lambda a un recurso personalizado. El módulo `cfn-response` es una biblioteca que simplifica el envío de respuestas al recurso personalizado que invocó la función de Lambda. El módulo tiene un método `send` que envía un [objeto de respuesta](crpg-ref.md#crpg-ref-responses) a un recurso personalizado mediante una URL prefirmada de Amazon S3 (`ResponseURL`).

El módulo `cfn-response` solo está disponible si utiliza la propiedad `ZipFile` para escribir el código fuente. No está disponible para el código fuente que se almacena en buckets de Amazon S3. Para un código de buckets de , debe escribir sus propias funciones para enviar respuestas.

**nota**  
Después de ejecutar el método `send`, la función de Lambda termina, así que todo lo que escriba después de este método se pasa por alto.

## Carga del módulo `cfn-response`
<a name="cfn-lambda-function-code-cfnresponsemodule-loading"></a>

Para las funciones de Node.js, utilice la función `require()` para cargar el módulo `cfn-response`. Por ejemplo, el siguiente ejemplo de código crea un objeto `cfn-response` con el nombre `response`:

```
var response = require('cfn-response');
```

Para Python, utilice la declaración `import` para cargar el módulo `cfnresponse`, tal y como se muestra en el ejemplo siguiente:

**nota**  
Utilice esta declaración de importación exacto. Si utiliza otras variantes de la instrucción de importación, CloudFormation no incluirá el módulo de respuesta.

```
import cfnresponse
```

## `send`Parámetros del método
<a name="cfn-lambda-function-code-cfnresponsemodule-send-parameters"></a>

Puede utilizar los siguientes parámetros con el método `send`.

`event`  
Los campos de una [solicitud de recurso personalizado](crpg-ref.md#crpg-ref-requesttypes).

`context`  
Un objeto, específico de las funciones de Lambda, que puede utilizar para especificar cuando la función y cualquier devolución de llamada han completado la ejecución o para obtener acceso a información desde el entorno de ejecución de Lambda. Para obtener más información, consulte [Creación de funciones de Lambda con Node.js](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html) en la *Guía para desarrolladores de AWS Lambda*.

`responseStatus`  
Independientemente de que la función se complete con éxito. Utilice las constantes del módulo `cfnresponse` para especificar el estado: `SUCCESS` para las ejecuciones de éxito y `FAILED` para ejecuciones fallidas.

`responseData`  
El campo `Data` de un [objeto de respuesta](crpg-ref.md#crpg-ref-responses) de recursos personalizados. Los datos consisten en una lista de pares de nombre y valor.

`physicalResourceId`  
Opcional. El identificador único del recurso personalizado que invocó la función. De forma predeterminada, el módulo utiliza el nombre de la secuencia de registros de Amazon CloudWatch Logs que se asocia a la función de Lambda.  
El valor devuelto para un `PhysicalResourceId` puede cambiar las operaciones de actualización de recursos personalizadas. Si el valor devuelto es el mismo, se considera una actualización normal. Si el valor devuelto es diferente, CloudFormation reconoce la actualización como un reemplazo y envía una solicitud de eliminación al antiguo recurso. Para obtener más información, consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).

`noEcho`  
Opcional. Indique si se enmascara la salida del recurso personalizado cuando se recupera con la función `Fn::GetAtt`. Si se establece en `true`, todos los valores devueltos se enmascaran con asteriscos (\$1\$1\$1\$1\$1), excepto la información almacenada en las ubicaciones especificadas a continuación. De forma predeterminada, este valor es `false`.  
El uso del atributo `NoEcho` no enmascara ninguna información almacenada en lo que se muestra a continuación:  
+ La sección de la plantilla `Metadata`. CloudFormation no transforma, modifica ni redacta ninguna información que incluya en la sección `Metadata`. Para obtener más información, consulte [Metadata](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ La sección de la plantilla `Outputs`. Para obtener más información, consulte [Salidas](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html).
+ El atributo `Metadata` de una definición de recurso. Para obtener más información, consulte [`Metadata` atributo](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Recomendamos encarecidamente que no utilice estos mecanismos para incluir información confidencial, como contraseñas o secretos.
Para obtener más información sobre el uso de `NoEcho` para enmascarar información confidencial, consulte la práctica recomendada de [No integre credenciales en sus plantillas](security-best-practices.md#creds).

## Ejemplos
<a name="cfn-lambda-function-code-cfnresponsemodule-examples"></a>

### Node.js
<a name="cfn-lambda-function-code-zipfile-examplenodejs"></a>

En el siguiente ejemplo Node.js, la función de Lambda en línea toma un valor de entrada y lo multiplica por 5. Las funciones en línea son especialmente útiles para las funciones más pequeñas, ya que le permiten especificar el código fuente directamente en la plantilla, en lugar de crear un paquete y cargarlo en un bucket de Amazon S3. La función utiliza el método `cfn-response` `send` para enviar el resultado de vuelta al recurso personalizado que invocó.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplenodejs.json"></a>

```
"ZipFile": { "Fn::Join": ["", [
  "var response = require('cfn-response');",
  "exports.handler = function(event, context) {",
  "  var input = parseInt(event.ResourceProperties.Input);",
  "  var responseData = {Value: input * 5};",
  "  response.send(event, context, response.SUCCESS, responseData);",
  "};"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplenodejs-yaml"></a>

```
ZipFile: >
  var response = require('cfn-response');
  exports.handler = function(event, context) {
    var input = parseInt(event.ResourceProperties.Input);
    var responseData = {Value: input * 5};
    response.send(event, context, response.SUCCESS, responseData);
  };
```

### Python
<a name="cfn-lambda-function-code-zipfile-examplepython"></a>

En el siguiente ejemplo de Python, la función de Lambda en línea toma un valor de entero y lo multiplica por 5.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplepython.json"></a>

```
"ZipFile" : { "Fn::Join" : ["\n", [
  "import json",
  "import cfnresponse",
  "def handler(event, context):",
  "   responseValue = int(event['ResourceProperties']['Input']) * 5",
  "   responseData = {}",
  "   responseData['Data'] = responseValue",
  "   cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, \"CustomResourcePhysicalID\")"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplepython.yaml"></a>

```
ZipFile: |
  import json
  import cfnresponse
  def handler(event, context):
    responseValue = int(event['ResourceProperties']['Input']) * 5
    responseData = {}
    responseData['Data'] = responseValue
    cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID")
```

## Código fuente del módulo
<a name="cfn-lambda-function-code-cfnresponsemodule-source"></a>

**Topics**
+ [Código fuente de Node.js asíncrono](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async)
+ [Código fuente de Node.js](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs)
+ [Código fuente Python](#cfn-lambda-function-code-cfnresponsemodule-source-python)

### Código fuente de Node.js asíncrono
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async"></a>

A continuación, se muestra el código fuente del módulo de respuesta para las funciones de Node.js si el controlador es asíncrono. Revíselo para entender qué hace el módulo y para obtener ayuda con la implementación de sus propias funciones de respuesta.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0

exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    return new Promise((resolve, reject) => {
        var responseBody = JSON.stringify({
            Status: responseStatus,
            Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
            PhysicalResourceId: physicalResourceId || context.logStreamName,
            StackId: event.StackId,
            RequestId: event.RequestId,
            LogicalResourceId: event.LogicalResourceId,
            NoEcho: noEcho || false,
            Data: responseData
        });

        console.log("Response body:\n", responseBody);

        var https = require("https");
        var url = require("url");

        var parsedUrl = url.parse(event.ResponseURL);
        var options = {
            hostname: parsedUrl.hostname,
            port: 443,
            path: parsedUrl.path,
            method: "PUT",
            headers: {
                "content-type": "",
                "content-length": responseBody.length
            }
        };

        var request = https.request(options, function(response) {
            console.log("Status code: " + parseInt(response.statusCode));
            resolve(context.done());
        });

        request.on("error", function(error) {
            console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
            reject(context.done(error));
        });

        request.write(responseBody);
        request.end();
    })
}
 
function maskCredentialsAndSignature(message) {
    return message.replace(/X-Amz-Credential=[^&\s]+/i, 'X-Amz-Credential=*****')
        .replace(/X-Amz-Signature=[^&\s]+/i, 'X-Amz-Signature=*****');
}
```

### Código fuente de Node.js
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs"></a>

A continuación, se muestra el código fuente del módulo de respuesta para las funciones de Node.js si el controlador no es asíncrono. Revíselo para entender qué hace el módulo y para obtener ayuda con la implementación de sus propias funciones de respuesta.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0
 
exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    var responseBody = JSON.stringify({
        Status: responseStatus,
        Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
        PhysicalResourceId: physicalResourceId || context.logStreamName,
        StackId: event.StackId,
        RequestId: event.RequestId,
        LogicalResourceId: event.LogicalResourceId,
        NoEcho: noEcho || false,
        Data: responseData
    });

    console.log("Response body:\n", responseBody);

    var https = require("https");
    var url = require("url");

    var parsedUrl = url.parse(event.ResponseURL);
    var options = {
        hostname: parsedUrl.hostname,
        port: 443,
        path: parsedUrl.path,
        method: "PUT",
        headers: {
            "content-type": "",
            "content-length": responseBody.length
        }
    };

    var request = https.request(options, function(response) {
        console.log("Status code: " + parseInt(response.statusCode));
        context.done();
    });

    request.on("error", function(error) {
        console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
        context.done();
    });

    request.write(responseBody);
    request.end();
}
```

### Código fuente Python
<a name="cfn-lambda-function-code-cfnresponsemodule-source-python"></a>

A continuación, se muestra el código fuente del módulo de respuesta de las funciones de Python:

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
 
from __future__ import print_function
import urllib3
import json
import re

SUCCESS = "SUCCESS"
FAILED = "FAILED"

http = urllib3.PoolManager()


def send(event, context, responseStatus, responseData, physicalResourceId=None, noEcho=False, reason=None):
    responseUrl = event['ResponseURL']

    responseBody = {
        'Status' : responseStatus,
        'Reason' : reason or "See the details in CloudWatch Log Stream: {}".format(context.log_stream_name),
        'PhysicalResourceId' : physicalResourceId or context.log_stream_name,
        'StackId' : event['StackId'],
        'RequestId' : event['RequestId'],
        'LogicalResourceId' : event['LogicalResourceId'],
        'NoEcho' : noEcho,
        'Data' : responseData
    }

    json_responseBody = json.dumps(responseBody)

    print("Response body:")
    print(json_responseBody)

    headers = {
        'content-type' : '',
        'content-length' : str(len(json_responseBody))
    }

    try:
        response = http.request('PUT', responseUrl, headers=headers, body=json_responseBody)
        print("Status code:", response.status)


    except Exception as e:

        print("send(..) failed executing http.request(..):", mask_credentials_and_signature(e))
 
 
def mask_credentials_and_signature(message):
    message = re.sub(r'X-Amz-Credential=[^&\s]+', 'X-Amz-Credential=*****', message, flags=re.IGNORECASE)
    return re.sub(r'X-Amz-Signature=[^&\s]+', 'X-Amz-Signature=*****', message, flags=re.IGNORECASE)
```

# Procesamientos personalizados en plantillas de CloudFormation con macros de plantillas
<a name="template-macros"></a>

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 que se haga una idea de la gran variedad de posibilidades, piense en las transformaciones `AWS::Include` y `AWS::Serverless`, que son macros alojadas por CloudFormation:
+ La [transformación AWS::Include](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html) le permite insertar fragmentos de código reutilizable en las plantillas.
+ La [transformación AWS::Serverless](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html) toma una plantilla completa escrita en la sintaxis de AWS Serverless Application Model (AWS SAM) y la transforma y amplía en una plantilla de CloudFormation compatible. Para obtener más información sobre las aplicaciones sin servidor y AWS SAM, consulte la [Guía para desarrolladores de AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html).

**Topics**
+ [Facturación](#template-macros-billing)
+ [Ejemplos de macros](#template-macros-examples-list)
+ [Recursos relacionados](#template-macros-related-resources)
+ [Descripción general de macros de CloudFormation](template-macros-overview.md)
+ [Creación de una definición de macro de CloudFormation](template-macros-author.md)
+ [Ejemplo de macro sencilla de reemplazo de cadenas](macros-example.md)
+ [Solución de problemas de la plantilla procesada](template-macros-troubleshoot-processed-template.md)

## Facturación
<a name="template-macros-billing"></a>

Cuando se ejecuta una macro, se factura al propietario de la función de Lambda todos los gastos relacionados con la ejecución de esa función.

Las transformaciones `AWS::Include` y `AWS::Serverless` son macros alojadas por CloudFormation. No se cobra por usarlas.

## Ejemplos de macros
<a name="template-macros-examples-list"></a>

Además de los ejemplos de esta sección, encontrará ejemplos de macros, incluido el código fuente y las plantillas, en nuestro [repositorio de GitHub](https://github.com/aws-cloudformation/aws-cloudformation-templates/tree/main/CloudFormation/MacrosExamples). Estos ejemplos se proporcionan “tal cual” para fines pedagógicos.

## Recursos relacionados
<a name="template-macros-related-resources"></a>
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html)
+ [Sección Transform de la plantilla de CloudFormation](transform-section-structure.md)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-transform.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-transform.html)
+ [AWS::Serverless Transformación de](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html)
+ [AWS::Include Transformación de](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html)

# Descripción general de macros de CloudFormation
<a name="template-macros-overview"></a>

El procesamiento de plantillas con macros consta de dos fases principales: crear la macro en sí y luego usar la macro para procesar las plantillas.

Para crear una definición de macro, debe crear lo siguiente:
+ Una función de Lambda para realizar el procesamiento de la plantilla. Esta función de Lambda acepta un fragmento de código o bien la totalidad de la plantilla, así como los parámetros adicionales que se definan. Devuelve el fragmento de código de plantilla procesados o toda la plantilla como respuesta.
+ Un recurso del tipo [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html), para que los usuarios puedan llamar a la función de Lambda desde plantillas de CloudFormation. Este recurso especifica el ARN de la función de Lambda para invocar esta macro y propiedades opcionales adicionales para ayudar con la depuración. Para crear este recurso dentro de una cuenta, cree una plantilla de pila que incluya el recurso `AWS::CloudFormation::Macro` y, a continuación, cree otra pila a partir de la plantilla. CloudFormation StackSets actualmente no es compatible con la creación o la actualización de conjuntos de pilas con permisos administrados por servicios a partir de plantillas que hacen referencia a macros de .

Para utilizar una macro, consulte la macro en su plantilla:
+ Para procesar una sección o un fragmento de una plantilla, consulte la macro en una función `Fn::Transform` que se encuentre ubicada en relación con el contenido de la plantilla que desea transformar. Cuando utilice `Fn::Transform`, también puede transferir todos los parámetros especificados que requiera.
+ Para procesar una plantilla completa, consulte la macro en la sección [Transform](transform-section-structure.md) de la plantilla.

A continuación, se suele crear un conjunto de cambios y, a continuación, ejecutarlo. (El procesamiento de macros puede agregar varios recursos de los que quizás no esté al tanto. Para asegurarse de que está al tanto de todos los cambios hechos por las macros, le recomendamos usar conjuntos de cambios). CloudFormation pasa el contenido de la plantilla especificada, junto con cualquier parámetro especificado adicional, a la función de Lambda especificada en el recurso de macro. La función de Lambda devuelve el contenido de la plantilla procesada, ya sea como fragmento o como una plantilla completa.

Después de que se hayan llamado a todas las macros de la plantilla, CloudFormation genera un conjunto de cambios que incluye el contenido de la plantilla procesada. Después de revisar el conjunto de cambios, ejecútelo para aplicar los cambios.

![\[Utilice la función intrínseca Fn::Transform o la sección Transform de la plantilla para pasar el contenido de la plantilla y sus parámetros asociados a la función de Lambda subyacente de la macro, que devuelve el contenido de la plantilla procesada.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/template-macro-use.png)


## Cómo crear pilas directamente
<a name="template-macros-change-sets"></a>

Para crear o actualizar una pila utilizando una plantilla que hace referencia a macros, normalmente debe crear un conjunto de cambios y ejecutarlo. Un conjunto de cambios describe las acciones que CloudFormation realizará en función de la plantilla procesada. El procesamiento de macros puede añadir numerosos recursos que usted podría desconocer. Para asegurarse de estar al tanto de todos los cambios hechos por las macros, sugerimos usar conjuntos de cambios. Después de revisar el conjunto de cambios, puede ejecutarlo para aplicar realmente los cambios.

Una macro puede añadir recursos de IAM a su plantilla. Para estos recursos, CloudFormation necesita que [reconozca sus capacidades](control-access-with-iam.md#using-iam-capabilities). Dado que CloudFormation no puede saber qué recursos se agregan antes de procesar su plantilla, es posible que tenga que reconocer las capacidades de IAM al crear el conjunto de cambios, en función de si las macros a las que se hace referencia contienen recursos de IAM. De este modo, al ejecutar el conjunto de cambios, CloudFormation tiene las capacidades necesarias para crear recursos de IAM.

Para crear o actualizar una pila directamente desde una plantilla procesada, sin antes haber revisado los cambios propuestos en un conjunto de cambios, especifique la capacidad `CAPABILITY_AUTO_EXPAND` durante una solicitud `CreateStack` o `UpdateStack`. Solo debe crear pilas directamente desde una plantilla de pila que contiene macros si sabe qué procesamiento realiza la macro. No puede utilizar conjuntos de cambios con macros de conjuntos de pilas y debe actualizar el conjunto de pilas directamente.

Para obtener más información consulte [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html) o [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html) en la *Referencia de la API de AWS CloudFormation*.

**importante**  
Si la plantilla del conjunto de pilas hace referencia a una o más macros, debe crear el conjunto de pilas directamente desde la plantilla procesada, sin revisar primero los cambios resultantes en un conjunto de cambios. El procesamiento de macros puede añadir numerosos recursos que usted podría desconocer. Antes de crear o actualizar un conjunto de pilas a partir de una plantilla que haga referencia directamente a macros, asegúrese de saber qué procesamiento realiza cada macro.

Para reducir la cantidad de pasos para lanzar pilas desde plantillas que hagan referencia a macros, puede usar los comandos `package` y `deploy` de la AWS CLI. Para obtener más información, consulte [Carga de artefactos locales en un bucket de S3 con la AWS CLI](using-cfn-cli-package.md) y [Crear una pila que incluya transformaciones](service_code_examples.md#deploy-sdk).

## Consideraciones
<a name="template-macros-considerations"></a>

Cuando trabaje con macros, tenga en cuenta las siguientes notas y limitaciones:
+ Las macros se admiten únicamente en Regiones de AWS donde Lambda está disponible. Para ver una lista de las regiones en las que Lambda está disponible, consulte [Puntos de conexión y cuotas de AWS Lambda](https://docs.aws.amazon.com/general/latest/gr/lambda-service.html).
+ Todos los fragmentos de código de plantilla procesados tienen que ser un JSON válido.
+ Cualquier fragmento de plantilla procesado debe pasar las comprobaciones de validación para una operación de creación de pila, actualización de pila, creación de conjunto de pilas o actualización de conjunto de pilas.
+ CloudFormation resuelve en primer lugar las macros y, a continuación, procesa la plantilla. La plantilla obtenida tiene que ser un JSON válido y no debe superar el límite de tamaño de la plantilla.
+ Debido al orden en que CloudFormation procesa los elementos de una plantilla, una macro no puede incluir módulos en el contenido de la plantilla procesada que devuelve a CloudFormation. Para obtener más información, consulte [Orden de evaluación de macro](template-macros-author.md#template-macros-order).
+ Cuando se utiliza la característica de restauración de actualizaciones, CloudFormation utiliza una copia de la plantilla original. Se restaura en la plantilla original incluso si el fragmento de código incluido se ha cambiado.
+ La inclusión de macros dentro de otras macros no funciona porque no procesamos las macros de forma recursiva.
+ La función intrínseca `Fn::ImportValue` no es compatible actualmente en las macros.
+ Las funciones intrínsecas incluidas en la plantilla se evalúan después de cualquier macro. Por lo tanto, el contenido de plantilla procesado que su macro devuelve puede incluir llamadas a funciones intrínsecas y se evalúan como de costumbre.
+ Actualmente, StackSets no es compatible con la creación o la actualización de conjuntos de pilas con permisos administrados por servicios a partir de plantillas que hacen referencia a macros de CloudFormation.

## Alcance y permisos de la cuenta de macro
<a name="template-macros-permissions"></a>

Puede utilizar macros solo en la cuenta en la que se han creado como un recurso. El nombre de la macro tiene que ser único en una cuenta determinada. Sin embargo, puede hacer que la misma funcionalidad esté disponible en varias cuentas habilitando el acceso entre cuentas en la función de Lambda subyacente y, a continuación, creando definiciones de macro que haga referencia a dicha función en varias cuentas. En el ejemplo siguiente, tres cuentas macro contienen definiciones y cada una de ellas apunta a la misma función de Lambda.

![\[Al permitir el acceso entre cuentas en la función de Lambda, AWS le permite crear macros en varias cuentas que hagan referencia a esa función.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/template-macro-accounts.png)


Para crear una definición de macro, el usuario debe tener permisos para crear una pila o un conjunto de pilas dentro de la cuenta especificada.

Para que CloudFormation ejecute correctamente una macro incluida en una plantilla, el usuario debe tener permisos `Invoke` para la función de Lambda subyacente. Para evitar posibles transmisiones de permisos, CloudFormation representa al usuario al ejecutar la macro.

Para obtener más información, consulte [Administrar permisos en AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html) en la *Guía para desarrolladores de AWS Lambda* y [Acciones, recursos y claves de condición para AWS Lambda](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslambda.html) en la *Referencia de autorizaciones de servicio*.

# Creación de una definición de macro de CloudFormation
<a name="template-macros-author"></a>

Al crear una definición de macro, la definición de macro hace que la función de Lambda subyacente esté disponible en la cuenta especificada, de modo que CloudFormation la llame para procesar las plantillas.

## Mapeo de eventos
<a name="template-macros-event-mapping"></a>

Cuando CloudFormation invoca la función de Lambda de una macro, envía una solicitud en formato JSON con la siguiente estructura:

```
{
    "region" : "us-east-1",
    "accountId" : "$ACCOUNT_ID",
    "fragment" : { ... },
    "transformId" : "$TRANSFORM_ID",
    "params" : { ... },
    "requestId" : "$REQUEST_ID",
    "templateParameterValues" : { ... }
}
```
+ `region`

  La región en la que la reside la macro.
+ `accountId`

  El ID de la cuenta desde la que la macro invoca la función de Lambda.
+ `fragment`

  El contenido de la plantilla disponible para el procesamiento personalizado, en formato JSON.
  + Para las macros incluidas en la sección de plantilla `Transform`, esto es toda la plantilla, a excepción de la sección `Transform`.
  + Para macros incluidas en una llamada de función intrínseca `Fn::Transform`, esto incluye todos los nodos secundarios (y sus hijos) en función de la ubicación de la función intrínseca dentro de la plantilla, excepto para la función `Fn::Transform`. Para obtener más información, consulte [Alcance de la plantilla de macro](#template-macros-scope).
+ `transformId`

  El nombre de la macro que invoca esta función.
+ `params`

  Para las llamadas de la función `Fn::Transform`, todos los parámetros especificados para la función. CloudFormation no evalúa estos parámetros antes de transferirlos a la función.

  Para macros incluidas en la sección de plantilla `Transform`, esta sección está vacía.
+ `requestId`

  El ID de la solicitud que invoca esta función.
+ `templateParameterValues`

  Todos los parámetros especificados en la sección [Parameters](parameters-section-structure.md) de la plantilla. CloudFormation evalúa estos parámetros antes de transferirlos a la función.

## Formato de respuesta
<a name="template-macros-response-format"></a>

CloudFormation espera que la función de Lambda devuelva una respuesta con el siguiente formato JSON:

```
{
    "requestId" : "$REQUEST_ID",
    "status" : "$STATUS",
    "fragment" : { ... },
    "errorMessage": "optional error message for failures"
}
```
+ `requestId`

  El ID de la solicitud que invoca esta función. Debe coincidir con el ID de la solicitud que proporciona CloudFormation al invocar la función.
+ `status`

  El estado de la solicitud (no distingue entre mayúsculas y minúsculas). Debe definirse en `success`. CloudFormation trata todas las demás respuestas como error.
+ `fragment`

  El contenido de la plantilla procesada para que CloudFormation lo incluya en la plantilla procesada, incluidos los elementos secundarios. CloudFormation sustituye el contenido de la plantilla que se transfiere a la función de Lambda con el fragmento de código de plantilla que recibe en la respuesta de Lambda.

  El contenido de la plantilla procesada tiene que ser un formato JSON válido, y su inclusión en la plantilla procesada debe generar una plantilla válida.

  Si la función no cambia realmente el contenido de la plantilla que CloudFormation le pasa, pero el usuario sigue necesitando incluir ese contenido en la plantilla procesada, la función debe devolver dicho contenido de plantilla a CloudFormation en su respuesta.
+ `errorMessage`

  El mensaje de error que explica por qué falló la transformación. CloudFormation muestra este mensaje de error en el panel **Events** (Eventos) de la página **Stack details** (Detalles de la pila) para la pila.

  Por ejemplo:

  ```
  Error creating change set: Transform
                              Cuenta de AWS account
                              number::macro name failed with:
                              error message string.
  ```

## Creación de una definición de macro
<a name="create-a-macro-definition"></a>

**Crear una definición de macro de CloudFormation**

1. [Cree una función de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html) que se encargue del procesamiento del contenido de la plantilla. Puede procesar cualquier parte de una plantilla, incluso la plantilla completa. 

1. Cree una plantilla de CloudFormation que contenga un tipo de recurso `AWS::CloudFormation::Macro` y especifique las propiedades `Name` y `FunctionName`. La propiedad `FunctionName` debe contener el ARN de la función de Lambda para invocar cuándo CloudFormation ejecuta la macro.

1. (Opcional) Para ayudar en la depuración, también puede especificar las propiedades `LogGroupName` y `LogRoleArn` cuando cree el tipo de recurso `AWS::CloudFormation::Macro` para su macro. Estas propiedades le permiten especificar el grupo de registro de Registros de CloudWatch al que CloudFormation envía la información de registro de errores al invocar la función de Lambda subyacente de la macro y el rol que CloudFormation debe asumir al enviar entradas de registro a dichos registros.

1. [Cree una pila](cfn-console-create-stack.md) utilizando la plantilla con la macro de la cuenta en la que desee utilizarla. O [cree un conjunto de pilas con permisos autoadministrados](stacksets-getting-started-create-self-managed.md) mediante la plantilla con la macro en la cuenta de administrador y, a continuación, cree instancias de pilas en las cuentas de destino.

1. Una vez que CloudFormation haya creado correctamente las pilas que contienen la definición de la macro, esta estará disponible para su uso en dichas cuentas. Una macro se utiliza haciendo referencia a ella en una plantilla, en la ubicación adecuada relevante para el contenido de la plantilla que desea procesar.

## Alcance de la plantilla de macro
<a name="template-macros-scope"></a>

Las macros a las que se hace referencia en la sección `Transform` de una plantilla pueden procesar todo el contenido de dicha plantilla.

Las macros a las que se hace referencia en una función `Fn::Transform` pueden procesar el contenido de cualquiera de los elementos del mismo nivel (incluidos los elementos secundarios) de dicha función `Fn::Transform` en la plantilla.

Por ejemplo, en la siguiente plantilla de ejemplo, `AWS::Include` puede procesar todas las propiedades `MyBucket`, en función de la ubicación de la función `Fn::Transform` que lo contiene. `MyMacro` puede procesar el contenido de toda la plantilla debido a su inclusión en la sección `Transform`.

```
# Start of processable content for MyMacro
AWSTemplateFormatVersion: 2010-09-09 
 Transform: [MyMacro]
 Resources:
    WaitCondition:
      Type: AWS::CloudFormation::WaitCondition
    MyBucket:
      Type: AWS::S3::Bucket
      # Start of processable content for AWS::Include
      Properties:
        BucketName: amzn-s3-demo-bucket1
        Tags: [{"key":"value"}] 
        'Fn::Transform':
          - Name: 'AWS::Include'
              Parameters:
                Location: s3://amzn-s3-demo-bucket2/MyFileName.yaml
        CorsConfiguration: []
        # End of processable content for AWS::Include
    MyEc2Instance:
      Type: AWS::EC2::Instance
      Properties:
        ImageID: ami-1234567890abcdef0
# End of processable content for MyMacro
```

## Orden de evaluación de macro
<a name="template-macros-order"></a>

Puede consultar varias macros de una determinada plantilla, incluidas transformaciones alojadas por CloudFormation, como [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html) y [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html).

Las macros se evalúan en orden, en función de su ubicación en la plantilla, desde la que esté más profundamente anidada hasta la más general. Las macros que están en la misma ubicación de la plantilla se evalúan en serie en función del orden en que aparecen en la lista.

Las transformaciones como, por ejemplo, `AWS::Include` y `AWS::Transform`, se tratan de la misma manera que cualquier otra macro en términos de orden y ámbito de acción.

Por ejemplo, en la siguiente plantilla de ejemplo, CloudFormation evalúa primero la macro `PolicyAdder`, ya que es la macro que está anidada más profundamente en la plantilla. A continuación, CloudFormation evalúa `MyMacro` antes de evaluar `AWS::Serverless`, ya que aparece antes de `AWS::Serverless` en la sección `Transform`.

```
AWSTemplateFormatVersion: 2010-09-09
 Transform: [MyMacro, AWS::Serverless]
 Resources:
    WaitCondition:
      Type: AWS::CloudFormation::WaitCondition
    MyBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: amzn-s3-demo-bucket
        Tags: [{"key":"value"}]
        'Fn::Transform':
          - Name: PolicyAdder
        CorsConfiguration: []
    MyEc2Instance:
      Type: AWS::EC2::Instance
      Properties:
        ImageID: ami-1234567890abcdef0
```

# Ejemplo de macro sencilla de reemplazo de cadenas
<a name="macros-example"></a>

En el siguiente ejemplo, se explica con detalle el proceso de utilización de las macros, desde la definición de la macro en una plantilla hasta la creación de una función de Lambda para la macro y, a continuación, la utilización de la macro en una plantilla.

En este ejemplo, creamos un macro sencilla que inserta la cadena especificada en lugar del contenido de destino especificado en la plantilla procesada. Después la utilizaremos para insertar una `WaitHandleCondition` en blanco en la ubicación especificada en la plantilla procesada.

## Creación de una macro
<a name="macros-example-definiton"></a>

Antes de utilizar una macro, primero hay que hacer dos cosas: crear la función de Lambda que se encarga del procesamiento de la plantilla y poner la función de Lambda a disposición de CloudFormation creando una definición de macro.

La plantilla de ejemplo siguiente contiene la definición de nuestra macro de ejemplo. Para que la macro esté disponible en una Cuenta de AWS específica, tenemos que crear una pila a partir de la plantilla. La definición de la macro especifica el nombre de la macro, una breve descripción y hace referencia al ARN de la función de Lambda que CloudFormation invoca cuando esta macro se utiliza en una plantilla. (No hemos incluido una propiedad `LogGroupName` o `LogRoleARN` para el registro de errores). 

En este ejemplo se presupone que la pila creada a partir de esta plantilla se denomina `JavaMacroFunc`. Debido a que la propiedad `Name` de la macro se establece en el nombre de la pila, la macro resultante también se denomina `JavaMacroFunc`.

```
AWSTemplateFormatVersion: 2010-09-09
  Resources:
    Macro:
      Type: AWS::CloudFormation::Macro
      Properties:
        Name: !Sub '${AWS::StackName}'
        Description: Adds a blank WaitConditionHandle named WaitHandle
        FunctionName: 'arn:aws:lambda:us-east-1:012345678910:function:JavaMacroFunc'
```

## Uso de la macro
<a name="macros-example-usage"></a>

Para utilizar nuestra macro, la incluiremos en una plantilla utilizando la función intrínseca `Fn::Transform`.

Cuando creemos una pila utilizando la plantilla siguiente, CloudFormation llamará a nuestra macro de ejemplo. La función de Lambda subyacente sustituirá una cadena especificada por otra cadena especificada. En este caso, el resultado es que se inserta un `AWS::CloudFormation::WaitConditionHandle` en blanco en la plantilla procesada.

```
Parameters:
  ExampleParameter:
    Type: String
    Default: 'SampleMacro'

Resources:
  2a:
    Fn::Transform:
      Name: "JavaMacroFunc"
      Parameters:
        replacement: 'AWS::CloudFormation::WaitConditionHandle'
        target: '$$REPLACEMENT$$'
    Type: '$$REPLACEMENT$$'
```
+ La macro para invocar se especifica como `JavaMacroFunc`, que proviene del ejemplo de definición de macro anterior.
+ Se pasan dos parámetros a la macro, `target` y `replacement`, que representan la cadena de destino y su valor de sustitución deseado.
+ La macro puede funcionar con el contenido del nodo `Type` porque `Type` tiene el mismo nivel que la función `Fn::Transform` que hace referencia a la macro.
+ El elemento `AWS::CloudFormation::WaitConditionHandle` obtenido se denomina `2a`.
+ La plantilla también contiene un parámetro de plantilla, `ExampleParameter`, al que la macro también tiene acceso (pero no utiliza en este caso).

## Datos de entrada de Lambda
<a name="macros-example-request"></a>

Cuando CloudFormation procesa nuestra plantilla de ejemplo durante la creación de la pila, pasa el siguiente mapeo de eventos a la función de Lambda a la que se hace referencia en la definición de la macro `JavaMacroFunc`.
+ `region` : `us-east-1`
+ `accountId` : `012345678910`
+ `fragment` :

  ```
  {
    "Type": "$$REPLACEMENT$$"
  }
  ```
+ `transformId` : `012345678910::JavaMacroFunc`
+ `params` : 

  ```
  {
      "replacement": "AWS::CloudFormation::WaitConditionHandle",
      "target": "$$REPLACEMENT$$"
  }
  ```
+ `requestId` : `5dba79b5-f117-4de0-9ce4-d40363bfb6ab`
+ `templateParameterValues` :

  ```
  {
      "ExampleParameter": "SampleMacro"
  }
  ```

`fragment` contiene JSON que representa el fragmento de plantilla que la macro puede procesar. Este fragmento consta de los elementos de la llamada de función `Fn::Transform`, pero no la llamada de función en sí misma. Además, `params` contiene JSON que representa los parámetros de la macro. En este caso, la sustitución y el destino. Del mismo modo, `templateParameterValues` contiene JSON que representa los parámetros que se han especificado para la plantilla en su totalidad.

## Código de la función de Lambda
<a name="macros-example-function"></a>

A continuación se muestra el código real de la función de Lambda que subyace a la macro de ejemplo `JavaMacroFunc`. Se itera en el fragmento de código de plantilla incluido en la respuesta (ya sea en formato de cadena, lista o mapa), buscando la cadena de destino especificada. Si encuentra la cadena de destino especificada, la función de Lambda sustituye la cadena de destino por la cadena de sustitución especificada. Si no es así, la función deja el fragmento de código de plantilla sin cambiar. A continuación, la función devuelve un mapa de las propiedades esperadas, que se describen en detalle a continuación, en CloudFormation.

```
package com.macroexample.lambda.demo;

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler implements RequestHandler<Map<String, Object>, Map<String, Object>> {

	private static final String REPLACEMENT = "replacement";
	private static final String TARGET = "target";
	private static final String PARAMS = "params";
	private static final String FRAGMENT = "fragment";
	private static final String REQUESTID = "requestId";
	private static final String STATUS = "status";
	private static final String SUCCESS = "SUCCESS";
	private static final String FAILURE = "FAILURE";
    @Override
    public Map<String, Object> handleRequest(Map<String, Object> event, Context context) {
        // TODO: implement your handler
    	final Map<String, Object> responseMap = new HashMap<String, Object>();
        responseMap.put(REQUESTID, event.get(REQUESTID));
        responseMap.put(STATUS, FAILURE);
    	try {
	        if (!event.containsKey(PARAMS)) {
	        	throw new RuntimeException("Params are required");
	        }
	    	
	        final Map<String, Object> params = (Map<String, Object>) event.get(PARAMS);
	        if (!params.containsKey(REPLACEMENT) || !params.containsKey(TARGET)) {
	        	throw new RuntimeException("replacement or target under Params are required");
	        }
	    	
	    	final String replacement = (String) params.get(REPLACEMENT);
	    	final String target = (String) params.get(TARGET);
	    	final Object fragment = event.getOrDefault(FRAGMENT, new HashMap<String, Object>());
	    	final Object retFragment;
	    	if (fragment instanceof String) {
	    		retFragment = iterateAndReplace(replacement, target, (String) fragment);
	    	} else if (fragment instanceof List) {
	    		retFragment = iterateAndReplace(replacement, target, (List<Object>) fragment);
	    	} else if (fragment instanceof Map) {
	    		retFragment = iterateAndReplace(replacement, target, (Map<String, Object>) fragment);
	    	} else {
	    		retFragment = fragment;
	    	}
	        responseMap.put(STATUS, SUCCESS);
	        responseMap.put(FRAGMENT, retFragment);
	        return responseMap;
    	} catch (Exception e) {
    		e.printStackTrace();
    		context.getLogger().log(e.getMessage());
    		return responseMap;
    	}
    }
    
    private Map<String, Object> iterateAndReplace(final String replacement, final String target, final Map<String, Object> fragment) {
    	final Map<String, Object> retFragment = new HashMap<String, Object>();
    	final List<String> replacementKeys = new ArrayList<>();
    	fragment.forEach((k, v) -> {
    		if (v instanceof String) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (String)v));
    		} else if (v instanceof List) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (List<Object>)v));
    		} else if (v instanceof Map ) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (Map<String, Object>) v));
    		} else {
    			retFragment.put(k, v);
    		}
    	});
    	return retFragment;
    }

    private List<Object> iterateAndReplace(final String replacement, final String target, final List<Object> fragment) {
    	final List<Object> retFragment = new ArrayList<>();
    	fragment.forEach(o -> {
    		if (o instanceof String) {
    			retFragment.add(iterateAndReplace(replacement, target, (String) o));
    		} else if (o instanceof List) {
    			retFragment.add(iterateAndReplace(replacement, target, (List<Object>) o));
    		} else if (o instanceof Map) {
    			retFragment.add(iterateAndReplace(replacement, target, (Map<String, Object>) o));
    		} else {
    			retFragment.add(o);
    		}
    	});
    	return retFragment;
    }
    
    private String iterateAndReplace(final String replacement, final String target, final String fragment) {
    	System.out.println(replacement + " == " + target + " == " + fragment );
    	if (fragment != null AND_AND fragment.equals(target))
    		return replacement;
    	return fragment;
    }
}
```

## Respuesta de la función de Lambda
<a name="macros-example-response"></a>

A continuación, se presenta la asignación que la función de Lambda devuelve a CloudFormation para su procesamiento. 
+ `requestId` : `5dba79b5-f117-4de0-9ce4-d40363bfb6ab`
+ `status` : `SUCCESS`
+ `fragment` :

  ```
  {
    "Type": "AWS::CloudFormation::WaitConditionHandle"
  }
  ```

El `requestId` coincide con el que se envió desde CloudFormation y un valor `status` de `SUCCESS` indica que la función de Lambda ha procesado correctamente el fragmento de código de plantilla incluido en la solicitud. En esta respuesta, `fragment` contiene JSON que representa el contenido que debe insertarse en la plantilla procesada en lugar del fragmento de código de plantilla original.

## Plantilla procesada resultante
<a name="macros-example-processed"></a>

Una vez que CloudFormation recibe una respuesta correcta de la función de Lambda, se inserta el fragmento de código de plantilla devuelto en la plantilla procesada.

A continuación se muestra la plantilla procesada resultante para nuestro ejemplo. La llamada de función intrínseca `Fn::Transform` a la que hace referencia la macro `JavaMacroFunc` ya no está incluida. El fragmento de plantilla devuelto por la función de Lambda se incluye en la ubicación adecuada, con el resultado de que el contenido `"Type": "$$REPLACEMENT$$"` se ha sustituido con `"Type": "AWS::CloudFormation::WaitConditionHandle"`.

```
{
    "Parameters": {
        "ExampleParameter": {
            "Default": "SampleMacro",
            "Type": "String"
        }
    },
    "Resources": {
        "2a": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        }
    }
}
```

# Solución de problemas de la plantilla procesada
<a name="template-macros-troubleshoot-processed-template"></a>

Cuando se utiliza una macro, la plantilla procesada se encuentra en la consola de CloudFormation.

La etapa de una plantilla indica su estado de procesamiento:
+ `Original`: la plantilla que el usuario envió originalmente para crear o actualizar la pila o el conjunto de pilas.
+ `Processed`: la plantilla que CloudFormation utilizó para crear o actualizar la pila o el conjunto de pilas después de procesar todas las macros de referencia. La plantilla procesada se formatea como JSON, incluso si la plantilla original tenía el formato YAML.

Utilice la plantilla procesada para la resolución de problemas. Si una plantilla no hace referencia a macros, las plantillas original y procesada son idénticas.

Para obtener más información, consulte [Visualización de la información de la pila desde la consola de CloudFormation](cfn-console-view-stack-data-resources.md).

Para utilizar la AWS CLI para obtener la plantilla procesada, utilice el comando [get-template](service_code_examples.md#get-template-sdk).

## Límites de tamaño
<a name="template-macros-size-limitation"></a>

El tamaño máximo de una plantilla de pila procesada es de 51 200 bytes cuando se pasa directamente a una solicitud `CreateStack`, `UpdateStack` o `ValidateTemplate`, o 1 MB cuando se pasa como un objeto S3 utilizando una URL de plantilla de Amazon S3. Sin embargo, durante el procesamiento, CloudFormation actualiza el estado temporal de la plantilla, ya que procesa en serie las macros contenidas en la plantilla. Por este motivo, el tamaño de la plantilla durante el procesamiento puede superar temporalmente el tamaño máximo permitido de una plantilla totalmente procesada. CloudFormation permite cierta cantidad de búfer para estas plantillas en proceso. Sin embargo, debería diseñar las plantillas y macros teniendo en cuenta el tamaño máximo permitido para una plantilla de pila procesada.

Si CloudFormation devuelve un error `Transformation data limit exceeded` al procesar su plantilla, significa que la plantilla ha superado el tamaño máximo de plantilla que CloudFormation permite durante el procesamiento.

Para resolver este problema, realice lo siguiente:
+ Reestructure la plantilla en varias plantillas para evitar superar el tamaño máximo de las plantillas en proceso. Por ejemplo:
  + Utilice plantillas de pila anidadas para encapsular las partes de la plantilla. Para obtener más información, consulte [División de una plantilla en piezas reutilizables utilizando pilas anidadas](using-cfn-nested-stacks.md).
  + Cree varias pilas y utilice referencias de pila cruzadas para intercambiar información entre ellas. Para obtener más información, consulte [Consulta de las salidas de recursos en otra pila de CloudFormation](walkthrough-crossstackref.md).
+ Reduzca el tamaño de fragmento de plantilla devuelto por una determinado macro. CloudFormation no modifica el contenido de los fragmentos devuelto por macros.

# División de una plantilla en piezas reutilizables utilizando pilas anidadas
<a name="using-cfn-nested-stacks"></a>

A medida que su infraestructura crezca, es posible que se encuentre creando repetidamente configuraciones de recursos idénticas en varias plantillas. Para evitar esta redundancia, puede separar estas configuraciones comunes en plantillas dedicadas. Después, puede utilizar el recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) en otras plantillas para hacer referencia a otras plantillas dedicadas, y así crear pilas anidadas.

Por ejemplo, imagine que tiene una configuración de equilibrador de carga que utiliza para la mayoría de sus pilas. En lugar de copiar y pegar las mismas configuraciones en las plantillas, puede crear una plantilla exclusiva para el balanceador de carga. Luego, puede hacer referencia a esta plantilla desde otras plantillas que requieran la misma configuración de equilibrador de carga.

Las pilas anidadas pueden a su vez contener otras pilas anidadas, lo que se traduce en una jerarquía de pilas, como se muestra en el diagrama que aparece a continuación. La *pila raíz* es la pila de nivel superior a la que pertenecen todas las demás pilas anidadas. Cada pila anidada dispone de una pila primaria inmediata. En el caso del primer nivel de pilas anidadas, la pila raíz es a su vez la primaria.
+ La pila A es la raíz de todas las demás pilas anidadas de la jerarquía.
+ En el caso de la pila B, la pila A es tanto su pila primaria como la pila raíz.
+ Para la pila D, la C es su pila primaria, del mismo modo que para la pila C, la B es su pila primaria.

![\[Las pilas anidadas, que se crean como parte de otra pila, disponen de una pila primaria inmediata y de una pila raíz de nivel superior.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [Ejemplo de antes y después de dividir una plantilla](#create-nested-stack-template)
+ [Ejemplo de una arquitectura de pila anidada](#nested-stack-examples)
+ [Operaciones de apilamiento en pilas anidadas](#perform-stack-operations-on-nested-stacks)
+ [Información relacionada](#nested-stacks-related-information)

## Ejemplo de antes y después de dividir una plantilla
<a name="create-nested-stack-template"></a>

En este ejemplo, se muestra cómo puede tomar una plantilla grande y única de CloudFormation y reorganizarla en un diseño más estructurado y reutilizable mediante plantillas anidadas. Inicialmente, la plantilla “Antes de anidar las pilas” muestra todos los recursos definidos en un archivo. Esto puede resultar complicado y difícil de administrar a medida que aumenta la cantidad de recursos. La plantilla «Después de anidar las pilas» divide los recursos en plantillas más pequeñas e independientes. Cada pila anidada gestiona un conjunto específico de recursos relacionados, lo que hace que la estructura general esté más organizada y sea más fácil de mantener.


| Antes de anidar las pilas | Después de anidar las pilas | 
| --- | --- | 
| <pre>AWSTemplateFormatVersion: 2010-09-09<br />Parameters:<br />  InstanceType:<br />    Type: String<br />    Default: t2.micro<br />    Description: The EC2 instance type<br />  <br />  Environment:<br />    Type: String<br />    Default: Production<br />    Description: The deployment environment<br /><br />Resources:<br />  MyEC2Instance:<br />    Type: AWS::EC2::Instance<br />    Properties:<br />      ImageId: ami-1234567890abcdef0<br />      InstanceType: !Ref InstanceType<br /><br />  MyS3Bucket:<br />    Type: AWS::S3::Bucket</pre> | <pre>AWSTemplateFormatVersion: 2010-09-09<br />Resources:<br />  MyFirstNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/first-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        InstanceType: t3.micro<br /><br />  MySecondNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/second-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        Environment: Testing<br />    DependsOn: MyFirstNestedStack</pre> | 

## Ejemplo de una arquitectura de pila anidada
<a name="nested-stack-examples"></a>

Esta sección muestra una arquitectura de pila anidada que consiste en una pila de nivel superior que hace referencia a una pila anidada. La pila anidada implementa una función de Lambda de Node.js, recibe un valor de parámetro de la pila de nivel superior y devuelve una salida que se expone a través de la pila de nivel superior.

**Topics**
+ [Paso 1: cree una plantilla para la pila anidada en su sistema local.](#create-a-nested-stack-template)
+ [Paso 2: cree una plantilla para la pila de nivel superior en su sistema local.](#create-a-nested-stack-parent-template)
+ [Paso 3: empaquetar e implementar las plantillas.](#create-a-nested-stack-parent-template)

### Paso 1: cree una plantilla para la pila anidada en su sistema local.
<a name="create-a-nested-stack-template"></a>

En el siguiente ejemplo, se muestra el formato de la plantilla para la pila anidada.

#### YAML
<a name="nested-stack-child-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Nested stack template for Lambda function deployment
 3. Parameters:
 4.   MemorySize:
 5.     Type: Number
 6.     Default: 128
 7.     MinValue: 128
 8.     MaxValue: 10240
 9.     Description: Lambda function memory allocation (128-10240 MB)
10. Resources:
11.   LambdaFunction:
12.     Type: AWS::Lambda::Function
13.     Properties:
14.       FunctionName: !Sub "${AWS::StackName}-Function"
15.       Runtime: nodejs18.x
16.       Handler: index.handler
17.       Role: !GetAtt LambdaExecutionRole.Arn
18.       Code:
19.         ZipFile: |
20.           exports.handler = async (event) => {
21.             return {
22.               statusCode: 200,
23.               body: JSON.stringify('Hello from Lambda!')
24.             };
25.           };
26.       MemorySize: !Ref MemorySize
27.   LambdaExecutionRole:
28.     Type: AWS::IAM::Role
29.     Properties:
30.       AssumeRolePolicyDocument:
31.         Version: '2012-10-17'
32.         Statement:
33.           - Effect: Allow
34.             Principal:
35.               Service: lambda.amazonaws.com
36.             Action: sts:AssumeRole
37.       ManagedPolicyArns:
38.         - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
39. Outputs:
40.   LambdaArn:
41.     Description: ARN of the created Lambda function
42.     Value: !GetAtt LambdaFunction.Arn
```

### Paso 2: cree una plantilla para la pila de nivel superior en su sistema local.
<a name="create-a-nested-stack-parent-template"></a>

El siguiente ejemplo muestra el formato de la plantilla de pila de nivel superior y el recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) que hace referencia a la pila que creó en el paso anterior.

#### YAML
<a name="nested-stack-parent-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Top-level stack template that deploys a nested stack
 3. Resources:
 4.   NestedStack:
 5.     Type: AWS::CloudFormation::Stack
 6.     Properties:
 7.       TemplateURL: /path_to_template/nested-template.yaml
 8.       Parameters:
 9.         MemorySize: 256
10. Outputs:
11.   NestedStackLambdaArn:
12.     Description: ARN of the Lambda function from nested stack
13.     Value: !GetAtt NestedStack.Outputs.LambdaArn
```

### Paso 3: empaquetar e implementar las plantillas.
<a name="create-a-nested-stack-parent-template"></a>

**nota**  
Al trabajar con plantillas de forma local, el comando **package** de la AWS CLI puede ayudarlo a preparar las plantillas para su implementación. Gestiona automáticamente la carga de artefactos locales en Amazon S3 (incluidas `TemplateURL`) y genera un nuevo archivo de plantilla con referencias actualizadas a estas ubicaciones de S3. Para obtener más información, consulte [Carga de artefactos locales en un bucket de S3 con la AWS CLI](using-cfn-cli-package.md). 

A continuación, puede utilizar el comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) para cargar la plantilla anidada a un bucket de Amazon S3.

```
aws cloudformation package \
  --s3-bucket amzn-s3-demo-bucket \
  --template /path_to_template/top-level-template.yaml \
  --output-template-file packaged-template.yaml \
  --output json
```

El comando genera una nueva plantilla en la ruta especificada por `--output-template-file`. Reemplaza la referencia `TemplateURL` con la ubicación de Amazon S3, tal y como se muestra a continuación.

**Plantilla resultante**

```
AWSTemplateFormatVersion: 2010-09-09
Description: Top-level stack template that deploys a nested stack
Resources:
  NestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket/8b3bb7aa7abfc6e37e2d06b869484bed.template
      Parameters:
        MemorySize: 256
Outputs:
  NestedStackLambdaArn:
    Description: ARN of the Lambda function from nested stack
    Value:
      Fn::GetAtt:
      - NestedStack
      - Outputs.LambdaArn
```

Después de que ejecute el comando **package**, puede implementar la plantilla procesada mediante el comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/). Para las pilas anidadas que contienen recursos de IAM, debe confirmar las capacidades de IAM al incluir la opción `--capabilities`.

```
aws cloudformation deploy \
  --template-file packaged-template.yaml \
  --stack-name stack-name \
  --capabilities CAPABILITY_NAMED_IAM
```

## Operaciones de apilamiento en pilas anidadas
<a name="perform-stack-operations-on-nested-stacks"></a>

Al trabajar con pilas anidadas, debe gestionarlas con cuidado durante las operaciones. Determinadas operaciones de las pilas, como las actualizaciones de pilas, deben iniciarse en la pila raíz en lugar de realizarse directamente en las pilas anidadas. Al actualizar una pila raíz, solo se actualizarán las pilas anidadas con cambios de plantilla. 

Además, la presencia de las pilas anidadas puede afectar a las operaciones en la pila raíz. Por ejemplo, si una pila anidada se queda atascada en el estado `UPDATE_ROLLBACK_IN_PROGRESS`, la pila raíz esperará hasta que esa pila anidada complete su proceso de reversión antes de continuar. Antes de continuar con las operaciones de actualización, asegúrese de tener permisos de IAM para cancelar una actualización de la pila en caso de que se revierta. Para obtener más información, consulte [Control del acceso a CloudFormation con AWS Identity and Access Management](control-access-with-iam.md).

Use los siguientes procedimientos para buscar la pila raíz y las pilas anidadas.

**Para ver la pila raíz de una pila anidada**

1. Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation en [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. En la página **Pilas**, seleccione el nombre de la pila anidada de la que desea ver la pila raíz.

   Las pilas anidadas tienen la palabra **ANIDADA** sobre su nombre.

1. En la pestaña **Información de la pila**, en la sección **Información general**, seleccione el nombre de la pila mostrada como **Pila raíz**.

**Para ver las pilas anidadas que pertenecen a una pila raíz**

1. Desde la pila raíz cuyas pilas anidadas desea ver, seleccione la pestaña **Recursos**.

1. En la columna **Tipo**, busque recursos del tipo **AWS::CloudFormation::Stack**.

## Información relacionada
<a name="nested-stacks-related-information"></a>
+ [Anidamiento de una pila existente](resource-import-nested-stacks.md)
+ [Comprensión de los comportamientos de actualización de los recursos de la pila](using-cfn-updating-stacks-update-behaviors.md)
+ [Continúe con la reversión de las actualizaciones con fallas de la pila anidada](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [Fallo de reversión de pilas anidadas](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)

# Creación de condiciones de espera en una plantilla de CloudFormation
<a name="using-cfn-waitcondition"></a>

En este tema se explica cómo crear una condición de espera en una plantilla para coordinar la creación de los recursos de la pila o realizar un seguimiento del progreso de un proceso de configuración. Por ejemplo, puede comenzar la creación de otro recurso después de que la configuración de la aplicación esté parcialmente completa o puede enviar señales durante un proceso de instalación y configuración para realizar un seguimiento de su progreso. 

Cuando CloudFormation crea una pila que incluye una condición de espera:
+ Crea una condición de espera igual que cualquier otro recurso y establece el estado de la condición de espera en `CREATE_IN_PROGRESS`.
+ CloudFormation espera hasta que recibe la cantidad necesara de señales de éxito o hasta que haya vencido el periodo de la condición de espera. 
+ Si recibe la cantidad requerida de señales de éxito antes de que venza el periodo de espera:
  + El estado de la condición de espera cambia a `CREATE_COMPLETE`
  + La creación de la pila continúa
+ Si se agota el tiempo de espera o se recibe una señal de error:
  + El estado de la condición de espera cambia a `CREATE_FAILED`
  + Restauración de una pila

**importante**  
Con los recursos de Amazon EC2 y Auto Scaling recomendamos que use un atributo CreationPolicy en lugar de condiciones de espera. Agregue un atributo CreationPolicy a esos recursos y use el script de ayuda cfn-signal para señalar que el proceso de creación de instancias ha finalizado satisfactoriamente.  
Para obtener más información, consulte [CreationPolicy atributo](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-creationpolicy.html).

**nota**  
Si utiliza AWS PrivateLink, los recursos de la VPC que responden a condiciones de espera tienen que tener acceso a buckets de Amazon Simple Storage Service (Amazon S3) específicos de CloudFormation. Los recursos deben enviar respuestas de condición de espera a una URL de Amazon S3 prefirmada. Si no pueden enviar respuestas a Amazon S3, CloudFormation no recibirá una respuesta y la operación de pila producirá un error. Para obtener más información, consulte [Acceso a CloudFormation a través de un punto de conexión de la interfaz (AWS PrivateLink)](vpc-interface-endpoints.md) y [Control del acceso desde puntos de conexión de VPC con políticas de bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html).

**Topics**
+ [Creación de una condición de espera en su plantilla](#creating-wait-condition)
+ [Sintaxis de señal de condición de espera](#wait-condition-signal-syntax)
+ [Acceso a los datos de señales](#wait-condition-access-signal-data)

## Creación de una condición de espera en su plantilla
<a name="creating-wait-condition"></a>

**1. Identificador de condición de espera**  
Se empieza por definir un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitconditionhandle.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitconditionhandle.html) en la plantilla de la pila. Este recurso genera la URL prefirmada necesaria para enviar señales. Esto le permite enviar una señal sin tener que proporcionar sus credenciales de AWS. Por ejemplo: 

```
Resources:
  MyWaitHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

**2. Condición de espera**  
A continuación, debe definir un recurso [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitcondition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitcondition.html) en la plantilla de la pila. La estructura básica de `AWS::CloudFormation::WaitCondition` tiene un aspecto similar al siguiente: 

```
  MyWaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    Properties:
      Handle: String
      Timeout: String
      Count: Integer
```

El recurso `AWS::CloudFormation::WaitCondition` tiene dos propiedades obligatorias y una propiedad opcional.
+ `Handle` (obligatoria): referencia a un `WaitConditionHandle` declarado en la plantilla.
+ `Timeout` (obligatoria): la cantidad de segundos que CloudFormation debe esperar a que se reciba la cantidad de señales requerida. `Timeout` es una propiedad con un límite mínimo, lo que quiere decir que el tiempo de espera comienza a partir del momento en que se especifique, no antes, aunque también puede producirse poco después. El tiempo máximo que puede especificar es de 43200 segundos (12 horas).
+ `Count` (opcional): la cantidad de señales de éxito que CloudFormation debe recibir antes de configurar el estado de esa condición de espera en `CREATE_COMPLETE` y retoma la creación de la pila. Si no se especifica, el valor predeterminado es 1.

Normalmente, querrá que una condición de espera comience inmediatamente después de la creación de un recurso específico. Para ello, agregue el atributo `DependsOn` a una condición de espera. Al añadir un atributo `DependsOn` a una condición de espera, CloudFormation crea primero el recurso en el atributo `DependsOn` y, a continuación, crea la condición de espera. Para obtener más información, consulte [DependsOn atributo](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html).

En el siguiente ejemplo se muestra una condición de espera que: 
+ Comienza después de la creación correcta del recurso `MyEC2Instance`
+ Utiliza el recurso `MyWaitHandle` como `WaitConditionHandle`
+ Tiene un tiempo de espera de 4500 segundos
+ Tiene el valor predeterminado `Count` de 1 (ya que no se especifica ninguna propiedad `Count`)

```
  MyWaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    DependsOn: MyEC2Instance
    Properties:
      Handle: !Ref MyWaitHandle
      Timeout: '4500'
```

**3. Envío de una señal**  
Para indicar el éxito o el error de CloudFormation, normalmente se ejecuta algún código o script. Por ejemplo, una aplicación que se ejecuta en una instancia de EC2 puede realizar algunas tareas de configuración adicionales y, a continuación, enviar una señal a CloudFormation para indicar que ha finalizado.

La señal debe enviarse a la URL prefirmada generada por el identificador de la condición de espera. Debe utilizar la URL prefirmada para señalar el éxito o el error.

**Enviar una señal**

1. Para recuperar la URL prefirmada dentro de la plantilla, utilice la función intrínseca `Ref` con el nombre lógico del identificador de la condición de espera. 

   Como se muestra en el siguiente ejemplo, su plantilla puede indicar una instancia de Amazon EC2 y pasar la URL prefirmada a las instancias de EC2 mediante la propiedad `UserData` de Amazon EC2. Esto permite que los scripts o las aplicaciones que se ejecutan en esas instancias indiquen el éxito o el error a CloudFormation.

   ```
     MyEC2Instance:
       Type: AWS::EC2::Instance
       Properties:
       InstanceType: t2.micro  # Example instance type
       ImageId: ami-055e3d4f0bbeb5878  # Change this as needed (Amazon Linux 2023 in us-west-2)
       UserData:
         Fn::Base64: 
           Fn::Join: 
             - ""
             - - "SignalURL="
               - { "Ref": "MyWaitHandle" }
   ```

   Esto devuelve un resultado `UserData` similar a:

   ```
   SignalURL=https://amzn-s3-demo-bucket.s3.amazonaws.com/....
   ```

   Nota: En la Consola de administración de AWS o las herramientas de línea de comandos, la URL prefirmada se muestra con el ID físico de la condición de espera del recurso del administrador.

1. (Opcional) Para detectar cuándo la pila entra en estado de espera, puede usar uno de los siguientes métodos:
   + Si crea la pila con las notificaciones habilitadas, CloudFormation publica una notificación para cada evento de pila en el tema especificado. Si usted o su aplicación se suscriben a ese tema, puede monitorizar las notificaciones para el evento de creación del identificador de la condición de espera y recuperar la URL prefirmada del mensaje de notificación.
   + También puede monitorear los eventos de la pila mediante la Consola de administración de AWS, la AWS CLI o un SDK.

1. Para enviar una señal, envía un mensaje de solicitud HTTP usando la URL prefirmada. El método de solicitudes debe ser `PUT` y el encabezado `Content-Type` debe ser una cadena vacía u omitirse. El mensaje de solicitud debe ser una estructura JSON con la forma especificada en [Sintaxis de señal de condición de espera](#wait-condition-signal-syntax).

   Debe enviar la cantidad de señales de éxito que se especifica en la propiedad `Count` para que CloudFormation continúe con la creación de la pila. Si la propiedad `Count` es superior a 1, el valor `UniqueId` para cada señal debe ser único entre todas las señales enviadas a una condición de espera en particular. El `UniqueId` es una cadena alfanumérica arbitraria.

   Un comando `curl` es una forma de enviar una señal. El siguiente ejemplo muestra una línea de comandos `curl` que señala el éxito a una condición de espera.

   ```
   $ curl -T /tmp/a \
     "https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
   ```

   donde el archivo *`/tmp/a`* contiene la siguiente estructura JSON:

   ```
   {
      "Status" : "SUCCESS",
      "Reason" : "Configuration Complete",
      "UniqueId" : "ID1234",
      "Data" : "Application has completed configuration."
   }
   ```

   En este ejemplo se muestra una línea de comandos `curl` que envía la misma señal de éxito, salvo que envía la estructura JSON como parámetro en la línea de comandos.

   ```
   $ curl -X PUT \
     -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' \
     "https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
   ```

## Sintaxis de señal de condición de espera
<a name="wait-condition-signal-syntax"></a>

Cuando envía señales a la URL generada por el administrador de la condición de espera, tiene que utilizar el siguiente formato JSON:

```
{
  "Status" : "StatusValue",
  "UniqueId" : "Some UniqueId",
  "Data" : "Some Data",
  "Reason" : "Some Reason"
}
```

### Propiedades
<a name="wait-condition-signal-properties"></a>

El campo `Status` debe tener uno de los siguientes valores:
+ `SUCCESS`
+ `FAILURE`

El campo `UniqueId` identifica la señal a CloudFormation. Si la propiedad `Count` de la condición de espera es superior a 1, el valor `UniqueId` debe ser único en todas las señales enviadas para una determinada condición de espera; de lo contrario, CloudFormation considerará que la señal es una retransmisión de la señal enviada con anterioridad con el mismo `UniqueId` y la ignorará.

El campo `Data` puede contener cualquier información que desea devolver con la señal. Puede acceder al valor `Data` usando la función [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt) dentro de la plantilla.

El campo `Reason` es una cadena sin ninguna restricción en su contenido, salvo la conformidad de JSON.

## Acceso a los datos de señales
<a name="wait-condition-access-signal-data"></a>

Para acceder a los datos enviados por señales válidas, puede crear un valor de salida para la condición de espera en la plantilla de CloudFormation. Por ejemplo:

```
Outputs:
  WaitConditionData:
    Description: The data passed back as part of signalling the WaitCondition
    Value: !GetAtt MyWaitCondition.Data
```

Luego, puede ver estos datos con el comando [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html) o la pestaña **Salida** de la consola de CloudFormation.

La función `Fn::GetAtt` devuelve los valores `UniqueId` y `Data` como un par nombre-valor dentro de una estructura JSON. Por ejemplo:

```
{"Signal1":"Application has completed configuration."}
```

# Creación de configuraciones de recursos reutilizables que se puedan incluir en las plantillas con los módulos de CloudFormation
<a name="modules"></a>

Los*módulos* son una forma de empaquetar configuraciones de recursos para su inclusión en plantillas de pila, de forma transparente, administrable y repetible. Los módulos pueden encapsular configuraciones de servicios comunes y prácticas recomendadas como componentes esenciales modulares y personalizables para que pueda incluirlos en las plantillas de pila. Los módulos le permiten incluir configuraciones de recursos que incorporan prácticas recomendadas, conocimientos de dominio experto y directrices aceptadas en sus plantillas (para áreas como seguridad, cumplimiento, gestión y regulaciones del sector), sin tener que adquirir un conocimiento profundo de las complejidades de la implementación de recursos.

Por ejemplo, un experto en redes podría crear un módulo que contenga grupos de seguridad integrados y reglas de entrada/salida que cumplan con las directrices de seguridad. A continuación, podría incluir ese módulo en la plantilla para aprovisionar una infraestructura de red segura en su pila, sin tener que dedicar tiempo a averiguar cómo funcionan las VPC, las subredes, los grupos de seguridad y las gateway. Y dado que los módulos están versionados, si las pautas de seguridad cambian con el tiempo, el autor del módulo podría crear una nueva versión del módulo que incorpore esos cambios.

Las características del uso de módulos en sus plantillas incluyen:
+ **Previsibilidad**: un módulo debe cumplir con el esquema que registra en el registro de CloudFormation, para que sepa en qué recursos puede resolver una vez que lo incluya en la plantilla.
+ **Reutilización**: puede usar el mismo módulo en varias plantillas y cuentas.
+ **Trazabilidad**: CloudFormation retiene el conocimiento de qué recursos de una pila se aprovisionaron desde un módulo, lo que le permite comprender fácilmente el origen de los cambios en los recursos.
+ **Capacidad de administración**: una vez registrado un módulo, puede administrarlo a través del registro de CloudFormation, incluido el control de versiones y la disponibilidad de cuentas y regiones.

Un módulo puede contener:
+ Uno o más recursos que se aprovisionarán desde el módulo, junto con cualquier dato asociado, como salidas o condiciones.
+ Cualquier parámetro del módulo, que le permite especificar valores personalizados cada vez que se utiliza el módulo.

Para obtener información sobre el desarrollo de módulos, consulte [Desarrollo de módulos](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/modules.html) en la *Guía del usuario de CLI de CloudFormation*.

**Topics**
+ [Consideraciones sobre el uso de módulos](#module-considerations)
+ [Comprensión del control de versiones del módulo](module-versioning.md)
+ [Uso de módulos del registro privado de CloudFormation](modules-using.md)
+ [Uso de parámetros para especificar valores de módulo](module-using-params.md)
+ [Recursos del módulo de referencia en las plantillas de CloudFormation](module-ref-resources.md)

## Consideraciones sobre el uso de módulos
<a name="module-considerations"></a>
+ El uso de los módulos no conlleva ningún coste adicional. Usted paga sólo por los recursos a los que esos módulos resuelven en sus pilas.
+ Las cuotas de CloudFormation, como el número máximo de recursos permitidos en una pila o el tamaño máximo del cuerpo de la plantilla, se aplican a la plantilla procesada independientemente de si los recursos incluidos en esa plantilla provienen de módulos o no. Para obtener más información, consulte [Comprensión de las cuotas de CloudFormation](cloudformation-limits.md).
+ Las etiquetas que especifique en el nivel de pila se asignan a los recursos individuales derivados del módulo.
+ Los scripts auxiliares especificados en el nivel de módulo no se propagan a los recursos individuales contenidos en el módulo cuando CloudFormation procesa la plantilla.
+ Las salidas especificadas en el módulo se propagan a las salidas a nivel de plantilla.

  A cada salida se le asignará un ID lógico, que es una concatenación del nombre lógico del módulo y el nombre de salida tal como se define en el módulo. Para obtener más información, consulte [Obtención de salidas exportadas de una pila implementada de CloudFormation](using-cfn-stack-exports.md).
+ Los parámetros especificados en el módulo no se propagan a parámetros a nivel de plantilla.

  Sin embargo, puede crear parámetros de nivel de plantilla que hagan referencia a parámetros de nivel de módulo. Para obtener más información, consulte [Uso de parámetros para especificar valores de módulo](module-using-params.md).

# Comprensión del control de versiones del módulo
<a name="module-versioning"></a>

El registro de CloudFormation actúa como un repositorio en el que puede registrar y administrar los módulos para usarlos en su Cuenta de AWS y en su región. Puede registrar módulos de diversas fuentes, como publicadores de terceros de AWS y sus propias extensiones personalizadas en su cuenta y región. Para obtener más información, consulte [Administración de extensiones a través del registro de CloudFormation](registry.md).

Los módulos pueden tener diferentes versiones, por lo que puede especificar qué versión del módulo desea utilizar. Esta capacidad de control de versiones es especialmente útil cuando se necesita actualizar o modificar un módulo sin interrumpir las pilas existentes que dependen de él.

Tenga en cuenta las siguientes consideraciones al utilizar varias versiones de un módulo:
+ Durante las operaciones de pila, CloudFormation usa cualquier versión del módulo que esté actualmente registrada como la versión predeterminada en la Cuenta de AWS y región en la que se realice la operación de pila. Esto incluye módulos anidados en otros módulos.

  Por lo tanto, tenga en cuenta que si tiene diferentes versiones del mismo módulo registradas como la versión predeterminada en diferentes cuentas o regiones, el uso de la misma plantilla puede dar lugar a resultados diferentes.
+ Durante las operaciones de pila, CloudFormation usa cualquier versión del recurso que esté actualmente registrada como la versión predeterminada en la Cuenta de AWS y región en la que se realice la operación de pila. Esto incluye los recursos generados mediante la inclusión de módulos.
+ El cambio de la versión predeterminada de un módulo no inicia ninguna operación de actualización de pila. Sin embargo, la próxima vez que realice una operación de pila con cualquier plantilla que contenga ese módulo, como una actualización de pila, CloudFormation utilizará la nueva versión predeterminada en la operación.

  La única excepción a esto es realizar una actualización de pila con la opción **usar plantilla anterior** especificada, como se describe a continuación.
+ Para las operaciones de actualización de pila, si especifica la opción **usar plantilla anterior**, CloudFormation utiliza la plantilla procesada anterior para la actualización de la pila y no vuelve a procesar el módulo para los cambios que pueda haber realizado en él.
+ Para garantizar resultados uniformes, si incluye módulos en una plantilla de pila para su uso con conjuntos de pilas, debe asegurarse de que la misma versión del módulo esté establecida como la versión predeterminada en todas las cuentas y regiones en las que planea implementar las instancias de pila. Esto incluye los módulos que están anidados en otros módulos. Para obtener más información, consulte [Administración de pilas entre cuentas y regiones con StackSets](what-is-cfnstacksets.md).

## Requisitos para activar módulos públicos de terceros
<a name="requirements-for-modules"></a>

Para activar correctamente un módulo público de terceros en su cuenta y región, debe cumplirse lo siguiente para cada extensión pública de terceros (recurso o módulo) incluida en el módulo:
+ **Activación de la extensión**: la extensión debe estar activada en la cuenta y la región en las que desee utilizarla. Para obtener más información, consulte [Utilización de extensiones públicas de terceros del registro de CloudFormation](registry-public.md).
+ **Registro del alias**: si la extensión del módulo usa un alias de nombre de tipo, la extensión debe estar registrada en su cuenta y región con el mismo alias de nombre de tipo. Para obtener más información, consulte [Utilización de alias para hacer referencia a extensiones](registry-public.md#registry-public-enable-alias).
+ **Compatibilidad de la versión**: la versión de la extensión actualmente activada debe ser una de las versiones principales admitidas de esa extensión especificadas en el módulo.

Si no tiene activadas las extensiones públicas de terceros y las versiones de extensión correctas, se producirá un error en la operación de CloudFormation que enumera las extensiones o versiones que deben activarse antes de que el módulo se pueda activar correctamente.

# Uso de módulos del registro privado de CloudFormation
<a name="modules-using"></a>

En este tema se explica cómo utilizar los módulos en las plantillas de CloudFormation. Piense en los módulos como agrupaciones de recursos prediseñados que puede agregar a sus plantillas.

Para usar un módulo, los pasos son los siguientes:
+ **Registre los módulos**: registre los módulos en el registro de CloudFormation como extensiones privadas. Asegúrese de que esté registrado en la Cuenta de AWS y en la región en la que trabaja. Para obtener más información, consulte [Conceptos de registro de CloudFormation](registry-concepts.md).
+ **Inclúyalo en la plantilla**: agrega el módulo a la sección [Resources](resources-section-structure.md) de la plantilla de CloudFormation, tal como lo haría con otros recursos. También tendrá que proporcionar las propiedades necesarias para el módulo.
+ **Cree o actualice la pila**: al iniciar una operación de pila, CloudFormation genera una plantilla procesada que resuelve los módulos incluidos en los recursos apropiados. 
+ **Previsualice de los cambios**: antes de realizar cambios, puede usar un conjunto de cambios para ver qué recursos se agregarán o cambiarán. Para obtener más información, consulte [Actualización de pilas de CloudFormation con conjuntos de cambios](using-cfn-updating-stacks-changesets.md).

Considere el siguiente ejemplo: tiene una plantilla que contiene recursos y módulos. La plantilla contiene un recurso individual, `ResourceA`, como así también un módulo, `ModuleParent`. Ese módulo contiene dos recursos, `ResourceB` y `ResourceC`, además de un módulo anidado, `ModuleChild`. `ModuleChild` contiene un único recurso, `ResourceD`. Si crea una pila a partir de esta plantilla, CloudFormation procesa la plantilla y resuelve los módulos a los recursos apropiados. La pila resultante tiene cuatro recursos: `ResourceA`, `ResourceB`, `ResourceC` y `ResourceD`.

![\[Durante una operación de pila, CloudFormation resuelve los dos módulos incluidos en la plantilla de pila en los cuatro recursos apropiados.\]](http://docs.aws.amazon.com/es_es/AWSCloudFormation/latest/UserGuide/images/modules-resource-inclusion.png)


CloudFormation realiza un seguimiento de los recursos de una pila que se crearon a partir de módulos. Puede ver esta información en las pestañas **Eventos**, **Recursos** y **Desviaciones** de una pila determinada, y también se incluye en vistas previas de conjuntos de cambios.

Los módulos se distinguen de los recursos de una plantilla porque se adhieren a la siguiente convención de nomenclatura de cuatro partes, a diferencia de la típica convención de tres partes utilizada por los recursos:

```
organization::service::use-case::MODULE
```

# Uso de parámetros para especificar valores de módulo
<a name="module-using-params"></a>

En CloudFormation, puede usar plantillas de parámetros para personalizar las pilas al proporcionar valores de entrada durante la creación o actualización de la pila. Estos parámetros le permiten cambiar ciertos aspectos de la pila en función de sus necesidades. Para obtener más información sobre cómo definir parámetros de plantilla, consulte [Sintaxis de Parameters de la plantilla de CloudFormation](parameters-section-structure.md).

Del mismo modo, los módulos también pueden tener parámetros. Estos parámetros del módulo le permiten introducir valores personalizados en el módulo desde la plantilla (u otro módulo) que lo está utilizando. A continuación, el módulo puede utilizar estos valores personalizados para establecer los valores de propiedades de los recursos que contiene.

También puede definir parámetros de plantilla que establecen las propiedades del módulo, de modo que puedes introducir valores que se pasan al módulo en el momento de la operación de pila. 

Si un módulo contiene un módulo anidado que tiene sus propios parámetros del módulo, puede:
+ Especificar los valores de los parámetros del módulo anidado directamente en el módulo principal.
+ Definir los parámetros correspondientes del módulo en el módulo principal que permitan que los parámetros del módulo anidado sean establecidos por la plantilla (o módulo) en la que está contenido el módulo principal.

## Uso de parámetros de plantilla para especificar valores de parámetros del módulo
<a name="module-using-params-example-1"></a>

El siguiente ejemplo muestra cómo definir parámetros de plantilla que pasan valores a un módulo.

Esta plantilla que contiene `My::S3::SampleBucket::MODULE` define un parámetro de plantilla `BucketName`, que permite al usuario especificar un nombre de bucket de S3 durante la operación de pila.

```
# Template containing My::S3::SampleBucket::MODULE
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: 'My::S3::SampleBucket::MODULE'
    Properties:
      BucketName: !Ref BucketName
```

## Especificación de propiedades en recursos de un módulo secundario desde el módulo principal
<a name="module-using-params-example-2"></a>

El ejemplo siguiente ilustra cómo especificar valores de parámetro en un módulo anidado dentro de otro módulo.

Este primer módulo, `My::S3::SampleBucketPrivate::MODULE`, será el módulo secundario. Define dos parámetros: `BucketName` y `AccessControl`. Los valores especificados para estos parámetros se utilizan para especificar las propiedades `BucketName` y `AccessControl` del recurso `AWS::S3::Bucket` que contiene el módulo. A continuación se muestra el fragmento de plantilla para `My::S3::SampleBucketPrivate::MODULE`.

```
# My::S3::SampleBucketPrivate::MODULE
AWSTemplateFormatVersion: 2010-09-09
Description: A sample S3 Bucket with Versioning and DeletionPolicy.
Parameters:
  BucketName:
    Description: Name for the bucket
    Type: String
  AccessControl:
    Description: AccessControl for the bucket
    Type: String
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
      AccessControl: !Ref AccessControl
      DeletionPolicy: Retain
      VersioningConfiguration:
        Status: Enabled
```

A continuación, el módulo anterior se anida dentro de un módulo principal, `My::S3::SampleBucket::MODULE`. El módulo principal, `My::S3::SampleBucket::MODULE`, establece los parámetros del módulo secundario de las siguientes maneras:
+ Establece el parámetro `AccessControl` de `My::S3::SampleBucketPrivate::MODULE` a `Private`.
+ Para `BucketName`, define un parámetro de módulo, que permitirá que el nombre del bucket se especifique en la plantilla (o módulo) que contiene `My::S3::SampleBucket::MODULE`.

```
# My::S3::SampleBucket::MODULE
AWSTemplateFormatVersion: 2010-09-09
Description: A sample S3 Bucket. With Private AccessControl.
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: 'My::S3::SampleBucketPrivate::MODULE'
    Properties:
      BucketName: !Ref BucketName
      AccessControl: Private
```

## Especificación de restricciones para parámetros de módulo
<a name="modules-using-parameters-constraints"></a>

Los parámetros del módulo no admiten la restricción de ejecución. Para comprobar la restricción en un parámetro de módulo, cree un parámetro de plantilla con las restricciones deseadas. A continuación, haga referencia a ese parámetro de plantilla en el parámetro del módulo. Para obtener más información sobre cómo definir parámetros de plantilla, consulte [Sintaxis de Parameters de la plantilla de CloudFormation](parameters-section-structure.md).

# Recursos del módulo de referencia en las plantillas de CloudFormation
<a name="module-ref-resources"></a>

En las plantillas de CloudFormation, a menudo, es necesario establecer las propiedades de un recurso en función del nombre o la propiedad de otro recurso. Para obtener más información, consulte [Recursos de referencia](resources-section-structure.md#using-cross-resource-references).

Para hacer referencia a un recurso contenido en un módulo de la plantilla de CloudFormation, debe combinar dos nombres lógicos:
+ El nombre lógico que asignó al módulo en sí cuando lo incluyó en la plantilla.
+ El nombre lógico del recurso específico de ese módulo.

Puede combinar estos dos nombres lógicos con o sin usar un punto (.) entre ellos. Por ejemplo, si el nombre lógico del módulo es `MyModule` y el nombre lógico del recurso es `MyBucket`, puede hacer referencia a ese recurso como `MyModule.MyBucket` o `MyModuleMyBucket`.

Para encontrar los nombres lógicos de los recursos de un módulo, puede consultar el esquema del módulo, que está disponible en el registro de CloudFormation o mediante la operación [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html). El esquema muestra todos los recursos y sus nombres lógicos que forman parte del módulo.

Una vez que tenga el nombre lógico completo, puede usar las funciones de CloudFormation, como `GetAtt` y `Ref` para acceder a los valores de propiedad en los recursos del módulo. 

Por ejemplo, tiene un módulo `My::S3::SampleBucket::MODULE` que contiene un recurso `AWS::S3::Bucket` con el nombre lógico `S3Bucket`. Para hacer referencia al nombre de este bucket mediante la función `Ref`, combine el nombre del módulo de la plantilla (`MyBucket`) con el nombre lógico del recurso del módulo (`S3Bucket`). El nombre lógico completo es `MyBucket.S3Bucket` o `MyBucketS3Bucket`.

**Plantilla de ejemplo**  
La siguiente plantilla de ejemplo crea un bucket de S3 mediante el módulo `My::S3::SampleBucket::MODULE`. También crea una cola de Amazon SQS y establece su nombre para que sea el mismo que el nombre del bucket del módulo. Además, la plantilla devuelve el nombre de recurso de Amazon (ARN) del bucket de S3 creado.

```
# Template that uses My::S3::SampleBucket::MODULE
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: My::S3::SampleBucket::MODULE
    Properties:
      BucketName: !Ref BucketName
  exampleQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !Ref MyBucket.S3Bucket
Outputs:
  BucketArn:
    Value: !GetAtt MyBucket.S3Bucket.Arn
```