

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