Cómo subir archivos locales a una instancia de Amazon EC2 utilizando Terraform

Cuando trabajamos con instancias EC2, a menudo necesitamos copiar un archivo local a la instancia. Esto es especialmente necesario si el archivo debe estar disponible inmediatamente en la instancia en cuanto se crea. Por ejemplo, uno de los requisitos de mi proyecto Terraform era que un archivo de configuración para un host virtual Apache debía estar disponible en la instancia EC2 nada más crearse. Este archivo se utilizó como plantilla para crear dos archivos de configuración de host virtual. Para ello, utilicé la herramienta File Provisioner de Terraform para copiar estos archivos.

Debes saber que Terraform no recomienda el uso de aprovisionadores y recomienda técnicas alternativas para los casos en que estén disponibles. Hay muchas razones para esta restricción, que se mencionan en el sitio web de Terraform.

¿Qué vamos a cubrir?

En este tutorial, veremos cómo copiar un archivo desde una máquina local que ejecuta Terraform a una instancia recién creada de Amazon EC2 (Ubuntu) en AWS. En este método, utilizaremos la utilidad Archivo proporcionada por Terraform. Demostraremos su uso simplemente copiando un archivo a una instancia EC2.

¿Para qué se utilizan los aprovisionadores?

Los aprovisionadores suelen utilizarse para ejecutar scripts de creación, destrucción de diversos recursos y preparación de una máquina lista para su uso en un entorno de producción o desarrollo. Las operaciones de aprovisionamiento incluyen cosas como las siguientes

  1. Actualizar el sistema operativo.
  2. Crear cuentas, configurar servicios y otras tareas administrativas del sistema.
  3. Instalación de software.
  4. Transferir archivos a un sistema y gestionarlos.
  5. Configurar direcciones IP del sistema, puertos y otras tareas.

Requisitos previos

  1. Conceptos básicos de Terraform.
  2. Terraform y AWS CLI instalados en el sistema local.
  3. AWS CLI configurado para acceder a tu cuenta de AWS.

Utilizar el «Aprovisionador de archivos» para copiar los archivos

El «Aprovisionador de archivos» se utiliza para copiar archivos y directorios de la máquina que ejecuta Terraform a la misma máquina o a otra, como las instancias EC2. Los aprovisionadores pueden aplicarse tanto en sistemas locales como remotos. Aunque Terraform es excelente en las operaciones de despliegue, no es tan hábil en el aprovisionamiento. Terraform no es compatible con muchos sistemas operativos y comandos. Por eso Terraform sugiere utilizar los Aprovisionadores como última opción.

Aplicación práctica del aprovisionador «archivo

En esta sección veremos una forma práctica de utilizar el aprovisionador ‘archivo’. Crearemos un recurso de instancia EC2 utilizando Terraform y, a continuación, copiaremos un archivo del sistema local a esta instancia. Vamos a hacerlo ahora mismo:

Paso 1. Primero crea el archivo que queremos copiar al sistema remoto. Lo crearemos dentro del directorio que contiene todos nuestros archivos de configuración:

$ nano dummy.txt

Además, añade algunos contenidos a este archivo:

$ echo “Our dummy file” > dummy.txt

Paso 2. Crea un archivo llamado ‘instance.tf’ o con el nombre que quieras pero con extensión ‘.tf’:

$ sudo instance.tf

Ahora rellena este archivo con el siguiente contenido:

provider "aws" {
  region ="us-east-1"
}
resource "aws_instance" "webserver" {
ami ="ami-id-you-want-to-use"
instance_type = "t2.micro"
key_name = "Name-of-your- EC2-keypair"
vpc_security_group_ids = ["Use-an-existing-SG"]
associate_public_ip_address = true

provisioner "file" {
source      = "dummy.txt"
destination = "/home/ubuntu/file1.txt"

connection {
type        = "ssh"
user        = "ubuntu"
private_key = "${file("Path-to-EC2-keyPair-on-Local-system.pem")}"
host        = "${self.public_ip}"
}
}

tags = {
Name = "FileProvisionerDemo"
}
}

El código anterior copiará el archivo ‘dummy.txt’ a la instancia EC2 con el nombre ‘archivo1.txt’. Aquí hemos utilizado un grupo de seguridad existente, puedes crear uno nuevo utilizando Terraform y utilizarlo aquí. Veamos una descripción de algunos de los argumentos utilizados aquí:

  • fuente: Ubicaciones absolutas de archivos y directorios o una relativa correspondiente al directorio del proyecto Terraform.
  • destino: Es la ruta absoluta en el sistema de destino.
  • bloque de conexión: Terraform aprende a comunicarse con el servidor utilizando el bloque de conexión. Las conexiones de tipo «ssh» y «winrm» son compatibles con los proveedores de archivos.
  • tipo: Este campo especifica el tipo de conexión, que puede ser «ssh» o «winrm». En este laboratorio hemos utilizado una conexión SSH.
  • usuario: Especifica el usuario que se utilizará para una conexión.
  • clave_privada: El contenido de una clave SSH para establecer una conexión.
  • host: Especifica la dirección del recurso con el que queremos conectar.
  • self: Un objeto que representa el recurso padre de una conexión y contiene todos los atributos de un recurso.

El File Provisioner también admite otros argumentos como certificado, agente, clave_host, etc.

Paso 3. Inicializa el directorio del proyecto utilizando:

$ terraform init

Inicializar el directorio del proyecto Terraform
Además, comprueba si hay algún error sintáctico ejecutando el comando:

$ terraform validate

Validar la configuración de Terraform
Paso 4. Para configurar esta infraestructura, ejecuta el comando ‘terraform apply’. También puedes revisar los cambios a realizar mediante el comando ‘terraform plan’:

$ terraform apply

Ejemplo de Salida:

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

# aws_instance.webserver will be created
+ resource «aws_instance» «webserver»

Paso 5. Nuestra instancia se está creando como se muestra a continuación:

Consola AWS EC2
Ahora accede mediante SSH a tu instancia y comprueba si el archivo se ha copiado correctamente:

Verificar la configuración

Conclusión

En esta guía hemos visto cómo podemos utilizar el aprovisionador «archivo» para copiar un archivo en una instancia.

También te podría gustar...