TerraCognita - the reverse Terraform tool

TerraCognita - the reverse Terraform tool

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 --tfstateopció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