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”).

Sistemas de Inicio de Sesión en instancias EC2

Tenemos las básicas:

SSH para Linux.

RDP para Windows.

Existen otras formas “especiales” de AWS, veremos AWS Systems Manager (SSM).

AWS Systems Manager (SSM)

SSM permite el inicio de sesión en las instancias mediante la instalación de un agente (servicio) que se comunica con la consola de AWS.

EC2 con Linux Debian

wget https://s3.amazonaws.com/amazon-ssm-us-east-1/latest/debian_amd64/amazon-ssm-agent.deb

dpkg -i amazon-ssm-agent.deb

Corregir falta de dependencias si las hubiese.

apt-get install -f

Inicio, parada, estado y servicio activo siempre.

systemctl start amazon-ssm-agent

systemctl stop amazon-ssm-agent

systemctl status amazon-ssm-agent

systemctl enable amazon-ssm-agent

Conexión desde la consola de administración de AWS.

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

Descripción generada automáticamente

EC2 con Windows Server

https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/windows_amd64/AmazonSSMAgentSetup.exe

Powershell

Start-Service AmazonSSMAgent

Set-Service -Name «AmazonSSMAgent» -StartupType Automatic

MUY IMPORTANTE:

La instancia debe tener un ROL adecuado que permita el uso de SSM. En el caso de instancias de AWS Academy, será “LabRole”

Los pasos para asignar un ROL a una instancia son:

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

Descripción generada automáticamente

Acciones, Seguridad y “Modificar rol de IAM”.

Interfaz de usuario gráfica, Aplicación

Descripción generada automáticamente

Seleccionar el profile “LabInstanceProfile”.

Tabla

Descripción generada automáticamente con confianza media

Rol de IAM asignado como se puede ver en la imagen anterior.

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

Descripción generada automáticamente

Ahora ya podemos iniciar sesión desde la consola de AWS, pestaña “Administrador de sesiones”.

¡! Estamos dentro ¡!

Nota:

Es un buen momento que veas como aun quitando el puerto 22 (SSH) del grupo de seguridad de la EC2, seguiremos accediendo al terminal mediante SSM.

El resultado de todo esto es un aumento de seguridad en el acceso a la EC2.

AWS080: Primeros pasos con LAMBDA y EVENTBRIDGE. Programación horaria de inicio y apagado de EC2.

Proyecto: Integración de los servicios cloud de Amazon Web Services (AWS) en el proyecto curricular de los ciclos formativos de Informática del IES Castelar.
Descripción: Primeros pasos en la creación de funciones LAMBDA. En este caso lo combinamos con el servicio EventBridge para iniciar y parar instancias EC2 en un determinado momento. La reflexión de clase es comprender la reducción de costes que tiene esta práctica en la vida real.

Enlaces de interés:
* https://aws.amazon.com/es/premiumsupport/knowledge-center/start-stop-lambda-eventbridge/
* https://docs.aws.amazon.com/es_es/eventbridge/latest/userguide/eb-what-is.html
Curso 2022-2023 – ASIR – Administración de Sistemas Informáticos en Red. @kalerolinex