- Terraform 0.12.13.
- Linux (Preferiblemente ubuntu).
- Git (Para clonar el proyecto).
-
Descargar el proyecto
$ git clone https://github.com/kamiluo/MIAGUILA-TERRAFORM.git
-
Renombrar el archivo provider.tf.example como provider.tf y cambiar las variables por las credenciales para su nube:
provider "aws" { access_key = "<your access key>" secret_key = "<your secret key>" # By default the region is us-east-2 ohio if you want to change # by other region you also have to change the availability zones region = "us-east-2" version = "~> 2.25" }
NOTA: Si desea utilizar otra región se debe cambiar las variables de zonas de disponibilidad en el código de terraform.
-
Ejecutar los comandos:
$ terraform init $ terraform plan $ terraform apply
module "vpc" {
source = "./modules/vpc"
#Vpc Vars
name = "vpc"
cidr = "10.0.0.0/16"
tenancy = "default"
#Subnets Vars
public_subnets = ["10.0.0.0/24","10.0.1.0/24"]
private_subnets = ["10.0.2.0/24","10.0.3.0/24"]
azs = ["us-east-2a","us-east-2b"]
default_cidr = "0.0.0.0/0"
#Common tags
tags = {
Terraform = "true"
Environment = "dev"
}
}
Name | Description | Type | Default | Required |
---|---|---|---|---|
ag_ec2_microservices_desired | Auto Scaling desired instances number | number | "3" |
no |
ag_ec2_microservices_grace | Auto Scaling instances grace period | number | "20" |
no |
ag_ec2_microservices_max | Auto Scaling max instances number | number | "3" |
no |
ag_ec2_microservices_min | Auto Scaling min instances number | number | "0" |
no |
azs | List of Availability Zones, must be equal to subnet numbers | list(string) | `` | yes |
cidr | VPC CIDR | string | "0.0.0.0/0" |
no |
default_cidr | Default CIDR | string | "0.0.0.0/0" |
no |
elas_cache_node_type | Node type for elastic cache | string | "cache.t2.micro" |
no |
key_pair_name | Key Pair name for EC2 instances | string | "conexion-miaguila" |
no |
key_pair_public_key | Key Pair public content | string | `` | no |
lt_ec2_bastion_name | Launch template for bastion name | string | "lt_ma_ec2_dev_bastion" |
no |
lt_ec2_microservice_instance_type | Instance Type for lt microservices | string | "t2.micro" |
no |
lt_ec2_microservice_name | Launch template for microservices name | string | "lt_ma_ec2_dev_microservice" |
no |
lt_ec2_microservice_user_data | User Data for EC2 Microservices Instances | string | `` | no |
lt_ec2_webpage_name | Launch template for WebPage name | string | "lt_ma_ec2_dev_webpage" |
no |
lt_ec2_webpage_user_data | User Data for EC2 WebPage Instances | string | `` | no |
name | VPC's Name | string | n/a | yes |
private_subnets | List of private subnets inside the VPC | list(string) | `` | yes |
public_subnets | List of public subnets inside the VPC | list(string) | `` | yes |
rds_instance_dwh_type | Instance type for dwh db | string | "db.t2.micro" |
no |
rds_instance_postgres_type | Instance type for postgres db | string | "db.t2.micro" |
no |
sg_ma_ec2_microservices_desc | Sec Group Description | string | "Sec Group For EC2 Microservices Instances" |
no |
tags | A map of tags to add to all resources | string | <map> |
no |
tenancy | VPC tenancy | string | n/a | yes |
tg_ec2_names | List of names for target group | list(string) | `` | yes |
tg_ec2_ports | List of ports numbers for target group must be equal of tg_ec2_names number | list(string) | `` | yes |
tg_ec2_web_ports | List of ports numbers for WebPage target group | list(string) | `` | yes |
Para esta prueba no se tomó en cuenta las variables de salida ya que por el momento no se van a utilizar para otros proyectos.
La siguiente es la estructura del proyecto:
MIAGUILA-TERRAFORM
├── conexion-miaguila.pem
├── lambda_function.py
├── lambda.zip
├── main.tf
├── modules
│ └── vpc
│ ├── 01_main.tf
│ ├── 02_securitygroups.tf
│ ├── 03_ec2.tf
│ ├── 04_hosted_zone.tf
│ ├── 05_s3.tf
│ ├── 06_lambda.tf
│ ├── 07_rds.tf
│ ├── 08_elasticache.tf
│ └── variables.tf
├── provider.tf.example (Cambiar a provider.tf con las credenciales correctas)
└── README.md
- Las lambdas se crearon automaticamente tomando como archivo de entrada
lambda.zip
este archivo contiene una funcion en python basica(ver archivo lambda_function.py)
que imprime la fecha y hora cuando se llama y retorna un"lambda ejecutado correctamente"
- La creación de las instancias se hizo a traves de AutoScaling Group y Launch Template se crearon 3 de cada tipo para los siguientes tipos de instancias.
- Instancias para microservicios.
ag_ma_ec2_microservices
ylt_ma_ec2_microservices
- Instancia para la WebPage.
ag_ma_ec2_webpage
ylt_ma_ec2_webpage
- Instancia para el bastion. Por facilidad se crea esta instancia para poder verificar el correcto funcionamiento de los microservicios y de la WebPage y acceder a las instancias de la zona privada.
ag_ma_ec2_bastion
ylt_ma_ec2_microservices
- Instancias para microservicios.
- En las instancias de microservicios se incluyó el siguiente user data de instancia en el código terraform para exponer los servicios de los puertos
3001
,3002
y3003
, este user data fue codificado en base64 para incluirlo más facilmente en el código terraform.#!/bin/bash -xe exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1 ######################################################################################################### ## Ejecución de los 3 microservicios internos en los puertos especificados ######################################################################################################## docker run -d -p 3001:8080 drhelius/helloworld-python-microservice docker run -d -p 3002:8080 drhelius/helloworld-python-microservice docker run -d -p 3003:8080 drhelius/helloworld-python-microservice
- En la instancia de la WebPage se incluyó el siguiente user data de instancia en el código terraform para exponer el servidor web con pagina de inicio básica, este user data fue codificado en base64 para incluirlo más facilmente en el código terraform.
#!/bin/bash -xe ######################################################################################################### ## Instlacion de Servidor básico y ejecución del servicio ######################################################################################################## exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1 yum install -y httpd cat > /var/www/html/index.html << EOF <html> <header><title>Bienvenidos a Mi Águila</title></header> <body> Bienvenidos a Mi Águila </body> </html> EOF systemctl start httpd.service
- Se incluye el archivo
conexion-miaguila.pem
el cual se usa para la conexión con las instancias de las subnets, en el launch template de las instancias se incluye el nombre del archivo y a través del resourceaws_key_pair.key_pair_ma
se incluye la clave pública codificada en base64.
Algunas mejoras que se pueden implementar son:
- Incluir un ECS para la ejecución de las tareas de los microservicios.
- Si los microservicios son sencillos sustituirlos por lambdas ya que su costo es muy bajo y se corren en ambiente serverless por lo que no se necesitarían instancias EC2 ni balanceadores de carga.
- Incluir un api gateway para mejorar la seguridad de los servicios.
- Cambiar la WebPage desde una instancia EC2 y pasarla totalmente a una WebPage alojada en S3 (con un front con esto se tiene disponibilidad del %99.9.