Importar una infraestructura existente a Terraform
Stephane Jourdan
2 de julio de 2020
0 minutos de lecturaNota del editor: Esta publicación apareció originalmente en CloudSkiff.com. CloudSkiff se unió a Snyk en octubre de 2021.
A veces necesitas importar una infraestructura existente a Terraform. Esto puede deberse a muchos motivos. Algunas personas apenas están comenzando y necesitan migrar infraestructuras existentes y crear una nueva base de código a partir de ellas. A veces, aunque seas experto, necesitas pasar de una POC (prueba de concepto) que creaste rápidamente haciendo clic en la consola a un proyecto en vivo que debe ser estable en producción.
Supongamos que ya tienes una infraestructura en vivo que creaste desde la consola de la nube… ¿cómo obtienes código de Terraform a partir de ella y, lo que es más importante, cómo haces que funcione?
En este artículo, repasaremos rápidamente las principales formas de generar automáticamente código de infraestructura a partir de un entorno existente: cómo clonar un entorno, hacer que funcione y asegurarte de que sea reproducible.
Importar una infraestructura existente a Terraform con Terraform import
Si tienes pocos recursos que convertir en código y las habilidades necesarias, simplemente puedes volver a escribir el código. Pero, obviamente, necesitas saber exactamente cómo están configurados esos recursos.
Si ya tienes una base de código de Terraform, una vez que hayas escrito el código, tendrás que ejecutar terraform import dentro de tu base de código. terraform import es un subcomando de Terraform. Como este código coincidirá exactamente con los recursos existentes en la cuenta de tu proveedor de nube, lograrás un equilibrio perfecto entre el código, los recursos existentes y tu archivo TFState.
Importar una infraestructura existente a Terraform con un importador
La opción que acabamos de mencionar puede funcionar con pocos recursos, pero para entornos más grandes, la tarea puede ser abrumadora. En el mercado hay distintos importadores, convertidores, escáneres, generadores de Terraform, etc. que pueden ayudarte.
Uno de ellos, Terraformer, fue creado por el equipo de SRE de Waze en Tel Aviv.
Cuando le proporciones tus credenciales, Terraformer analizará la cuenta de tu proveedor de nube en busca de recursos y, cuando encuentre uno, lo convertirá en código de Terraform válido con un archivo de estado funcional.
El código que obtendrás no será muy limpio y, sin duda, no será DRY, pero resolverá el 80 % del trabajo y podrás empezar a construir sobre él.
Pasos clave para convertir las infraestructuras importadas en código de Terraform funcional
Una vez que hayas importado tus recursos existentes a Terraform, es fundamental que sigas algunos pasos adicionales para que todo funcione. En esta etapa, el código no está limpio ni optimizado.
Asegúrate de que todo use variables y de que todas las variables estén unificadas.
Imagina que tienes una red VPC llamada VPC. Esto puede ser un problema si solo puedes tener un nombre de VPC por región. Este es el caso de los buckets de Amazon S3. Por ejemplo, solo puedes tener un bucket de S3 a nivel mundial para todos los clientes.
Cambiar el nombre de los recursos te tomará algo de tiempo. Pero, una vez que te asegures mediante variables de que los nombres que uses sean únicos, tendrás la certeza de que el código se puede volver a usar en otra región.
Declara explícitamente tus dependencias.
Uno de los problemas de importar recursos automáticamente al código de Terraform es que, con mucha frecuencia, no se establecen los vínculos entre los recursos. Verás recursos que tienen sentido en conjunto, pero cuyas dependencias no están declaradas explícitamente. O quizá están declaradas, pero no mediante variables.
Por ejemplo, podrías encontrarte con una regla de grupo de seguridad declarada y vinculada al ID de ese grupo de seguridad, con todo funcionando correctamente. Pero si no hay un vínculo interno o, más precisamente, una dependencia en el código, la próxima vez que intentes volver a implementarlo en otra región, probablemente implementarás reglas y un grupo de seguridad que no están vinculados.
Por último, pero no menos importante: garantiza la reproducibilidad mediante la aleatoriedad
El último paso clave es garantizar la reproducibilidad mediante la aleatoriedad. Básicamente, basta con aleatorizar los nombres con algunos caracteres.
Personalmente, uso una cadena aleatoria como sufijo. Esto genera una cadena aleatoria muy sencilla de ocho caracteres (sin caracteres especiales, porque no quieres caracteres extraños en el nombre). En este caso, solo creo variables locales.
En mis sistemas de producción y de staging, simplemente los agrego como sufijo. Así, tengo la certeza de que, tanto en producción como en staging, tendré un nombre aleatorio único. Y puedo crear fácilmente otro entorno para pruebas con solo copiar y pegar.
En resumen
Importar tus recursos es solo el primer paso y rara vez es suficiente.
Para que tu código sea funcional, los siguientes pasos son:
Asegurarte de que todo use variables
Asegurarte de que todas las variables estén unificadas.
Declarar tus dependencias y vincularlas
Aleatorizar las variables para generar nombres únicos.
Protege tu código de Terraform
Snyk IaC protege tus configuraciones de Terraform (¡y tus plantillas de Kubernetes, CloudFormation y ARM!) mientras programas, con correcciones guiadas para que puedas combinar los cambios y seguir adelante. Puedes hacer pruebas mientras escribes, monitorear los cambios en tus repositorios de Git y automatizar las pruebas en tus pipelines de compilación antes de la implementación. Comenzar con un plan gratuito toma solo unos minutos, mientras que una brecha causada por una configuración incorrecta de IaC puede provocar daños irreparables. Regístrate y empieza a proteger tus configuraciones aquí abajo.
Protege la infraestructura desde el origen
Snyk automatiza la seguridad y el cumplimiento de IaC en los flujos de trabajo, y detecta recursos con desviaciones de configuración y recursos faltantes.
