|
| 1 | +# Desplegando la Configuración Base |
| 2 | + |
| 3 | +## Revisando la configuración base |
| 4 | + |
| 5 | +Abrimos `./.start-app/main.tf` |
| 6 | + |
| 7 | +```tf |
| 8 | +provider "aws" { |
| 9 | + access_key = "ACCESS_KEY" |
| 10 | + secret_key = "SECRET_KEY" |
| 11 | + region = "us-east-1" |
| 12 | +} |
| 13 | +``` |
| 14 | + |
| 15 | +Este bloque le indica a Terraform que usaremos `AWS` como **provider**. |
| 16 | + |
| 17 | +```tf |
| 18 | +data "aws_ssm_parameter" "ami" { |
| 19 | + name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" |
| 20 | +} |
| 21 | +``` |
| 22 | + |
| 23 | +[Blog reference](https://aws.amazon.com/blogs/compute/query-for-the-latest-amazon-linux-ami-ids-using-aws-systems-manager-parameter-store/) |
| 24 | + |
| 25 | +Este es un **service manager parameter**, al cual le damos como nombre de etiqueta `ami`. Dentro de este bloque, estamos alimentando el `path` a un parámetro en particular. En este caso, el parametro devuelve la última Amazon Linux 2 AMI ID. |
| 26 | + |
| 27 | +En la sección de `NETWORKING` creamos la `VPC` |
| 28 | + |
| 29 | +```tf |
| 30 | +resource "aws_vpc" "vpc" { |
| 31 | + cidr_block = "10.0.0.0/16" |
| 32 | + enable_dns_hostnames = "true" |
| 33 | +
|
| 34 | +} |
| 35 | +``` |
| 36 | + |
| 37 | +Después creamos la `internet gateway`, y lo asociamos con la VPC que creamos previamente. Para tal fin usamos `vpc_id = aws_vpc.vpc.id` |
| 38 | + |
| 39 | +```tf |
| 40 | +resource "aws_internet_gateway" "igw" { |
| 41 | + vpc_id = aws_vpc.vpc.id |
| 42 | +
|
| 43 | +} |
| 44 | +``` |
| 45 | + |
| 46 | +> ¿Cómo sabemos que argumentos y atributos están disponibles para un recurso? Tenemos que leer la documentación `;)`: https://registry.terraform.io/providers/hashicorp/aws/latest/docs |
| 47 | +
|
| 48 | +Creamos una `subnet` asociada a la `VPC`. Gracias a esta entrada `map_public_ip_on_launch = "true"`, obtenemos una IP pública |
| 49 | + |
| 50 | +```tf |
| 51 | +resource "aws_subnet" "subnet1" { |
| 52 | + cidr_block = "10.0.0.0/24" |
| 53 | + vpc_id = aws_vpc.vpc.id |
| 54 | + map_public_ip_on_launch = "true" |
| 55 | +} |
| 56 | +``` |
| 57 | + |
| 58 | +Creamos una `route table`, y la asociamos a nuestra `VPC`. Para ver la documentación oficial de este recurso, seguir el siguiente enlace [Route tables official Docs](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html) |
| 59 | + |
| 60 | +```tf |
| 61 | +resource "aws_route_table" "rtb" { |
| 62 | + vpc_id = aws_vpc.vpc.id |
| 63 | +
|
| 64 | + route { |
| 65 | + cidr_block = "0.0.0.0/0" |
| 66 | + gateway_id = aws_internet_gateway.igw.id |
| 67 | + } |
| 68 | +} |
| 69 | +``` |
| 70 | + |
| 71 | +En el bloque anidado, podemos especificar un `route` para añadir a la `route table`. En este caso estamos creando una `default route` y la apuntamos a la `internet gateway`. De esta manera el tráfico puede salir fuera de la `VPC` a través de la `internet gateway`. |
| 72 | + |
| 73 | +Por último asociamos nuestra `route table` con una única `subnet` |
| 74 | + |
| 75 | +```tf |
| 76 | +resource "aws_route_table_association" "rta-subnet1" { |
| 77 | + subnet_id = aws_subnet.subnet1.id |
| 78 | + route_table_id = aws_route_table.rtb.id |
| 79 | +} |
| 80 | +``` |
| 81 | + |
| 82 | +Creamos un `security group` que permita al puerto 80 de cualquier dirección hablar nuestra instancia `EC2` |
| 83 | + |
| 84 | +```tf |
| 85 | +# Nginx security group |
| 86 | +resource "aws_security_group" "nginx-sg" { |
| 87 | + name = "nginx_sg" |
| 88 | + vpc_id = aws_vpc.vpc.id |
| 89 | +
|
| 90 | + # HTTP access from anywhere |
| 91 | + ingress { |
| 92 | + from_port = 80 |
| 93 | + to_port = 80 |
| 94 | + protocol = "tcp" |
| 95 | + cidr_blocks = ["0.0.0.0/0"] |
| 96 | + } |
| 97 | +
|
| 98 | + # outbound internet access |
| 99 | + egress { |
| 100 | + from_port = 0 |
| 101 | + to_port = 0 |
| 102 | + protocol = "-1" |
| 103 | + cidr_blocks = ["0.0.0.0/0"] |
| 104 | + } |
| 105 | +} |
| 106 | +``` |
| 107 | + |
| 108 | +Estamos asocaindo este `security group` con nuestra `VPC`, y estamos creando un único `ingress group` usando un bloque anidado, y dentro de este, establecemos la entrada `from_port` y `to_port` al puerto 80, el protocolo TCP y el `cidr_block` que refiere a todas las direcciones. |
| 109 | + |
| 110 | +Por último tenemos la instancia EC2. |
| 111 | + |
| 112 | +```tf |
| 113 | +resource "aws_instance" "nginx1" { |
| 114 | + ami = nonsensitive(data.aws_ssm_parameter.ami.value) |
| 115 | + instance_type = "t2.micro" |
| 116 | + subnet_id = aws_subnet.subnet1.id |
| 117 | + vpc_security_group_ids = [aws_security_group.nginx-sg.id] |
| 118 | +
|
| 119 | + user_data = <<EOF |
| 120 | +#! /bin/bash |
| 121 | +sudo amazon-linux-extras install -y nginx1 |
| 122 | +sudo service nginx start |
| 123 | +sudo rm /usr/share/nginx/html/index.html |
| 124 | +echo '<html><head><title>Taco Team Server</title></head><body style=\"background-color:#1F778D\"><p style=\"text-align: center;\"><span style=\"color:#FFFFFF;\"><span style=\"font-size:28px;\">Welcome to 🍋 land</span></span></p></body></html>' | sudo tee /usr/share/nginx/html/index.html |
| 125 | +EOF |
| 126 | +
|
| 127 | +} |
| 128 | +``` |
| 129 | + |
| 130 | +> NOTA: Explicar el Workflow de Terraform |
| 131 | +
|
| 132 | +Ahora estamos listos para aplicar el contenido de `main.tf` |
| 133 | + |
| 134 | +[Desplegando la configuración base - Demo 01](01-demo) |
0 commit comments