Paso de archivos locales a EC2 de AWS con Terraform.

Veremos dos ejemplos sencillos, utilizando la técnica de “provisioner” y “copia desde S3”.

Técnica “provisioner”.

Con esta técnica indicamos los archivos a copiar desde un origen a un destino y utilizamos la clave privada para copiar con el apartado “provisioner”-“file”, con “provisioner”-“remote-exec” se crea un retardo de tiempo necesario para dar tiempo a finalizar los comandos ejecutados en el apartado “datos de usuario”.

El archivo main.tf

provider «aws» {

  region = «us-east-1»

}

resource «aws_instance» «terraform-ec2-apache» {

  ami           = «ami-064519b8c76274859» # AMI de Linux Debian

  instance_type = «t2.micro»

  tags = {

    Name = «Srv1Debian» # Asigna nombre a la instancia

  }

  key_name = «vockey» # Clave SSH creada en AWS por el Lab

  # Bloque de seguridad (security group) para permitir tráfico SSH

  vpc_security_group_ids = [aws_security_group.terraform-ec2-sg-ssh.id, aws_security_group.terraform-ec2-sg-http.id]

  #Zona de Disponibilidad y Subred donde ubicar la EC2

  availability_zone = «us-east-1a»

  subnet_id         = «subnet-0392723f30566b6fe»

  user_data         = <<-EOF

              #!/bin/bash

              apt-get update

              apt-get install apache2 php php-mysql -y

              echo «Hello, Terraform!» > /var/www/html/index.html

              echo «<?php phpinfo(); ?>» > /var/www/html/index.php

              # El usuario que ejecuta en user data es root, en provisioner es admin

              chown -R admin:admin /var/www

              systemctl restart apache2

              EOF

  # Provisioner que se ejecutará después de user_data

  provisioner «remote-exec» {

    inline = [

      «echo Esperando a que finalice el script de user_data…»,

      «sleep 30», # Espera para asegurar que el user_data ha terminado

    ]

  }

  # Conexión SSH a la instancia

  connection {

    type        = «ssh»

    user        = «admin»

    private_key = file(«pedro.pem»)

    host        = self.public_ip

  }

  # Usar el provisioner «file» para copiar el archivo PHP a la instancia

  provisioner «file» {

    source      = «equipos.php» # Ruta al archivo PHP en tu máquina local

    destination = «/var/www/html/equipos.php»    # Ruta donde quieres copiar el archivo en la EC2

  }

}

# Crear un grupo de seguridad que permita SSH

resource «aws_security_group» «terraform-ec2-sg-ssh» {

  name        = «SG-Permitir_SSH»

  description = «Permitir trafico de entrada SSH»

  vpc_id      = «vpc-00dabe91b8426acfe»

  ingress {

    from_port   = 22

    to_port     = 22

    protocol    = «tcp»

    cidr_blocks = [«0.0.0.0/0»]

  }

  egress {

    from_port   = 0

    to_port     = 0

    protocol    = «-1»

    cidr_blocks = [«0.0.0.0/0»]

  }

}

# Crear un grupo de seguridad que permita HTTP

resource «aws_security_group» «terraform-ec2-sg-http» {

  name        = «SG-Permitir_HTTP»

  description = «Permitir trafico de entrada HTTP»

  vpc_id      = «vpc-00dabe91b8426acfe»

  ingress {

    from_port   = 80

    to_port     = 80

    protocol    = «tcp»

    cidr_blocks = [«0.0.0.0/0»]

  }

  egress {

    from_port   = 0

    to_port     = 0

    protocol    = «-1»

    cidr_blocks = [«0.0.0.0/0»]

  }

}

Terraform plan

Terraform apply

Ejecución de los apartados de “remote-exec” y “file” de “provisioner”.

Resultado:

En la carpeta “/var/www/html” tenemos los archivos creados con “echo” en el apartado de “datos de usuario” y el archivo “equipos.php” mediante el apartado “provisioner” con “file”.

Anotaciones:

Mediante el comando “self”, terraform obtiene información del recurso actual.

Key_name es el nombre del par de claves generados dentro de la consola de AWS, en los laboratorios de AWS Academy, es la clave “vockey”.

Private_key es la clave privada (.pem) que descargamos desde el “AWS Details” en el laboratorio de AWS Academy.

En el apartado de “provisioner” con “remote-exec”, en lugar de ejecutar comandos con funciones concretas, lo utilizamos para realizar un retraso de tiempo para que antes de copiar archivos se terminen de ejecutar los comandos del apartado “datos de usuario”.

Técnica “achivos en S3”.

Mediante está técnica los archivos estarán en un bucket de S3 y se realizará la copia a EC2 porque tiene privilegios proporcionados por el Rol asignado durante el proceso de creación de la EC2.

Creación del bucket.

aws s3 mb s3://volcadojmcr –region us-east-1

Copia de todos los archivos necesarios a S3.

aws s3 cp . s3://volcadojmcr/ –recursive

El archivo “main.tf”

provider «aws» {

  region = «us-east-1»

}

resource «aws_instance» «terraform-ec2-apache» {

  ami           = «ami-064519b8c76274859» # AMI de Linux Debian

  instance_type = «t2.micro»

  tags = {

    Name = «Srv1Debian» # Asigna nombre a la instancia

  }

  key_name = «vockey» # Clave SSH creada en AWS por el Lab

  # Bloque de seguridad (security group) para permitir tráfico SSH

  vpc_security_group_ids = [aws_security_group.terraform-ec2-sg-ssh.id, aws_security_group.terraform-ec2-sg-http.id]

  #Zona de Disponibilidad y Subred donde ubicar la EC2

  availability_zone = «us-east-1a»

  subnet_id         = «subnet-0392723f30566b6fe»

  iam_instance_profile   = «LabInstanceProfile»  # Asigna el perfil de instancia aquí

  user_data         = <<-EOF

              #!/bin/bash

              apt-get update

              apt-get install apache2 -y

              systemctl restart apache2

              # Descargar todos los archivos de una carpeta

              aws s3 cp s3://volcadojmcr /var/www/html –recursive

              EOF

}

# Crear un grupo de seguridad que permita SSH

resource «aws_security_group» «terraform-ec2-sg-ssh» {

  name        = «SG-Permitir_SSH»

  description = «Permitir trafico de entrada SSH»

  vpc_id      = «vpc-00dabe91b8426acfe»

  ingress {

    from_port   = 22

    to_port     = 22

    protocol    = «tcp»

    cidr_blocks = [«0.0.0.0/0»]

  }

  egress {

    from_port   = 0

    to_port     = 0

    protocol    = «-1»

    cidr_blocks = [«0.0.0.0/0»]

  }

}

# Crear un grupo de seguridad que permita HTTP

resource «aws_security_group» «terraform-ec2-sg-http» {

  name        = «SG-Permitir_HTTP»

  description = «Permitir trafico de entrada HTTP»

  vpc_id      = «vpc-00dabe91b8426acfe»

  ingress {

    from_port   = 80

    to_port     = 80

    protocol    = «tcp»

    cidr_blocks = [«0.0.0.0/0»]

  }

  egress {

    from_port   = 0

    to_port     = 0

    protocol    = «-1»

    cidr_blocks = [«0.0.0.0/0»]

  }

}

Anotaciones:

Rol asignado a la EC2 durante su creación, muy importante para tener privilegios de copia desde S3. Recordar que este profile está ya creado por los laboratorios de AWS Academy (Learner Lab).

iam_instance_profile   = «LabInstanceProfile»  # Asigna el perfil de instancia aquí

Copia de todos los archivos del bucket S3 a la carpeta “/var/www/html”.

aws s3 cp s3://volcadojmcr /var/www/html –recursive

Los archivos copiados se pueden ver en la siguiente imagen, donde se puede comprobar que el propietario es el usuario “root” (copia desde el apartado “datos de usuario”).