Sobre TerraCognita
TerraCognita es una herramienta de código abierto que le permite generar infraestructura como código (IaC) a partir de infraestructura existente implementada en varios proveedores de nube, incluidos AWS, GCP y Azure.
Ayuda a automatizar el proceso de creación de IaC mediante el escaneo y la ingeniería inversa de la infraestructura de nube existente, generando archivos de configuración de Terraform que se pueden usar para recrear la infraestructura en un entorno diferente.
Con TerraCognita, puede generar rápidamente el código Terraform necesario para administrar los recursos de su infraestructura, incluidos los recursos de proveedores de la nube como AWS, Google Cloud y Azure.
Usar TerraCognita es sencillo. Primero, debe instalar TerraCognita y configurar las credenciales de su proveedor de nube.
Una vez que haya hecho esto, puede usar la terracognita
con la CLI de comandos para generar archivos de configuración de Terraform para su infraestructura.
Documentación Terracognita
Configuración
Antes de comenzar, existen algunos requisitos previos:
- Debe tener Terraform y TerraCognita instalados en su máquina local.
curl -L https://github.com/cycloidio/terracognita/releases/latest/download/terracognita-linux-amd64.tar.gz -o terracognita-linux-amd64.tar.gz
tar -xf terracognita-linux-amd64. tar.gz
chmod u+x terracognita-linux-amd64
sudo mv terracognita-linux-amd64 /usr/local/bin/terracognita
Debe tener credenciales de AWS con los permisos adecuados para acceder a los recursos que desea importar.
Debe tener conocimientos básicos de Terraform y los recursos de AWS.
Más opciones de instalación puedes ver la documentación
Usando terracognita
Para generar código Terraform para todos sus recursos de AWS existentes, puede utilizar el siguiente comando:
terracognita aws generate-all --tfstate=terraform.tfstatet
Este comando generará código Terraform para todos sus recursos de AWS y lo enviará a un archivo llamado aws.tf
. La --tfstate
opción especifica la ruta al archivo de estado de Terraform que TerraCognita utilizará para leer el estado actual de la infraestructura.
Terracognita tiene una característica poderosa que le permite generar directamente módulos Terraform durante el proceso de importación. Para utilizar esta función, puede utilizar el flag --module {module/path/name}
, donde especifica la ruta deseada para que se genere el módulo.
Esta ruta puede ser un directorio existente o una ruta inexistente que se creará.
Es importante tener en cuenta que al generar un módulo, el contenido existente de la ruta especificada se eliminará (después de la confirmación del usuario) para garantizar una importación y organización limpias de los recursos generados.
Este es el comando donde puede crear toda la infraestructura en el módulo
puede modificarlo según los requisitos.
terracognita aws --aws-profile <name of the profile > --hcl --aws-default-region <region> --module <name of the module> -i aws_vpc --tfstate terraform.tfstate
¡Manos a la obra!
Creo un bucket s3 de forma manual desde la consola
s3-terracognita-demo
Pasos:
Para este ejemplo, importaré mis buckets S3 actuales a Terraform.
Primero recuerda tener instalado terracognita, puedes encontrar el repositorio para instalar aquí.
Para comprobar que está instalado, ingrese terracognita --help
.
La salida debería verse así.
> terracognita --help
Reads from Providers and generates a Terraform configuration, all the flags can be used also with ENV (ex: --aws-access-key == AWS_ACCESS_KEY)
Usage:
terracognita [command]
Available Commands:
aws Terracognita reads from AWS and generates hcl resources and/or terraform state
azurerm Terracognita reads from Azure and generates hcl resources and/or terraform state
google Terracognita reads from GCP and generates hcl resources and/or terraform state
help Help about any command
version Prints the current build version
vsphere Terracognita reads from vSphere and generates hcl resources and/or terraform state
> terracognita version
The current version is: v0.8.4
Una vez instalado, cree un nuevo directorio para comenzar a trabajar.
Importamos el bucket s3 que se creó manualmente y administrarlo usando Terraform IAC
Ahora ingresaré el siguiente comando para importar mis bucket de S3 a Terraform.
Puede cambiar el comando para adaptarlo a sus propias necesidades.
Comando en el directorio que creó.
Ahora ingresaré el siguiente comando para importar mis buckets de S3 a Terraform.
Puede cambiar el comando para adaptarlo a sus propias necesidades.
terracognita aws --hcl s3 --tfstate terraform.tfstate --aws-default-region us-east-1 -i aws_s3_bucket
terracognita aws --hcl s3 --tfstate terraform.tfstate --aws-default-region us-east-1 -i aws_s3_bucket
We are about to remove all content from "s3", are you sure? Yes/No (Y/N):
y
Starting Terracognita with version v0.8.4
Importing with filters:
Tags: [],
Include: [aws_s3_bucket],
Exclude: [],
Targets: [],
Importing aws_s3_bucket [1/1] Done!
Writing HCL Done!
Writing TFState Done!
AWS es el proveedor.
— hcl es el lenguaje en el que se escribirá el código > en un archivo llamado s3.
— tfstate le pedirá que escriba el archivo de state "estado" > nombrándolo terraform.tfstate.
— aws-default-region región en la que se encuentran sus recursos > ingrese su región correcta.
-i para incluir solo bucket de S3, se puede cambiar a un recurso diferente y/o a varios recursos.
Puede manipular el comando de cualquier forma que elija para incluir, -i, y excluir, -e, muchos AWS diferentes...
Aplicando el comando me trae informacion de todos los recursos
.
├── s3
│ ├── hcl.tf
│ └── s3_simple_storage.tf
└── terraform.tfstate
Creó una carpeta “s3” como se indicó, en la carpeta hay un archivo hcl.tf
y un archivo s3_simple_storage.tf
.
Además del archivo de que moveré a la carpeta “s3”. El archivo hcl.tf es un archivo de provider, como se muestra a continuación.
provider "aws" {
region = "us-east-1"
}
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "=4.9.0"
}
}
required_version = ">= 1.0"
}
El archivo s3_simple_storage.tf tiene todos los bucket de S3 en bloques de recursos.
resource "aws_s3_bucket" "s3_terracognita_demo" {
arn = "arn:aws:s3:::s3-terracognita-demo"
bucket = "s3-terracognita-demo"
hosted_zone_id = "Z3AQBSTGFYJSTF"
}
y por ultimo
¡Ahora verifiquemos si todo se importó correctamente!
Ejecutando los comandos terraform init
y terraform plan
> terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "4.9.0"...
- Installing hashicorp/aws v4.9.0...
- Installed hashicorp/aws v4.9.0 (signed by HashiCorp)
Si al lanzar el plan aparece lo siguiente:
Deben agregar el tfstate a la ruta de la carpeta s3
> tree
.
├── hcl.tf
├── s3_simple_storage.tf
└── terraform.tfstate
1 directory, 3 files
Corro devuelta el plan
> terraform plan
aws_s3_bucket.s3_terracognita_demo: Refreshing state... [id=s3-terracognita-demo]
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no
changes are needed.
Importante
Si quieren correr el comando de terracognita y que el state quede en el mismo arbol de directorio de los recursos de terraform solo debes ejecutar:
terracognita aws --hcl s3 --tfstate s3/terraform.tfstate --aws-default-region us-east-1 -i aws_s3_bucket
Fijense que en el --tfstate le indico la ruta donde quiero que se guarde
¡Y funciona!
La configuración de Terraform coincide con la infraestructura de AWS.
Fue así de simple. ¡Importamos con éxito los recursos actuales aplicados manualmente en AWS a Terraform!
Ahora puede realizar cambios, como cambiar los permisos en los bucket s3 o habilitar el control de versiones.
Incluso podrías agregarlo a un pipeline y automatizar el proceso.
Espero que esto sea útil para alguien y ¡gracias por leer!
Demostración