Crea una instancia EC2 (AWS) con Terraform

Table of contents

No heading

No headings in the article.

Creación de cuenta en AWS

Dirigase a la página oficial de amazon, clickee en "Crear una cuenta de AWS" y complete los datos correspondientes. Posteriormente, valide su cuenta por el metodo que le sea mas cómodo.

El usuario asociado a la cuenta que acaba de crear, se la conocerá de ahora en más como usuario root. Y por prácticas recomendadas de AWS en cuanto a seguridad, se debe evitar por sobre todo, el uso de los servicios directamente con ella.

La solución: Es crear usuarios, políticas, grupos, o grupos de usuarios con los mínimos privilegios necesarios para ejecutar una acción determinada dentro de un servicio específico.

Creación de user IAM

Inicie sesión en su cuenta root, escoja el servicio IAM (Identity and Access Management), y dentro de este, clickee la pesta;a usuarios y luego en crear usuario.

create-user.png Recordar elegir el mismo tipo de acceso que se aprecia en la imagen.

add-user.png

AWS recomienda crear un grupo para administrar los permisos de los usuarios.

Screenshot at 2022-10-12 16-26-27.png

Nótese que se ha filtrado por ec2, seleccionando Amazon EC2 FullAccess. Y al grupo se le ha nombrado como group-ec2.

Nota: También agregue permisos para IAM.

Al continuar el proceso, tendremos creado nuestro grupo llamado group-ec2 con una política asociada de Amazon EC2 FullAccess. Aparte, también he agregado una etiqueta llamada g-ec2.

En este punto, estaremos de nuevo en la creación de nuestro usuario IAM.

Screenshot at 2022-10-12 16-30-25 (1).png

Screenshot at 2022-10-12 16-32-24.png

Hemos creado nuestro usuario, con él, se ha generado una contraseña automática como le habíamos definido (podemos descargar el usuario/password en formato .csv si lo deseamos). Además, nos indica el enlace por el cual tendremos que conectarnos a este usuario (hacerlo desde una ventana en incognito).

Desde el navegador en incognito:

Screenshot at 2022-10-12 16-37-39.png

La razon por la que en mi caso aparece brahisw-login, en lugar de exponer el ID de mi cuenta es gracias al uso de los alias, que puedes ver aqui

Nos pedirá que ingresemos una nueva contraseña. Y wala, estamos conectados a la consola de AWS desde un usuario IAM con privilegios necesarios para trabajar con ec2.

Dirigamosnos a IAM > Usuarios > [user recién creado] > Credenciales de seguridad > Crear una clave de acceso:

Screenshot at 2022-10-12 16-47-13.png

Tendremos un ID de clave de acceso, así como una key. Esto nos servirá para configurar las credenciales desde AWS CLI.

Instalaciones

  1. Terraform
  2. AWS CLI

Para instalar Terraform, podemos ejecutar el siguiente script de bash. Tenga en cuenta que esta instalación está pensada para distros basadas en Debian.

#!/bin/sh

curl -O https://releases.hashicorp.com/terraform/0.13.2/terraform_0.13.2_linux_amd64.zip && unzip terraform_0.13.2_linux_amd64.zip -d ~/.local/bin

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

set -e

# Install dependencies.
sudo apt install -y curl apt-transport-https \
     software-properties-common ca-certificates

Ahora, para instalar AWS CLI:

sudo apt-get install python
sudo apt install awscli
aws configure

Al ejecutar este último comando, se nos pedirá la access key y la secret key, de la siguiente manera:

AWS Access Key ID [****************XXXX]: "YOUR ACCESS KEY"
AWS Secret Access Key [****************XXXX]: "YOUR SECRET KEY"
Default region name [us-east-1]: 
Default output format [text]:

Por último, necesitamos nuestro clave-par para posteriormente conectarnos a ssh. Para generarlo, desde nuestro usuario IAM, nos dirigimos a EC2 > Y abajo a la izquierda buscamos "pares de claves".

Screenshot at 2022-10-12 16-59-46.png

Y al darle crear, automáticamente se nos descargara nuestro archivo .pem

Nota: Importante antes de utilizarlo, desde la consola de linux darle los permisos de propietarios (4), grupos de usuarios (0), resto de usuarios (0), mediante la sentencia:

chmod 400 brahi-key-pair.pem

Terraform [Code time]

En su editor de preferencia, cree un archivo main.tf con el siguiente codigo:

provider "aws" {
  region     = "us-east-1"

  # credentials = "~/.aws/credentials"
}

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"
  key_name = "brahi-key-pair"

  tags = {
    Name = "web-server"
  }
}

output "public_ip" {
  value       = aws_instance.web.public_ip
}

Ejecute terraform init Screenshot at 2022-10-12 17-06-25.png

Y luego, terraform apply

terraformapply.png

Loguearse en instancia ec2 mediante ssh

Por último, ejecute:

ssh -i brahi-key-pair.pem ubuntu@54.146.138.128

Recordar cambiar el nombre del key-pair por el suyo

En caso de que reciba un conection timeout por parte de ssh, revisar el siguiente enlace aunque, en resumen, debe dirigirse a ec2 > grupos de seguridad > crear grupo con una regla de entrada para ssh con el protocolo TCP en el puerto 22.

Y listo.

ubunutu-log.png

Para desconectarse de nuestro servidor, simplemente ejecute exit.

Sin embargo, esta solución es demasiado sucia en cuanto a código se refiere. Para solucionarlo, podemos abstraer los cambios en sub archivos para facilitar la mantenibilidad y escalabilidad de nuestra infraestructura en un futuro.

En nuestro archivo main.tf dejaremos solamente el siguiente código:

resource "aws_instance" "web" {
  ami             = data.aws_ami.ubuntu.id
  instance_type   = var.instance_type
  tags = {
    Name = "web-server"
  }
}

output "public_ip" {
  value = aws_instance.web.public_ip
}

Crearemos un archivo llamado data.tf que contendrá la ami de ubuntu que estamos utilizando:

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

Crearemos un archivo llamado provider.tf donde definiremos el proveedor con su respectiva región:

provider "aws" {
  region                  = var.aws_region

  # shared_credentials_file = "~/.aws/credentials" 
}

Y también un archivo llamado variables.tf:

variable "aws_region" {
  description = "AWS region for all resources."
  type    = string
  default = "us-east-1"
}

variable "keypair_name" {
    description = "Name of the keypair to use for the instances."
    type    = string
    default   = "PATH TO YOUR KEYPAIR NAME.pem"
}

variable "instance_type" {
    description = "Type of instance to launch."
    type    = string
    default   = "t2.micro"
}

Para verificar que todo funcione correctamente, podemos volver a ejecutar la secuencia de de comandos de terraform (init, plan, apply...)

¡Hasta pronto 👋!

Si deseas colaborar con el contenido, regalame un cafecito