• ¡Obtenga la seguridad de la aplicación de la manera correcta! Detectar, proteger, monitorear, acelerar y más ...
  • Preguntándose, ¿qué es Terraform? Descubrámoslo.

    Infraestructura como código (IaC) es una terminología generalizada entre DevOps Profesionales. Es el proceso de administrar y aprovisionar la infraestructura de TI completa (comprende tanto máquinas físicas como virtuales) utilizando archivos de definición legibles por máquina. Es un enfoque de ingeniería de software para las operaciones. Ayuda a automatizar el centro de datos completo mediante el uso de scripts de programación.

    Con todas las características que Infraestructura como Código proporciona, tiene múltiples desafíos:

    • Necesito aprender a codificar
    • No conozco el impacto del cambio.
    • Necesito revertir el cambio
    • No puedo rastrear cambios
    • No se puede automatizar un recurso
    • Múltiples entornos para infraestructura

    Terraform se ha creado para resolver estos desafíos.

    ¿Qué es Terraform?

    Terraform es una infraestructura de código abierto como herramienta de código desarrollada por HashiCorp. Se utiliza para definir y aprovisionar la infraestructura completa utilizando un lenguaje declarativo fácil de aprender.

    Es una herramienta de aprovisionamiento de infraestructura donde puede almacenar la configuración de su infraestructura en la nube como códigos. Es muy similar a herramientas como CloudFormation, que usaría para automatizar su infraestructura de AWS, pero solo puede usarla en AWS. Con Terraform, puede usarlo en otros plataformas en la nube también.

    A continuación se muestran algunos de los beneficios de usar Terraform.

    • Realiza orquestación, no solo gestión de configuración
    • Admite múltiples proveedores como AWS, Azure, GCP, DigitalOcean y muchos más
    • Proporcionar una infraestructura inmutable donde la configuración cambia sin problemas
    • Utiliza un lenguaje fácil de entender, HCL (lenguaje de configuración de HashiCorp)
    • Fácilmente portátil a cualquier otro proveedor
    • Admite arquitectura de solo cliente, por lo que no es necesario administrar la configuración adicional en un servidor

    Conceptos básicos de Terraform

    A continuación se muestran los conceptos / terminologías centrales que se utilizan en Terraform:

    • Variables: También se utiliza como variables de entrada, es un par clave-valor utilizado por los módulos Terraform para permitir la personalización.
    • Proveedor: Es un complemento para interactuar con las API de servicio y acceder a sus recursos relacionados.
    • Módulo: Es una carpeta con plantillas Terraform donde se definen todas las configuraciones
    • Estado: Consiste en información en caché sobre la infraestructura administrada por Terraform y las configuraciones relacionadas.
    • Recursos: Se refiere a un bloque de uno o más objetos de infraestructura (instancias de cómputo, redes virtuales, etc.), que se utilizan para configurar y administrar la infraestructura.
    • Fuente de datos: Los proveedores lo implementan para devolver información sobre objetos externos a terraform.
    • Valores de salida: Estos son valores de retorno de un módulo terraform que pueden ser utilizados por otras configuraciones.
    • Planeación: Es una de las etapas en las que determina qué se debe crear, actualizar o destruir para pasar del estado real / actual de la infraestructura al estado deseado.
    • Buscar: Es una de las etapas donde se aplican los cambios de estado real / actual de la infraestructura para pasar al estado deseado.

    Ciclo de vida de Terraform

    El ciclo de vida de Terraform consiste en: init, plan, aplicar, destruir.

    ciclo de vida terraform - geekflare
    • Terraform init inicializa el directorio de trabajo que consta de todos los archivos de configuración
    • El plan Terraform se utiliza para crear un plan de ejecución para alcanzar el estado deseado de la infraestructura. Los cambios en los archivos de configuración se realizan para lograr el estado deseado.
    • Terraform Apply luego realiza los cambios en la infraestructura tal como se define en el plan, y la infraestructura llega al estado deseado.
    • La destrucción de Terraform se utiliza para eliminar todos los recursos de infraestructura antiguos, que están marcados como contaminados después de la fase de aplicación.

    ¿Cómo funciona Terraform?

    Terraform tiene dos componentes principales que conforman su arquitectura:

    • Terraform Core
    • Proveedores Médicos
    arquitectura terraform - geekflare

    Terraform Core

    Terraform core utiliza dos fuentes de entrada para hacer su trabajo.

    El patrón de primeras La fuente de entrada es una configuración de Terraform que usted, como usuario, configura. Aquí, usted define lo que debe crearse o aprovisionarse. Y el segunda La fuente de entrada es un estado en el que terraform mantiene el estado actualizado de cómo se ve la configuración actual de la infraestructura.

    Entonces, lo que hace terraform core es tomar la información y determinar el plan de lo que se debe hacer. Compara el estado, cuál es el estado actual y cuál es la configuración que desea en el resultado final. Averigua qué se debe hacer para llegar al estado deseado en el archivo de configuración. Calcula lo que se debe crear, lo que se debe actualizar, lo que se debe eliminar para crear y aprovisionar la infraestructura.

    Proveedores Médicos

    El segundo componente de la arquitectura son los proveedores de tecnologías específicas. Esto podría ser proveedores de nube como AWS, Azure, GCP u otra infraestructura como plataforma de servicio. También es un proveedor de componentes de más alto nivel como Kubernetes u otras herramientas de plataforma como servicio, incluso algún software como herramienta de autoservicio.

    Te da la posibilidad de crear infraestructura en diferentes niveles.

    Por ejemplo, cree una infraestructura de AWS, luego implemente Kubernetes encima y luego cree servicios / componentes dentro de ese clúster de Kubernetes.

    Terraform tiene más de cien proveedores para diferentes tecnologías, y cada proveedor luego brinda acceso de usuario de terraform a sus recursos. Entonces, a través del proveedor de AWS, por ejemplo, tiene acceso a cientos de recursos de AWS como instancias EC2, los usuarios de AWS, etc. Con el proveedor de Kubernetes, tiene acceso a productos básicos, recursos como servicios e implementaciones y espacios de nombres, etc.

    Entonces, así es como funciona Terraform, y de esta manera, intenta ayudarlo a aprovisionar y cubrir la configuración completa de la aplicación desde la infraestructura hasta la aplicación.

    Hagamos algunas cosas prácticas. 👨‍💻

    Instalaremos Terraform en Ubuntu y proporcionaremos una infraestructura muy básica.

    Instalar Terraform

    Descargue el último paquete terraform.

    Referirse a La página oficial de descargas para obtener la última versión para el sistema operativo respectivo.

    [email protected]:~$ wget https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
    --2020-08-14 16:55:38--
    https://releases.hashicorp.com/terraform/0.13.0/terraform_0.13.0_linux_amd64.zip
    Resolving releases.hashicorp.com (releases.hashicorp.com)... 151.101.153.183, 2a04:4e42:24::439
    Connecting to releases.hashicorp.com (releases.hashicorp.com)|151.101.153.183|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 34851622 (33M) [application/zip]
    Saving to: ‘terraform_0.13.0_linux_amd64.zip’
    
    terraform_0.13.0_linux_amd64.zip
    100%[=================================================================>] 33.24M
    90.3KB/s in 5m 28s
    
    2020-08-14 17:01:06 (104 KB/s) - ‘terraform_0.13.0_linux_amd64.zip’ saved [34851622/34851622]

    Extraiga el paquete descargado.

    [email protected]:~$ unzip terraform_0.13.0_linux_amd64.zip
    Archive:
    terraform_0.13.0_linux_amd64.zip
    inflating: terraform

    Mueva el archivo ejecutable terraform a la ruta que se muestra a continuación. Consulta la versión terraform.

    [email protected]:~$ sudo mv terraform /usr/local/bin/
    [sudo] password for geekflare:
    [email protected]:~$ terraform -v
    Terraform v0.13.0

    Puede ver que estos son los comandos disponibles en terraform para su ejecución.

    [email protected]:~$ terraform
    Usage: terraform [-version] [-help] <command> [args]
    
    The available commands for execution are listed below.
    The most common, useful commands are shown first, followed by
    less common or more advanced commands. If you're just getting
    started with Terraform, stick with the common commands. For the
    other commands, please read the help and docs before usage.
    
    Common commands:
    apply Builds or changes infrastructure
    console Interactive console for Terraform interpolations
    destroy Destroy Terraform-managed infrastructure
    env Workspace management
    fmt Rewrites config files to canonical format
    get Download and install modules for the configuration
    graph Create a visual graph of Terraform resources
    import Import existing infrastructure into Terraform
    init Initialize a Terraform working directory
    login Obtain and save credentials for a remote host
    logout Remove locally-stored credentials for a remote host
    output Read an output from a state file
    plan Generate and show an execution plan
    providers Prints a tree of the providers used in the configuration
    refresh Update local state file against real resources
    show Inspect Terraform state or plan
    taint Manually mark a resource for recreation
    untaint Manually unmark a resource as tainted
    validate Validates the Terraform files
    version Prints the Terraform version
    workspace Workspace management
    
    All other commands:
    0.12upgrade Rewrites pre-0.12 module source code for v0.12
    0.13upgrade Rewrites pre-0.13 module source code for v0.13
    debug Debug output management (experimental)
    force-unlock Manually unlock the terraform state
    push Obsolete command for Terraform Enterprise legacy (v1)
    state Advanced state management

    Aprovisionar instancia de AWS EC2 mediante Terraform

    En esta demostración, voy a lanzar una nueva instancia de AWS EC2 usando Terraform.

    Cree un directorio de trabajo para esta demostración de Terraform.

    [email protected]:~$ mkdir terraform_demo

    Vaya al directorio y cree un archivo de configuración de terraform donde define el proveedor y los recursos para lanzar una instancia de AWS EC2.

    [email protected]:~$ cd terraform_demo/
    [email protected]:~/terraform_demo$ gedit awsec2.tf
    
    provider "aws" {
    access_key = "B5KG6Fe5GUKIATUF5UD"
    secret_key = "R4gb65y56GBF6765ejYSJA4YtaZ+T6GY7H"
    region = "us-west-2"
    }
    
    resource "aws_instance" "terraform_demo" {
    ami = "ami-0a634ae95e11c6f91"
    instance_type = "t2.micro"
    }

    Nota: He cambiado las claves secretas y de acceso 😛, debes usar las tuyas.

    De la configuración mencionada anteriormente, puede ver que estoy mencionando al proveedor como AWS. Dentro del proveedor, proporciono credenciales de usuario de AWS y regiones donde se debe lanzar la instancia.

    En recursos, estoy dando detalles de AMI de Ubuntu (ami-0a634ae95e11c6f91) y menciono que el tipo de instancia debería ser t2.micro

    Puede ver lo fácil y legible que es el archivo de configuración, incluso si no es un codificador empedernido.

    terraform init

    Ahora, el primer paso es inicializar terraform.

    [email protected]:~/terraform_demo$ terraform init
    
    Initializing the backend...
    
    Initializing provider plugins...
    - Using previously-installed hashicorp/aws v3.2.0
    
    The following providers do not have any version constraints in configuration,
    so the latest version was installed.
    
    To prevent automatic upgrades to new major versions that may contain breaking
    changes, we recommend adding version constraints in a required_providers block
    in your configuration, with the constraint strings suggested below.
    
    * hashicorp/aws: version = "~> 3.2.0"
    
    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.

    plan terraform

    La siguiente es la etapa del plan; creará el gráfico de ejecución para crear y aprovisionar la infraestructura.

    [email protected]:~/terraform_demo$ terraform plan
    Refreshing Terraform state in-memory prior to plan...
    The refreshed state will be used to calculate this plan, but will not be
    persisted to local or remote state storage.
    
    ------------------------------------------------------------------------
    
    An execution plan has been generated and is shown below.
    Resource actions are indicated with the following symbols:
    + create
    
    Terraform will perform the following actions:
    
    # aws_instance.terraform_demo will be created
    + resource "aws_instance" "terraform_demo" {
    + ami = "ami-0a634ae95e11c6f91"
    + arn = (known after apply)
    + associate_public_ip_address = (known after apply)
    + availability_zone = (known after apply)
    + cpu_core_count = (known after apply)
    + cpu_threads_per_core = (known after apply)
    + get_password_data = false
    + host_id = (known after apply)
    + id = (known after apply)
    + instance_state = (known after apply)
    + instance_type = "t2.micro"
    + ipv6_address_count = (known after apply)
    + ipv6_addresses = (known after apply)
    + key_name = (known after apply)
    + outpost_arn = (known after apply)
    + password_data = (known after apply)
    + placement_group = (known after apply)
    + primary_network_interface_id = (known after apply)
    + private_dns = (known after apply)
    + private_ip = (known after apply)
    + public_dns = (known after apply)
    + public_ip = (known after apply)
    + secondary_private_ips = (known after apply)
    + security_groups = (known after apply)
    + source_dest_check = true
    + subnet_id = (known after apply)
    + tenancy = (known after apply)
    + volume_tags = (known after apply)
    + vpc_security_group_ids = (known after apply)
    
    + ebs_block_device {
    + delete_on_termination = (known after apply)
    + device_name = (known after apply)
    + encrypted = (known after apply)
    + iops = (known after apply)
    + kms_key_id = (known after apply)
    + snapshot_id = (known after apply)
    + volume_id = (known after apply)
    + volume_size = (known after apply)
    + volume_type = (known after apply)
    }
    
    + ephemeral_block_device {
    + device_name = (known after apply)
    + no_device = (known after apply)
    + virtual_name = (known after apply)
    }
    
    + metadata_options {
    + http_endpoint = (known after apply)
    + http_put_response_hop_limit = (known after apply)
    + http_tokens = (known after apply)
    }
    
    + network_interface {
    + delete_on_termination = (known after apply)
    + device_index = (known after apply)
    + network_interface_id = (known after apply)
    }
    
    + root_block_device {
    + delete_on_termination = (known after apply)
    + device_name = (known after apply)
    + encrypted = (known after apply)
    + iops = (known after apply)
    + kms_key_id = (known after apply)
    + volume_id = (known after apply)
    + volume_size = (known after apply)
    + volume_type = (known after apply)
    }
    }
    
    Plan: 1 to add, 0 to change, 0 to destroy.
    
    ------------------------------------------------------------------------
    
    Note: You didn't specify an "-out" parameter to save this plan, so Terraform
    can't guarantee that exactly these actions will be performed if
    "terraform apply" is subsequently run.

    aplicar terraforma

    La etapa de aplicación ejecutará el archivo de configuración y lanzará una instancia AWS EC2. Cuando ejecute el comando de aplicación, le preguntará, "¿Quiere realizar estas acciones?", Debe escribir sí y presionar enter.

    [email protected]:~/terraform_demo$ terraform apply
    
    An execution plan has been generated and is shown below.
    Resource actions are indicated with the following symbols:
    + create
    
    Terraform will perform the following actions:
    
    # aws_instance.terraform_demo will be created
    + resource "aws_instance" "terraform_demo" {
    + ami = "ami-0a634ae95e11c6f91"
    + arn = (known after apply)
    + associate_public_ip_address = (known after apply)
    + availability_zone = (known after apply)
    + cpu_core_count = (known after apply)
    + cpu_threads_per_core = (known after apply)
    + get_password_data = false
    + host_id = (known after apply)
    + id = (known after apply)
    + instance_state = (known after apply)
    + instance_type = "t2.micro"
    + ipv6_address_count = (known after apply)
    + ipv6_addresses = (known after apply)
    + key_name = (known after apply)
    + outpost_arn = (known after apply)
    + password_data = (known after apply)
    + placement_group = (known after apply)
    + primary_network_interface_id = (known after apply)
    + private_dns = (known after apply)
    + private_ip = (known after apply)
    + public_dns = (known after apply)
    + public_ip = (known after apply)
    + secondary_private_ips = (known after apply)
    + security_groups = (known after apply)
    + source_dest_check = true
    + subnet_id = (known after apply)
    + tenancy = (known after apply)
    + volume_tags = (known after apply)
    + vpc_security_group_ids = (known after apply)
    
    + ebs_block_device {
    + delete_on_termination = (known after apply)
    + device_name = (known after apply)
    + encrypted = (known after apply)
    + iops = (known after apply)
    + kms_key_id = (known after apply)
    + snapshot_id = (known after apply)
    + volume_id = (known after apply)
    + volume_size = (known after apply)
    + volume_type = (known after apply)
    }
    
    + ephemeral_block_device {
    + device_name = (known after apply)
    + no_device = (known after apply)
    + virtual_name = (known after apply)
    }
    
    + metadata_options {
    + http_endpoint = (known after apply)
    + http_put_response_hop_limit = (known after apply)
    + http_tokens = (known after apply)
    }
    
    + network_interface {
    + delete_on_termination = (known after apply)
    + device_index = (known after apply)
    + network_interface_id = (known after apply)
    }
    
    + root_block_device {
    + delete_on_termination = (known after apply)
    + device_name = (known after apply)
    + encrypted = (known after apply)
    + iops = (known after apply)
    + kms_key_id = (known after apply)
    + volume_id = (known after apply)
    + volume_size = (known after apply)
    + volume_type = (known after apply)
    }
    }
    
    Plan: 1 to add, 0 to change, 0 to destroy.
    
    Do you want to perform these actions?
    Terraform will perform the actions described above.
    Only 'yes' will be accepted to approve.
    
    Enter a value: yes
    
    aws_instance.terraform_demo: Creating...
    aws_instance.terraform_demo: Still creating... [10s elapsed]
    aws_instance.terraform_demo: Still creating... [20s elapsed]
    aws_instance.terraform_demo: Still creating... [30s elapsed]
    aws_instance.terraform_demo: Still creating... [40s elapsed]
    aws_instance.terraform_demo: Creation complete after 44s [id=i-0eec33286ea4b0740]
    
    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

    Vaya a su panel de AWS EC2 y verá que se ha creado una nueva instancia con el ID de instancia mencionado al final del comando de aplicación.

    terraform aws ec2 - geekflare

    Ha lanzado correctamente una instancia de AWS EC2 con Terraform.

    terraforma destruir

    Finalmente, si desea eliminar la infraestructura, debe ejecutar el comando destroy.

    [email protected]:~/terraform_demo$ terraform destroy
    aws_instance.terraform_demo: Refreshing state... [id=i-0eec33286ea4b0740]
    
    An execution plan has been generated and is shown below.
    Resource actions are indicated with the following symbols:
    - destroy
    
    Terraform will perform the following actions:
    
    # aws_instance.terraform_demo will be destroyed
    - resource "aws_instance" "terraform_demo" {
    - ami = "ami-0a634ae95e11c6f91" -> null
    - arn = "arn:aws:ec2:us-west-2:259212389929:instance/i-0eec33286ea4b0740" -> null
    - associate_public_ip_address = true -> null
    - availability_zone = "us-west-2c" -> null
    - cpu_core_count = 1 -> null
    - cpu_threads_per_core = 1 -> null
    - disable_api_termination = false -> null
    - ebs_optimized = false -> null
    - get_password_data = false -> null
    - hibernation = false -> null
    - id = "i-0eec33286ea4b0740" -> null
    - instance_state = "running" -> null
    - instance_type = "t2.micro" -> null
    - ipv6_address_count = 0 -> null
    - ipv6_addresses = [] -> null
    - monitoring = false -> null
    - primary_network_interface_id = "eni-02a46f2802fd15634" -> null
    - private_dns = "ip-172-31-13-160.us-west-2.compute.internal" -> null
    - private_ip = "172.31.13.160" -> null
    - public_dns = "ec2-34-221-77-94.us-west-2.compute.amazonaws.com" -> null
    - public_ip = "34.221.77.94" -> null
    - secondary_private_ips = [] -> null
    - security_groups = [
    - "default",
    ] -> null
    - source_dest_check = true -> null
    - subnet_id = "subnet-5551200c" -> null
    - tags = {} -> null
    - tenancy = "default" -> null
    - volume_tags = {} -> null
    - vpc_security_group_ids = [
    - "sg-b5b480d1",
    ] -> null
    
    - credit_specification {
    - cpu_credits = "standard" -> null
    }
    
    - metadata_options {
    - http_endpoint = "enabled" -> null
    - http_put_response_hop_limit = 1 -> null
    - http_tokens = "optional" -> null
    }
    
    - root_block_device {
    - delete_on_termination = true -> null
    - device_name = "/dev/sda1" -> null
    - encrypted = false -> null
    - iops = 100 -> null
    - volume_id = "vol-0be2673afff6b1a86" -> null
    - volume_size = 8 -> null
    - volume_type = "gp2" -> null
    }
    }
    
    Plan: 0 to add, 0 to change, 1 to destroy.
    
    Do you really want to destroy all resources?
    Terraform will destroy all your managed infrastructure, as shown above.
    There is no undo. Only 'yes' will be accepted to confirm.
    
    Enter a value: yes
    
    aws_instance.terraform_demo: Destroying... [id=i-0eec33286ea4b0740]
    aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 10s elapsed]
    aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 20s elapsed]
    aws_instance.terraform_demo: Still destroying... [id=i-0eec33286ea4b0740, 30s elapsed]
    aws_instance.terraform_demo: Destruction complete after 34s
    
    Destroy complete! Resources: 1 destroyed.

    Si vuelve a verificar el panel de EC2, verá que la instancia se terminó.

    terraform aws ec2 destruido - geekflare

    Conclusión

    Creo que lo anterior le da una idea para comenzar con Terraform. Continúe y pruebe el ejemplo que acabo de mostrar.

    También deberías revisar estos software de automatización de infraestructura.

    Si está interesado en obtener más información, le sugiero que consulte Curso de aprendizaje de DevOps con Terraform.