Inicializar una instancia con User Data

AWSBeginner
Practicar Ahora

Introducción

Tu equipo quiere que cada nuevo servidor de informes arranque con el saludo correcto de la aplicación. Escribirás un script Bash de User Data, lo proporcionarás al lanzar una instancia EC2 e inspeccionarás la aplicación y el registro de inicio resultantes.

Ya debes saber cómo lanzar una instancia EC2 y conectarte por SSH. Este entorno nuevo proporciona su propia imagen, red y par de claves; crearás el servidor y su configuración de inicio.

Relación con la certificación

Este laboratorio practica la configuración programática de recursos y la automatización del inicio, relacionadas con la tarea 3.1 de los objetivos del dominio 3 de AWS Certified Cloud Practitioner CLF-C02.

Configurar la aplicación al lanzar la instancia

En este paso escribirás un script de inicio, lanzarás una instancia con él y verificarás la respuesta de la aplicación.

User Data es información que se proporciona a una instancia al lanzarla. Un script de inicio de Linux puede usarla para configurar software automáticamente. Por defecto, estos scripts se ejecutan como root durante el primer arranque, por lo que sus comandos no necesitan sudo. La guía oficial de EC2 User Data describe este comportamiento y la ubicación del registro.

Empieza en tu espacio de trabajo:

cd /home/labex/project

La imagen preparada contiene la aplicación de informes. Carga los ID de la imagen y la red en tu shell actual:

source launch.env

Crea user-data.sh mediante un here-document. Los delimitadores externos SCRIPT delimitan el script completo; los internos JSON delimitan la configuración de la aplicación. Los delimitadores entre comillas conservan el texto literalmente. La primera línea, #!/bin/bash, selecciona Bash, y set -euo pipefail detiene el script si falla un comando o se usa una variable sin definir. El último echo escribe una entrada útil en el registro de inicio.

cat > user-data.sh <<'SCRIPT'
#!/bin/bash
set -euo pipefail
cat > /etc/report-app/config.json <<'JSON'
{
  "message": "Started with User Data"
}
JSON
echo 'Report application configuration applied.'
SCRIPT

Esto crea un archivo local; todavía no modifica ninguna instancia. Proporciona el archivo a run-instances mediante --user-data file://user-data.sh. AWS CLI lee y codifica el archivo para la API, así que no tienes que codificarlo tú. Nombra el servidor bootstrap-server:

aws ec2 \
  run-instances \
  --image-id "$AMI_ID" \
  --instance-type t3.micro \
  --subnet-id "$SUBNET_ID" \
  --security-group-ids "$SECURITY_GROUP_ID" \
  --key-name report-key \
  --count 1 \
  --user-data file://user-data.sh \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=bootstrap-server}]'

Guarda el ID de la nueva instancia. El filtro selecciona su etiqueta de nombre y $(...) captura el resultado en texto plano:

INSTANCE_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=bootstrap-server \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)

Inspecciona el estado y la dirección pública:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name,PublicIPv4:PublicIpAddress}'

Confirma running. Si todavía aparece pending, espera un momento y repite la consulta. El estado en ejecución por sí solo no demuestra que la configuración de inicio haya funcionado; ahora inspeccionarás la aplicación.

Abre AWS View, pulsa Refresh resources y selecciona bootstrap-server en Application requests. Pulsa Check application. Confirma HTTP 200 y el mensaje Started with User Data. Has configurado el servidor mediante su script de inicio sin editarlo después del lanzamiento.

AWS View muestra HTTP 200 en la aplicación configurada al iniciar

Este ejemplo muestra la respuesta esperada. Los ID de tu instancia y red serán distintos.

Obtén la dirección pública para conectarte por SSH:

PUBLIC_IP=$(aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[0].Instances[0].PublicIpAddress' \
  --output text)

La configuración SSH proporcionada selecciona la clave privada y la ruta de acceso del laboratorio:

ssh -F ssh_config ubuntu@"$PUBLIC_IP"

Ahora estás dentro de la instancia de la aplicación. Lee el registro de salida del inicio con privilegios de administrador:

sudo cat /var/log/cloud-init-output.log

Busca Report application configuration applied. Es la salida del script que proporcionaste. Al diagnosticar un fallo de inicio, revisa los errores de comandos en este registro y después prueba la aplicación, sin confiar únicamente en el estado de la instancia.

Vuelve al terminal de LabEx:

exit

También puedes obtener el User Data guardado en la instancia. Esta consulta selecciona su valor Base64 y la tubería lo envía a base64 --decode para mostrar el script original:

aws ec2 \
  describe-instance-attribute \
  --instance-id "$INSTANCE_ID" \
  --attribute userData \
  --query 'UserData.Value' \
  --output text | base64 --decode

Confirma que el script Bash y el saludo coincidan con tu archivo. User Data normalmente se ejecuta solo en el primer arranque; detener y volver a iniciar una instancia no repite automáticamente esta configuración. Usa la automatización del inicio para lograr una configuración inicial reproducible y no incluyas credenciales en el script.

Terminar el servidor inicializado

En este paso eliminarás la instancia que creaste y verificarás su estado final.

Termina solo la instancia identificada por la variable guardada:

aws ec2 \
  terminate-instances \
  --instance-ids "$INSTANCE_ID"

Espera hasta que la instancia llegue a terminated. El waiter consulta periódicamente el estado y termina sin mostrar salida cuando tiene éxito:

aws ec2 \
  wait instance-terminated \
  --instance-ids "$INSTANCE_ID"

Confirma el estado final:

aws ec2 \
  describe-instances \
  --instance-ids "$INSTANCE_ID" \
  --query 'Reservations[].Instances[].{Instance:InstanceId,State:State.Name}'

El resultado debe mostrar terminated. Actualiza AWS View y confirma que bootstrap-server ya no sea un destino de aplicación en ejecución. Conserva la red y el par de claves preparados.

Resumen

Has escrito un script Bash de User Data y lo has proporcionado a EC2 al lanzar la instancia. Has verificado la configuración automática de la aplicación en AWS View, inspeccionado el registro de salida del inicio y obtenido el script almacenado. Finalmente, has terminado el servidor y confirmado su estado final.