English English French French Spanish Spanish German German
Geekflare cuenta con el apoyo de nuestra audiencia. Podemos ganar comisiones de afiliados comprando enlaces en este sitio.
Comparte en:

Una introducción a Terraform para principiantes – Tutorial de Terraform

Escáner de seguridad de aplicaciones web Invicti – la única solución que ofrece verificación automática de vulnerabilidades con Proof-Based Scanning™.

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 ha sido 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 Formación de nubes, 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.

Video de Youtube

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, Digital Ocean 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

Terraform Core concepts

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.
  • Provider: 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.
  • Planificació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.
  • Aplicar: Es una de las etapas donde se aplican los cambios de estado real / actual de la infraestructura para pasar al estado deseado.

Terraform Lifecycle

El ciclo de vida de Terraform consiste en: init, plan, aplicar y 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.

How Terraform Works?

Terraform tiene dos componentes principales que conforman su arquitectura:

  • Núcleo de terraformación
  • Proveedores
arquitectura terraform - geekflare

Núcleo de terraformación

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

Programas de en el primer 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 segundo 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

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.

Install Terraform

Descargue el último paquete terraform.

Para obtener más detalles sobre cómo diseñar y realizar los esfuerzos de seguimiento y evaluación, referirse al La página oficial de descargas para obtener la última versión para el sistema operativo respectivo.

geekflare@geekflare:~$ 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.

geekflare@geekflare:~$ 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.

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

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

geekflare@geekflare:~$ 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

Provision AWS EC2 Instance Using Terraform

En esta demostración, voy a lanzar un nuevo Instancia AWS EC2 utilizando Terraform.

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

geekflare@geekflare:~$ 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.

geekflare@geekflare:~$ cd terraform_demo/
geekflare@geekflare:~/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.

inicio de terraformación

Ahora, el primer paso es inicializar terraform.

geekflare@geekflare:~/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.

geekflare@geekflare:~/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.

geekflare@geekflare:~/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.

geekflare@geekflare:~/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.

Gracias a nuestros patrocinadores
Más lecturas excelentes sobre computación en la nube
Impulse su negocio
Algunas de las herramientas y servicios para ayudar a que su negocio crezca.
  • Invicti utiliza Proof-Based Scanning™ para verificar automáticamente las vulnerabilidades identificadas y generar resultados procesables en cuestión de horas.
    Prueba Invicti
  • Web scraping, proxy residencial, administrador de proxy, desbloqueador web, rastreador de motores de búsqueda y todo lo que necesita para recopilar datos web.
    Prueba Brightdata
  • Semrush es una solución de marketing digital todo en uno con más de 50 herramientas en SEO, redes sociales y marketing de contenido.
    Prueba Semrush
  • Intruder es un escáner de vulnerabilidades en línea que encuentra debilidades de ciberseguridad en su infraestructura, para evitar costosas filtraciones de datos.
    Trata Intruder