💫 Tareas en AWS Academy con AWS CLI
Cuando utilizamos AWS Academy y su Learner Lab puede interesarnos personalizar el entorno de los alumnos.
Muestro una posible solución de automatización de la creación de entornos de tareas/pruebas con AWS CLI.
Es una propuesta inicial que puede servir como idea, para todos los profesores, de generación de laboratorios y tareas que se puedan compartir y usar entre todos nosotros.
Simplemente se utiliza AWS Cli y GitHub como repositorio de los scripts.
Este es mi primer artículo en esta comunidad y quizás no es de un nivel muy avanzado. Pero para mi si ha sido bastante complicado.
⚙️ Referencia de comandos AWS CLI
En este repositorio, Amazon, nos proporciona muchos ejemplos del Cli de AWS para lanzar casi todos sus servicios
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/index.html#cli-aws-ec2
⚙️ Mi repositorio javiteran/AWS_Cli
Aquí está el código que he utilizado para lanzar el laboratorio y todas sus configuraciones.
https://github.com/javiteran/AWS_Cli
Acceso a la grabación de prueba del entorno:
💥 Consola de configuración del entorno en el Learner Lab
🔨 Creación de entorno de tareas 00AWSLab01.sh
Para lanzar un ejemplo de laboratorio se puede hacer lo siguiente:
git clone https://github.com/javiteran/AWS_Cli.git
cd AWS_Cli
sh 00AWSLab01.sh 21
Este script creará:
- Una VPC.
- Una subred pública.
- Una puerta de enlace de internet.
- La tabla de enrutamiento de la subred para permitir conectarse a internet.
- Un grupo de seguridad para Ubuntu y otro para Windows.
- Se abrirán los puertos 80, 22 y 3389 para Ubuntu y Windows respectivamente. (y el 53 para DNS como práctica inicial).
- Se permitirá todo el tráfico entre las instancias de la VPC.
- Una instancia EC2 con Windows Server 2022.
- Una instancia EC2 con Ubuntu Server 22.04.
- En Ubuntu y Windows se instalarán servicios y roles como DNS para probar la instalación en la creación.
- Direcciones IPs públicas para las instancias EC2.
🕐Salida de la ejecución del comando
✅Consola con los servicios instalados
Código
###############################################################################
# Creación de una VPC, subredes,
# internet gateway y tabla de rutas
# Además creará :
# - una instancia EC2 Ubuntu Server 22.04
# - una instancia EC2 Windows Server 2022
# con IPs elásticas
# en AWS con AWS CLI
#
# Utilizado para AWS Academy Learning Lab
#
# Autor: Javier Terán González
# Fecha: 06/12/2022
###############################################################################
## Tratamiento de variables de entrada
# Error si el número de parámetros menor o igual que 0
if [ $# -le 0 ]; then
echo "Hay que introducir el número de alumno NN. (Entre 01 y 99)."
exit 1
fi
# Error si el parámetro no está entre 01 y 99
if [ "$1" -gt 0 ] && [ "$1" -le 99 ]; then
echo "Correcto. Es un número"
else
echo "Hay que introducir el número de alumno NN. (Entre 01 y 99)."
exit 1
fi
#echo "Hola $@!"
NN=$1
echo "Alumno: " $NN;
###############################################################################
AWS_VPC_CIDR_BLOCK=10.22.0.0/16
AWS_Subred_CIDR_BLOCK=10.22.1$NN.0/24
AWS_IP_UbuntuServer=10.22.1$NN.100
AWS_IP_WindowsServer=10.22.1$NN.200
AWS_Proyecto=SRI$NN
echo "######################################################################"
echo "Creación de una VPC, subredes, internet gateway y tabla de rutas."
echo "Además creará una instancia EC2 Ubuntu Server 22.04 y una instancia EC2 Windows Server 2022 con IPs elásticas en AWS con AWS CLI"
echo "Se van a crear con los siguientes valores:"
echo "Alumno: " $NN
echo "AWS_VPC_CIDR_BLOCK: " $AWS_VPC_CIDR_BLOCK
echo "AWS_Subred_CIDR_BLOCK: " $AWS_Subred_CIDR_BLOCK
echo "AWS_IP_UbuntuServer: " $AWS_IP_UbuntuServer
echo "AWS_IP_WindowsServer: " $AWS_IP_WindowsServer
echo "AWS_Proyecto: " $AWS_Proyecto
echo "######################################################################"
###############################################################################
## Crear una VPC (Virtual Private Cloud) con su etiqueta
## La VPC tendrá un bloque IPv4 proporcionado por el usuario y uno IPv6 de AWS ???
echo "############## Crear VPC, Subred, Rutas, Gateway #####################"
echo "######################################################################"
echo "Creando VPC..."
AWS_ID_VPC=$(aws ec2 create-vpc \
--cidr-block $AWS_VPC_CIDR_BLOCK \
--amazon-provided-ipv6-cidr-block \
--tag-specification ResourceType=vpc,Tags=[{Key=Name,Value=$AWS_Proyecto-vpc}] \
--query 'Vpc.{VpcId:VpcId}' \
--output text)
## Habilitar los nombres DNS para la VPC
aws ec2 modify-vpc-attribute \
--vpc-id $AWS_ID_VPC \
--enable-dns-hostnames "{\"Value\":true}"
## Crear una subred publica con su etiqueta
echo "Creando Subred..."
AWS_ID_SubredPublica=$(aws ec2 create-subnet \
--vpc-id $AWS_ID_VPC --cidr-block $AWS_Subred_CIDR_BLOCK \
--availability-zone us-east-1a \
--tag-specifications ResourceType=subnet,Tags=[{Key=Name,Value=$AWS_Proyecto-subred-publica}] \
--query 'Subnet.{SubnetId:SubnetId}' \
--output text)
## Habilitar la asignación automática de IPs públicas en la subred pública
aws ec2 modify-subnet-attribute \
--subnet-id $AWS_ID_SubredPublica \
--map-public-ip-on-launch
## Crear un Internet Gateway (Puerta de enlace) con su etiqueta
echo "Creando Internet Gateway..."
AWS_ID_InternetGateway=$(aws ec2 create-internet-gateway \
--tag-specifications ResourceType=internet-gateway,Tags=[{Key=Name,Value=$AWS_Proyecto-igw}] \
--query 'InternetGateway.{InternetGatewayId:InternetGatewayId}' \
--output text)
## Asignar el Internet gateway a la VPC
aws ec2 attach-internet-gateway \
--vpc-id $AWS_ID_VPC \
--internet-gateway-id $AWS_ID_InternetGateway
## Crear una tabla de rutas
echo "Creando tabla de rutas..."
AWS_ID_TablaRutas=$(aws ec2 create-route-table \
--vpc-id $AWS_ID_VPC \
--query 'RouteTable.{RouteTableId:RouteTableId}' \
--output text )
## Crear la ruta por defecto a la puerta de enlace IPv4 (Internet Gateway)
echo " Ruta por defecto IPv4 0.0.0.0/0..."
aws ec2 create-route \
--route-table-id $AWS_ID_TablaRutas \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id $AWS_ID_InternetGateway
## Crear la ruta por defecto a la puerta de enlace IPv4 (Internet Gateway)
echo " Ruta por defecto IPv6 ::/0..."
aws ec2 create-route --route-table-id $AWS_ID_TablaRutas \
--destination-ipv6-cidr-block ::/0 \
--gateway-id $AWS_ID_InternetGateway
## Asociar la subred pública con la tabla de rutas
AWS_ROUTE_TABLE_ASSOID=$(aws ec2 associate-route-table \
--subnet-id $AWS_ID_SubredPublica \
--route-table-id $AWS_ID_TablaRutas \
--output text)
## Añadir etiqueta a la ruta por defecto
AWS_DEFAULT_ROUTE_TABLE_ID=$(aws ec2 describe-route-tables \
--filters "Name=vpc-id,Values=$AWS_ID_VPC" \
--query 'RouteTables[?Associations[0].Main != `flase`].RouteTableId' \
--output text) &&
aws ec2 create-tags \
--resources $AWS_DEFAULT_ROUTE_TABLE_ID \
--tags "Key=Name,Value=$AWS_Proyecto ruta por defecto"
## Añadir etiquetas a la tabla de rutas
aws ec2 create-tags \
--resources $AWS_ID_TablaRutas \
--tags "Key=Name,Value=$AWS_Proyecto-rtb-public"
###############################################################################
###############################################################################
###############################################################################
#################### UBUNTU SERVER ##################################
###############################################################################
###############################################################################
###############################################################################
## Crear un grupo de seguridad Ubuntu Server
echo "########################### Ubuntu Server ############################"
echo "######################################################################"
echo "Creando grupo de seguridad Ubuntu Server..."
AWS_ID_GrupoSeguridad_Ubuntu=$(aws ec2 create-security-group \
--vpc-id $AWS_ID_VPC \
--group-name $AWS_Proyecto-us-sg \
--description "$AWS_Proyecto-us-sg" \
--output text)
echo "ID Grupo de seguridad de ubuntu: " $AWS_ID_GrupoSeguridad_Ubuntu
echo "Añadiendo reglas de seguridad al grupo de seguridad Ubuntu Server..."
## Abrir los puertos de acceso a la instancia
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Ubuntu \
--ip-permissions '[{"IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "IpRanges": [{"CidrIp": "0.0.0.0/0", "Description": "Allow SSH"}]}]'
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Ubuntu \
--ip-permissions '[{"IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "IpRanges": [{"CidrIp": "0.0.0.0/0", "Description": "Allow HTTP"}]}]'
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Ubuntu \
--ip-permissions '[{"IpProtocol": "tcp", "FromPort": 53, "ToPort": 53, "IpRanges": [{"CidrIp": "0.0.0.0/0", "Description": "Allow DNS(TCP)"}]}]'
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Ubuntu \
--ip-permissions '[{"IpProtocol": "UDP", "FromPort": 53, "ToPort": 53, "IpRanges": [{"CidrIp": "0.0.0.0/0", "Description": "Allow DNS(UDP)"}]}]'
## Añadirle etiqueta al grupo de seguridad
echo "Añadiendo etiqueta al grupo de seguridad Ubuntu Server..."
aws ec2 create-tags \
--resources $AWS_ID_GrupoSeguridad_Ubuntu \
--tags "Key=Name,Value=$AWS_Proyecto-us-sg"
###############################################################################
## Crear una instancia EC2 (con una imagen de ubuntu 22.04 del 04/07/2022)
echo ""
echo "Creando instancia EC2 Ubuntu ##################################"
AWS_AMI_Ubuntu_ID=ami-052efd3df9dad4825
AWS_EC2_INSTANCE_ID=$(aws ec2 run-instances \
--image-id $AWS_AMI_Ubuntu_ID \
--instance-type t2.micro \
--key-name vockey \
--monitoring "Enabled=false" \
--security-group-ids $AWS_ID_GrupoSeguridad_Ubuntu \
--subnet-id $AWS_ID_SubredPublica \
--user-data file://datosusuarioUbuntu.txt \
--private-ip-address $AWS_IP_UbuntuServer \
--tag-specifications ResourceType=instance,Tags=[{Key=Name,Value=$AWS_Proyecto-us}] \
--query 'Instances[0].InstanceId' \
--output text)
#echo $AWS_EC2_INSTANCE_ID
###############################################################################
## Crear IP Estatica para la instancia Ubuntu. (IP elastica)
echo "Creando IP elastica Ubuntu"
AWS_IP_Fija_UbuntuServer=$(aws ec2 allocate-address --output text)
echo $AWS_IP_Fija_UbuntuServer
## Recuperar AllocationId de la IP elastica
AWS_IP_Fija_UbuntuServer_AllocationId=$(echo $AWS_IP_Fija_UbuntuServer | awk '{print $1}')
echo $AWS_IP_Fija_UbuntuServer_AllocationId
## Añadirle etiqueta a la ip elástica de Ubuntu
aws ec2 create-tags \
--resources $AWS_IP_Fija_UbuntuServer_AllocationId \
--tags Key=Name,Value=$AWS_Proyecto-us-ip
###############################################################################
## Asociar la ip elastica a la instancia Ubuntu
echo "Esperando a que la instancia esté disponible para asociar la IP elastica"
sleep 100
aws ec2 associate-address --instance-id $AWS_EC2_INSTANCE_ID --allocation-id $AWS_IP_Fija_UbuntuServer_AllocationId
###############################################################################
###############################################################################
###############################################################################
#################### WINDOWS SERVER #################################
###############################################################################
###############################################################################
###############################################################################
echo "########################### Windows Server ###########################"
echo "######################################################################"
## Crear un grupo de seguridad Windows Server
echo "Creando grupo de seguridad Windows Server..."
AWS_ID_GrupoSeguridad_Windows=$(aws ec2 create-security-group \
--vpc-id $AWS_ID_VPC \
--group-name $AWS_Proyecto-ws-sg \
--description "$AWS_Proyecto-ws-sg" \
--output text)
echo "ID Grupo de seguridad de windows: " $AWS_ID_GrupoSeguridad_Windows
## Abrir los puertos de acceso a la instancia
echo "Añadiendo reglas de seguridad al grupo de seguridad Windows Server..."
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Windows \
--ip-permissions '[{"IpProtocol": "tcp", "FromPort": 3389, "ToPort": 3389, "IpRanges": [{"CidrIp": "0.0.0.0/0", "Description": "Allow RDP"}]}]'
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Windows \
--ip-permissions '[{"IpProtocol": "tcp", "FromPort": 53, "ToPort": 53, "IpRanges": [{"CidrIp": "0.0.0.0/0", "Description": "Allow DNS(TCP)"}]}]'
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Windows \
--ip-permissions '[{"IpProtocol": "UDP", "FromPort": 53, "ToPort": 53, "IpRanges": [{"CidrIp": "0.0.0.0/0", "Description": "Allow DNS(UDP)"}]}]'
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Windows \
--ip-permissions '[{"IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "IpRanges": [{"CidrIp": "0.0.0.0/0", "Description": "Allow HTTP"}]}]'
## Añadirle etiqueta al grupo de seguridad
echo "Añadiendo etiqueta al grupo de seguridad Windows Server..."
aws ec2 create-tags \
--resources $AWS_ID_GrupoSeguridad_Windows \
--tags "Key=Name,Value=$AWS_Proyecto-ws-sg"
###############################################################################
## Crear una instancia EC2 (con una imagen de Windows Server 2022 del 22/10/2022)
echo ""
echo "Creando instancia EC2 Windows ##################################"
AWS_AMI_Windows_ID=ami-07a53499a088e4a8c
AWS_EC2_INSTANCE_ID=$(aws ec2 run-instances \
--image-id $AWS_AMI_Windows_ID \
--instance-type t2.micro \
--key-name vockey \
--monitoring "Enabled=false" \
--security-group-ids $AWS_ID_GrupoSeguridad_Windows \
--subnet-id $AWS_ID_SubredPublica \
--user-data file://datosusuarioWindows.txt \
--private-ip-address $AWS_IP_WindowsServer \
--tag-specifications ResourceType=instance,Tags=[{Key=Name,Value=$AWS_Proyecto-ws}] \
--query 'Instances[0].InstanceId' \
--output text)
#En datos de usuario ponemos powershell para instalar el rol DNS y deshabilitar el firewall
#echo $AWS_EC2_INSTANCE_ID
###############################################################################
## Crear IP Estatica para la instancia Windows. (IP elastica)
echo "Creando IP elastica Windows"
AWS_IP_Fija_WindowsServer=$(aws ec2 allocate-address --output text)
echo $AWS_IP_Fija_WindowsServer
## Recuperar AllocationId de la IP elastica
AWS_IP_Fija_WindowsServer_AllocationId=$(echo $AWS_IP_Fija_WindowsServer | awk '{print $1}')
echo $AWS_IP_Fija_WindowsServer_AllocationId
## Añadirle etiqueta a la ip elástica de Windows
aws ec2 create-tags \
--resources $AWS_IP_Fija_WindowsServer_AllocationId \
--tags "Key=Name,Value=$AWS_Proyecto-ws-ip"
###############################################################################
## Asociar la ip elastica a la instancia Windows
echo "Esperando a que la instancia esté disponible para asociar la IP elastica. Tardará 2 minutos..."
sleep 120
aws ec2 associate-address --instance-id $AWS_EC2_INSTANCE_ID --allocation-id $AWS_IP_Fija_WindowsServer_AllocationId
###############################################################################
echo "Permitir todo el tráfico entre los grupos de seguridad de las instancias"
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Ubuntu \
--source-group $AWS_ID_GrupoSeguridad_Windows \
--protocol all
aws ec2 authorize-security-group-ingress \
--group-id $AWS_ID_GrupoSeguridad_Windows \
--source-group $AWS_ID_GrupoSeguridad_Ubuntu \
--protocol all
###############################################################################
## Mostrar las ips publicas de las instancias
echo "Mostrando las ips publicas de las instancias"
AWS_EC2_INSTANCE_PUBLIC_IP=$(aws ec2 describe-instances \
--query "Reservations[*].Instances[*].PublicIpAddress" \
--output=text) &&
echo $AWS_EC2_INSTANCE_PUBLIC_IP
###############################################################################
⚠Hacer lo mismo con Python3 y Boto3
Puedes buscar documentación para hacer los mismo con python3 en la siguiente web. https://boto3.amazonaws.com/v1/documentation/api/latest/guide/examples.html
Top comments (0)