Saltar a tema:
- Resumen del taller
- Crear usuario administrador para el taller
- Establece llaves de acceso en la configuracion de Terraform
- Crear servidor mgmt
- Crear imagen Web con Aplicacion en Docker
- Crear repositorio en ECR y construir imagen de Docker
- Crear servidor Web con aplicacion en Docker
- Limpiar taller
El taller tiene como finalidad hacer una introducción al uso de herramientas de automatización de infraestructura en EC2.
Antes de comenzar el taller es necesario completar los siguientes pasos:
IMPORTANTE: La primera parte del taller crea una instancia con las herramientas necesarias para llevar a cabo el taller pero si deseas usar las herramientas directamente desde tu máquina puedes hacerlo.
Las herramientas que utilizaremos en el taller son:
- Terraform (Herramienta para construir, cambiar y versionar infraestructura de manera segura y eficiente.)
- Packer (Herramienta para crear imágenes de máquina idénticas para múltiples plataformas desde una única configuración de fuente)
- Ansible (Lenguaje de automatización simple que puede describir perfectamente una infraestructura de aplicaciones de TI )
- Docker (Herramienta diseñada para facilitar la creación, implementación y ejecución de aplicaciones mediante el uso de contenedores)
Entra a la cuenta que vas a utilizar en el taller y navega a la consola de usuarios IAM.
Agrega un nuevo usuario que se llame "workshop"
Dar permisos de administrador al nuevo usuario (AdministratorAccess).
IMPORTANTE: Por practicidad le damos estos permisos al usuario, en el mundo real siempre es mejor dar el menor número de permisos a un usuario o rol.
Descargar las llaves de acceso para hacer llamadas al API de AWS.
Para establecer las llaves de acceso puedes exportar las credenciales como variables de ambiente.
$ export AWS_ACCESS_KEY_ID="AKIAJ3RAVUDDQWJADQSQ"
$ export AWS_SECRET_ACCESS_KEY="BpXA8AbiC1vgZUTVrKzsxB/zRnPCaIe8YjP0Q9VDu"
También puedes usar el editor de tu elección, abrir el archivo 1-workshop-mgmt/terraform/provider.tf, descomentar las dos lineas de las llaves de accesso y reemplazar el texto "ACCESS_KEY_HERE" y "SECRET_KEY_HERE".
$ cd ec2-automation-workshop/1-workshop-mgmt/terraform/
$ terraform init
$ terraform apply
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Terraform creará un plan de ejecución y al final pregunta si quieres aplicar el plan, escribe "yes" para aplicar los cambios.
Al aplicar el plan, Terraform dará dos valores de salida, uno es la dirección IP del servidor mgmt que acabamos de crear y que utilizaremos para crear más infraestructura desde el interior de nuestra VPC default, el otro valor es el identificador de la imagen (AMI) que utilizaremos para crear una imagen (AMI) personalizada y a partir de ella crear nuestro servidor Web.
Entra al servidor via Secure Shell utilizando la llave privada insegura de Vagrant y el usuario de Amazon Linux.
$ chmod 0600 ssh-keys/vagrant
$ ssh -i ssh-keys/vagrant ec2-user@18.223.2.127
$ cd ~/2-workshop-web/packer/
$ packer build web.json
Una vez creada la imagen pre-configurada podemos aprovisionar un servidor que sirva nuestra applicación Web. El servidor consiste de un servidor Web (NGINX) que sirve como proxy para servir una aplicación hecha en Python Flask. Para mas detalles de la aplicación ver el archivo de configuración del servidor que es 2-workshop-web/packer/ansible/web-playbook.yml
$ cd ~/2-workshop-web/terraform/
$ terraform init
$ terraform apply
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Nuestra imagen está configurada con una versión de nuestra aplicación en específico, al crear un servidor a partir de esta imagen lo único que hay que hacer es levantar los servicios necesarios para empezar a servir nuestra aplicación. Los servicios los levantamos utilizando user-data en un templete de Terraform. El templete es 2-workshop-web/terraform/files/web/user_data.tpl.
Utiliza la dirección IP de la salida aws_eip_web_public_ip en cualquier navegador para revisar que la aplicación está sirviendo de forma correcta. Puede tardar algunos minutos en verse correctamente.
**Hacer otra versión de la aplicación y cambiar EIP.
Entra al servidor via Secure Shell utilizando la llave privada insegura de Vagrant y el usuario de Amazon Linux.
$ chmod 0600 ssh-keys/vagrant
$ ssh -i ssh-keys/vagrant ec2-user@18.223.2.127
$ cd ~/3-workshop-web-docker/packer/
$ packer build web-docker.json
Nuestra imagen con NGINX y Docker Engine está lista, pero antes de crear el servidor que sirva nuestra aplicación debemos crear un repositorio de Docker para alojar y crear la imagen de Docker. Para mas detalles del servidor ver el archivo de configuración que es 3-workshop-web-docker/packer/ansible/web-docker-playbook.yml
$ cd ~/3-workshop-web-docker/terraform/
$ terraform init
$ terraform apply
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Después de crear nuestro repositorio es tiempo de crear nuestra imagen de Docker:
$ cd ~/python/
$ sudo docker build -t local/web .
Para probar la imagen:
$ sudo docker run --name=web -d -p 5000:5000 local/web
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d0681b75c144 local/web "gunicorn -b :5000 w…" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp web
$ curl "http://localhost:5000"
Etiquetar imagen:
$ sudo docker tag local/web:latest 059715603496.dkr.ecr.us-east-2.amazonaws.com/web-docker:latest
Iniciar sesión en ECR:
$ sudo aws ecr get-login --region us-east-2 --no-include-email
Este comando tiene como salida algo parecido a lo siguiente:
docker login -u AWS -p eyJwYXlsb2FkIjoiNmZ3eW5PZk4xRGJ3Zm0yU3lLZnp2N0VEQ2Jma1o2VTVpMXVUREV2Zlo0Zk92VG83bnFOT1M1NS9iUG9PS1cvaEZrV2VkSW1ZMUNEcisyUkNWNVlxMnJSOG1kWVdGTkxqMUFLcHhrRm85bjc0WndEckdmVmdPUkJUSXJJZldkbytBYXAxODZGODJ2eVFOSWZnK1laYm5PZXdNRmdkUXg4ZlkzSTNtTFNnbDl4K0hzRkhhWUwweGRTbjZMcmRlWGRJU3c4eXZwQ3lCdWtQOWNqU0FiSzIzcDdNa0JxdVM2NXh3N21OejFVSGU1R2JQYVpyWCtKcDNqbmNXR1c4Nlhya2pIODBWOWh4WC94R2x2SzJUdGUvQXNJVjdvbXFBNDJGR0lIYTNOeitwS2QyR1JwL0Vxck5rZEpVZUI0VTJ5K0FsRFZiZi9FWm5PVVNTcxfQ== https://059715603496.dkr.ecr.us-east-2.amazonaws.com
Para iniciar sesión en ECR, copia y pega la salida anterior utilizando sudo.
$ sudo docker login -u AWS -p eyJwYXlsb2FkIjoiNmZ3eW5PZk4xRGJ3Zm0yU3lLZnp2N0VEQ2Jma1o2VTVpMXVUREV2Zlo0Zk92VG83bnFOT1M1NS9iUG9PS1cvaEZrV2VkSW1ZMUNEcisyUkNWNVlxMnJSOG1kWVdGTkxqMUFLcHhrRm85bjc0WndEckdmVmdPUkJUSXJJZldkbytBYXAxODZGODJ2eVFOSWZnK1laYm5PZXdNRmdkUXg4ZlkzSTNtTFNnbDl4K0hzRkhhWUwweGRTbjZMcmRlWGRJU3c4eXZwQ3lCdWtQOWNqU0FiSzIzcDdNa0JxdVM2NXh3N21OejFVSGU1R2JQYVpyWCtKcDNqbmNXR1c4Nlhya2pIODBWOWh4WC94R2x2SzJUdGUvQXNJVjdvbXFBNDJGR0lIYTNOeitwS2QyR1JwL0Vxck5rZEpVZUI0VTJ5K0FsRFZiZi9FWm5PVVNTcxfQ== https://059715603496.dkr.ecr.us-east-2.amazonaws.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
Push de imagen de Docker:
$ sudo docker push 059715603496.dkr.ecr.us-east-2.amazonaws.com/web-docker:latest
961af540d51d: Pushed
c2783771f5e3: Pushed
b341396c46e3: Pushed
a256825872fb: Pushed
1acdea66e0dc: Pushed
f743dc78f43b: Pushed
c7358e96e74b: Pushed
2c30600325be: Pushed
df64d3292fd6: Pushed
latest: digest: sha256:b692acdf518533eaa9d7017f40629d5de7d98710680b7ef6c24ba5231c96c8c6 size: 2201
Una vez creada la imagen pre-configurada podemos aprovisionar un servidor que sirva nuestra applicación Web. La máquina consiste de un servidor Web (NGINX) que funciona como proxy para servir una aplicación hecha en Python Flask que corre dentro de un contenedor de Docker. Para más detalles de la aplicación ver el archivo de configuración del servidor que es 2-workshop-web/packer/ansible/web-playbook.yml
$ cd ~/3-workshop-web-docker/terraform/
Es importante que la configuración del servidor (later/ec2.tf) no esté presente hasta tener nuestra imagen (AMI), repositorio de ECR e imagen de Docker creadas de antemano, de otra forma nuestra aplicación del plan de Terraform fallaría por no tener los recursos necesarios. Ahora que están creados, movemos la configuración de Terraform del servidor al directorio donde aplicamos los cambios de Terraform:
$ mv later/ec2.tf .
$ terraform init
$ terraform apply
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Utiliza la dirección IP de la salida aws_eip_web_docker_public_ip en cualquier navegador para revisar que la aplicación está funcionando de forma correcta. Puede tardar algunos minutos en verse correctamente.
**Hacer otra versión de la aplicación en otro imagen de Docker y cambiar contenedor que corre actualmente por la versión nueva de imagen.
$ cd ~/3-workshop-web-docker/terraform/
$ terraform destroy
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
$ cd ~/2-workshop-web/terraform/
$ terraform destroy
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
$ exit
$ cd ec2-automation-workshop/1-workshop-mgmt/terraform/
$ terraform destroy
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Elimina las imagenes (AMIs) creadas y snapshots: