Descripción de los módulos de Terraform - AWS Orientación prescriptiva

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Descripción de los módulos de Terraform

En el ámbito de la infraestructura como código (IaC), un módulo es un bloque de código autónomo que se aísla y se empaqueta para su reutilización. El concepto de módulos es un aspecto ineludible del desarrollo de Terraform. Para obtener más información, consulte los módulos en la documentación de Terraform. AWS CloudFormation también admite módulos. Para obtener más información, consulte Introducción a AWS CloudFormation los módulos en el blog sobre operaciones y migraciones en la AWS nube.

La principal diferencia entre los módulos de Terraform CloudFormation es que CloudFormation los módulos se importan mediante un tipo de recurso especial ()AWS::CloudFormation::ModuleVersion. En Terraform, cada configuración tiene al menos un módulo, conocido como módulo raíz. Los recursos de Terraform que se encuentran en el archivo.tf principal o los archivos de un archivo de configuración de Terraform se consideran en el módulo raíz. Luego, el módulo raíz puede llamar a otros módulos para incluirlos en la pila. El siguiente ejemplo muestra un módulo raíz que aprovisiona un clúster de Amazon Elastic Kubernetes Service (Amazon EKS) mediante el módulo eks de código abierto.

terraform { required_providers { helm = { source = "hashicorp/helm" version = "2.12.1" } } required_version = ">= 1.2.0" } module "eks" { source = "terraform-aws-modules/eks/aws" version = "20.2.1" vpc_id = var.vpc_id } provider "helm" { kubernetes { host = module.eks.cluster_endpoint cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data) } }

Es posible que haya observado que el archivo de configuración anterior no incluye al proveedor. AWS Esto se debe a que los módulos son autónomos y pueden incluir sus propios proveedores. Como los proveedores de Terraform son globales, los proveedores de un módulo secundario se pueden usar en el módulo raíz. Sin embargo, esto no es cierto para todos los valores de los módulos. De forma predeterminada, otros valores internos de un módulo se limitan únicamente a ese módulo y deben declararse como salidas para que se pueda acceder a ellos en el módulo raíz. Puede aprovechar los módulos de código abierto para simplificar la creación de recursos dentro de su pila. Por ejemplo, el módulo eks hace más que aprovisionar un clúster de EKS: aprovisiona un entorno de Kubernetes en pleno funcionamiento. Su uso puede ahorrarle tener que escribir docenas de líneas de código adicionales, siempre que la configuración del módulo eks se adapte a sus necesidades.

Módulos de llamadas

Dos de los principales comandos CLI de Terraform que se ejecutan durante la implementación de Terraform son terraform init y terraform apply. Uno de los pasos predeterminados que realiza el terraform init comando es localizar todos los módulos secundarios e importarlos como dependencias al directorio. .terraform/modules Durante el desarrollo, siempre que añada un nuevo módulo de origen externo, debe volver a inicializarlo antes de utilizar el comando. apply Cuando escuchas una referencia a un módulo de Terraform, se refiere a los paquetes de este directorio. Estrictamente hablando, el módulo que declaras en tu código es el módulo de llamada, por lo que, en la práctica, la palabra clave module llama al módulo real, que se almacena como una dependencia.

De esta manera, el módulo de llamada sirve como una representación más sucinta del módulo completo que se reemplazará cuando se lleve a cabo el despliegue. Puedes aprovechar esta idea creando tus propios módulos dentro de tus pilas para reforzar la separación lógica de los recursos utilizando los criterios que desees. Recuerda que el objetivo final de hacer esto debería ser reducir la complejidad de tus pilas. Dado que compartir datos entre módulos requiere generar esos datos desde dentro del módulo, a veces confiar demasiado en los módulos puede complicar demasiado las cosas.

El módulo raíz

Como cada configuración de Terraform tiene al menos un módulo, puede ser útil examinar las propiedades del módulo con el que más se va a tratar: el módulo raíz. Siempre que trabajes en un proyecto de Terraform, el módulo raíz se compone de todos los .tf (o.tf.json) archivos de tu directorio de nivel superior. Cuando ejecutas terraform apply en ese directorio de nivel superior, Terraform intenta ejecutar todos los .tf archivos que encuentra allí. Todos los archivos de los subdirectorios se ignoran a menos que se invoquen en uno de estos archivos de configuración de nivel superior.

Esto proporciona cierta flexibilidad a la hora de estructurar el código. También es la razón por la que es más preciso referirse a su implementación de Terraform como un módulo que como un archivo, ya que varios archivos podrían estar involucrados en un solo proceso. Existe una estructura de módulos estándar que Terraform recomienda como prácticas recomendadas. Sin embargo, si colocara cualquier .tf archivo en su directorio de nivel superior, se ejecutaría junto con el resto de los archivos. De hecho, todos los .tf archivos de nivel superior de un módulo se despliegan cuando se ejecuta. terraform apply Entonces, ¿qué archivo ejecuta Terraform primero? La respuesta a esa pregunta es muy importante.

Hay una serie de pasos que Terraform lleva a cabo después de la inicialización y antes del despliegue de la pila. En primer lugar, se analizan las configuraciones existentes y, a continuación, se crea un gráfico de dependencias. El gráfico de dependencia determina qué recursos se requieren y en qué orden deben abordarse. Los recursos que contienen propiedades a las que se hace referencia en otros recursos, por ejemplo, se gestionarían antes que sus recursos dependientes. Del mismo modo, los recursos que declaran la dependencia de forma explícita mediante el depends_on parámetro se gestionarán después de los recursos que especifiquen. Cuando sea posible, Terraform puede implementar el paralelismo y gestionar recursos no dependientes simultáneamente. Puede ver el gráfico de dependencias antes de implementarlo mediante el comando terraform graph.

Una vez creado el gráfico de dependencias, Terraform determina lo que hay que hacer durante la implementación. Compara el gráfico de dependencias con el archivo de estado más reciente. El resultado de este proceso se denomina plan y es muy parecido a un conjunto de CloudFormation cambios. Puede ver el plan actual mediante el comando terraform plan.

Como práctica recomendada, se recomienda permanecer lo más cerca posible de la estructura de módulos estándar. En los casos en los que los archivos de configuración sean demasiado largos para gestionarlos de forma eficiente y las separaciones lógicas puedan simplificar la administración, puede distribuir el código en varios archivos. Ten en cuenta cómo funcionan el gráfico de dependencias y el proceso de planificación para que tus pilas funcionen de la forma más eficiente posible.