Ejecución de comandos en la instancia de Linux durante el lanzamiento - Amazon Elastic Compute Cloud

Ejecución de comandos en la instancia de Linux durante el lanzamiento

Cuando se lanza una instancia en Amazon EC2, tiene la opción de transmitir los datos de usuario a la instancia que se pueden utilizar para realizar tareas de configuración automáticas comunes e incluso ejecutar scripts después de que se inicie la instancia. Puede transferir dos tipos de datos de usuario a Amazon EC2: scripts de shell y directivas cloud-init. También puede transmitir estos datos en el asistente de lanzamiento como texto sin formato, como archivo (esto resulta útil para lanzar instancias con las herramientas de la línea de comandos) o como texto codificado en base64 (para llamadas a la API).

Si le interesan escenarios de automatización más complejos, plantéese el uso de AWS CloudFormation y AWS OpsWorks. Para obtener más información, consulte la Guía del usuario de AWS CloudFormation y la AWS OpsWorks User Guide.

Para obtener información sobre la ejecución de comandos en instancias de Windows durante el lanzamiento, consulte Ejecución de comandos en la instancia de Windows durante el lanzamiento y Administración de la configuración de instancias de Windows en la Guía del usuario de Amazon EC2 para instancias de Windows.

En los ejemplos siguientes, los comandos de Instalación de un servidor web LAMP en Amazon Linux 2 se convierten en un script de shell y un grupo de directivas cloud-init que se ejecuta cuando se lanza la instancia. En cada ejemplo, los datos de usuario ejecutan las tareas siguientes:

  • Se actualizan los paquetes de software de distribución.

  • Se instalan los paquetes del servidor web php y mariadb necesarios.

  • El servicio httpd se inicia y se activa mediante el comando systemctl.

  • Se añade ec2-user al grupo apache.

  • Se establecen los permisos de archivo y la propiedad adecuados para el directorio web y los archivos que contiene.

  • Se crea una página web sencilla para probar el servidor web y el motor PHP.

Requisitos previos

En los ejemplos siguientes se supone que la instancia tiene un nombre DNS público al que se puede tener acceso desde Internet. Para obtener más información, consulte Paso 1: Lanzamiento de una instancia. También debe configurar el grupo de seguridad para que permita las conexiones SSH (puerto 22), HTTP (puerto 80) y HTTPS (puerto 443). Para obtener más información acerca de estos requisitos previos, consulte Configuración con Amazon EC2.

Asimismo, estas instrucciones son para usar con Amazon Linux 2 y los comandos y directivas tal vez no funcionen con otras distribuciones de Linux. Para obtener más información acerca de otras distribuciones de Linux, por ejemplo su compatibilidad con cloud-init, consulte la documentación específica.

Scripts de shell y datos de usuario

Si está familiarizado con la creación de scripts desde el shell, esta es la forma más sencilla y completa de enviar instrucciones a una instancia tras su lanzamiento. Si estas tareas se agregan en el momento del arranque, aumentará la cantidad de tiempo necesario para arrancar la instancia. Conceda algunos minutos extra para que estas tareas se completen antes de probar que el script de usuario ha finalizado satisfactoriamente.

importante

De forma predeterminada, los scripts de datos de usuario y las directivas cloud-init solo se ejecutan durante el primer ciclo de arranque cuando se lanza una instancia por primera vez. Puede actualizar su configuración para asegurarse de que sus scripts de datos de usuario y directivas cloud-init se ejecutan cada vez que reinicia la instancia. Para obtener más información, consulte How can I execute user data with every restart of my EC2 instance? (¿Cómo puedo ejecutar datos de usuario con cada reinicio de mi instancia EC2?) en el AWS Knowledge Center.

Los scripts de shell de datos de usuario deben comenzar por los caracteres #! y la ruta del intérprete que se desea que lea el script (normalmente /bin/bash). Para obtener una introducción más amplia a los scripts de shell, consulte BASH Programming HOW-TO en el proyecto de documentación de Linux (tldp.org).

Los scripts que se introducen como datos de usuario se ejecutan como el usuario root; por consiguiente, no use el comando sudo en el script. Recuerde que los archivos que cree serán propiedad de root; si necesita que usuarios no raíz tengan acceso a los archivos, tendrá que modificar los permisos consecuentemente en el script. Asimismo, como el script no se ejecuta de forma interactiva, no puede incluir comandos que requieran respuestas de los usuarios (como yum update sin la marca -y).

El archivo de registro de salida cloud-init (/var/log/cloud-init-output.log) captura la salida para que pueda depurar sus scripts fácilmente después del lanzamiento si una instancia no se comporta de la manera prevista.

Cuando se procesa un script de datos del usuario, se copia y se ejecuta desde /var/lib/cloud/instances/instance-id/. El script no se elimina después de ejecutarse. Asegúrese de eliminar los scripts de /var/lib/cloud/instances/instance-id/ antes de crear una AMI desde la instancia. De lo contrario, el script estará en este directorio en cualquier instancia lanzada desde la AMI.

Datos de usuario y la consola

Puede especificar los datos de usuario de la instancia al lanzar la instancia. Si el volumen raíz de la instancia es un volumen de EBS, también puede detener la instancia y actualizar los datos de usuario.

Especificar los datos de usuario de la instancia durante el lanzamiento

Siga el procedimiento para lanzar una instancia en Lanzar una instancia con el asistente de lanzamiento de instancias, pero cuando llegue al Paso 3: Configurar los detalles de la instancia en el procedimiento, copie el script de shell en el campo User data (Datos de usuario) y complete el procedimiento de lanzamiento.

En el script de ejemplo siguiente, el script crea y configura nuestro servidor web.

#!/bin/bash yum update -y amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2 yum install -y httpd mariadb-server systemctl start httpd systemctl enable httpd usermod -a -G apache ec2-user chown -R ec2-user:apache /var/www chmod 2775 /var/www find /var/www -type d -exec chmod 2775 {} \; find /var/www -type f -exec chmod 0664 {} \; echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

Conceda tiempo suficiente para que la instancia se lance y ejecute los comandos del script y después compruebe si el script ha completado las tareas deseadas.

Para nuestro ejemplo, en un explorador web, escriba la URL del archivo PHP de prueba que ha creado el script. Esta URL es la dirección DNS pública de la instancia seguida de una barra diagonal y el nombre del archivo.

http://my.public.dns.amazonaws.com/phpinfo.php

Debería ver la página de información PHP. Si no puede ver la página de información de PHP, compruebe que el grupo de seguridad que usa contiene una regla que permite el tráfico HTTP (puerto 80). Para obtener más información, consulte Agregar reglas a un grupo de seguridad.

(Opcional) Si el script no llevó a cabo las tareas que esperaba o si simplemente desea verificar que las completó sin errores, examine el archivo de registro de salida de cloud-init en /var/log/cloud-init-output.log y busque los mensajes de error.

Para obtener información adicional sobre depuración, puede crear un archivo multiparte Mime que incluya una sección de datos cloud-init con la directiva siguiente:

output : { all : '| tee -a /var/log/cloud-init-output.log' }

Esta directiva envía el resultado de los comandos del script a /var/log/cloud-init-output.log. Para obtener más información sobre los formatos de datos de cloud-init y cómo crear un archivo multiparte Mime, consulte cloud-init Formats.

Visualizar y actualizar los datos de usuario de la instancia

Para modificar los datos de usuario de la instancia

  1. Abra la consola de Amazon EC2 en https://console.aws.amazon.com/ec2/.

  2. En el panel de navegación, seleccione Instances (Instancias).

  3. Seleccione la instancia y elija Actions (Acciones), Instance State (Estado de la instancia) y Stop (Detener).

    aviso

    Cuando detiene una instancia, se borran los datos contenidos en todos los volúmenes de almacén de instancias. Para conservar los datos de los volúmenes del almacén de instancias, asegúrese de realizar una copia de seguridad en un sistema de almacenamiento persistente.

  4. Cuando se le pida confirmación, elija Yes, Stop (Sí, detener). Puede que transcurran unos minutos hasta que la instancia se detenga.

  5. Con la instancia aún seleccionada, elija Actions (Acciones), Instance Settings (Configuración de la instancia) y View/Change User Data (Ver o modificar datos del usuario). Los datos de usuario no se pueden cambiar si la instancia se está ejecutando, pero puede verlos.

  6. En el cuadro de diálogo View/Change User Data (Ver o modificar datos del usuario), actualice los datos de usuario y, a continuación, elija Save (Guardar).

  7. Reinicie la instancia. Los nuevos datos de usuario son visibles en la instancia tras reiniciarla; sin embargo, los scripts de datos de usuario no se ejecutan.

Directivas cloud-init y datos de usuario

El paquete cloud-init configura aspectos específicos de una nueva instancia de Amazon Linux cuando se lanza; lo más notable es que configura el archivo .ssh/authorized_keys para el usuario ec2-user, de forma que puede iniciar sesión con su propia clave privada. Para obtener más información, consulte cloud-init.

Las directivas de usuario cloud-init se pueden pasar a una instancia durante el lanzamiento del mismo modo que se pasa un script, si bien la sintaxis es diferente. Para obtener mas información sobre cloud-init, visite http://cloudinit.readthedocs.org/en/latest/index.html.

importante

De forma predeterminada, los scripts de datos de usuario y las directivas cloud-init solo se ejecutan durante el primer ciclo de arranque cuando se lanza una instancia por primera vez. Puede actualizar su configuración para asegurarse de que sus scripts de datos de usuario y directivas cloud-init se ejecutan cada vez que reinicia la instancia. Para obtener más información, consulte How can I execute user data with every restart of my EC2 instance? (¿Cómo puedo ejecutar datos de usuario con cada reinicio de mi instancia EC2?) en el AWS Knowledge Center.

Si estas tareas se agregan en el momento del arranque, aumentará la cantidad de tiempo necesario para arrancar una instancia. Conceda unos cuantos minutos extra para que estas tareas se completen antes de probar que las directivas de datos de usuario han finalizado.

Para pasar directivas cloud-init a una instancia con datos de usuario

  1. Siga el procedimiento para lanzar una instancia que se indica en Lanzar una instancia con el asistente de lanzamiento de instancias, pero cuando llegue al Paso 3: Configurar los detalles de la instancia en el procedimiento, escriba el texto de la directiva cloud-init en el campo User data (Datos de usuario) y complete el procedimiento de lanzamiento.

    En el ejemplo siguiente, las directivas crean y configuran un servidor web en Amazon Linux 2. La línea #cloud-config de la parte superior es obligatoria para poder identificar los comandos como directivas cloud-init.

    #cloud-config repo_update: true repo_upgrade: all packages: - httpd - mariadb-server runcmd: - [ sh, -c, "amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2" ] - systemctl start httpd - sudo systemctl enable httpd - [ sh, -c, "usermod -a -G apache ec2-user" ] - [ sh, -c, "chown -R ec2-user:apache /var/www" ] - chmod 2775 /var/www - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ] - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ] - [ sh, -c, 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php' ]
  2. Conceda tiempo suficiente para que la instancia se lance y ejecute las directivas en los datos de usuario y después compruebe si las directivas han completado las tareas deseadas.

    Para nuestro ejemplo, en un explorador web, escriba la URL del archivo PHP de prueba que han creado las directivas. Esta URL es la dirección DNS pública de la instancia seguida de una barra diagonal y el nombre del archivo.

    http://my.public.dns.amazonaws.com/phpinfo.php

    Debería ver la página de información PHP. Si no puede ver la página de información de PHP, compruebe que el grupo de seguridad que usa contiene una regla que permite el tráfico HTTP (puerto 80). Para obtener más información, consulte Agregar reglas a un grupo de seguridad.

  3. (Opcional) Si las directivas no llevaron a cabo las tareas que esperaba o si simplemente desea verificar que las completaron sin errores, examine el archivo de registro de salida en /var/log/cloud-init-output.log y busque los mensajes de error en el resultado. Para obtener información adicional sobre depuración, puede agregar las líneas siguientes a las directivas:

    output : { all : '| tee -a /var/log/cloud-init-output.log' }

    Esta directiva envía el resultado de runcmd a /var/log/cloud-init-output.log.

Datos de usuario y las AWS CLI

Puede usar la AWS CLI para especificar, modificar y ver los datos de usuario de la instancia. Para obtener más información acerca de cómo ver los datos de usuario de la instancia usando los metadatos de la instancia, consulte Recuperar los datos de usuario de la instancia.

En Windows puede utilizar las Herramientas de AWS para Windows PowerShell en vez de la AWS CLI. Para obtener más información, consulte Datos de usuario y las Herramientas para Windows PowerShell en la Guía del usuario de Amazon EC2 para instancias de Windows.

Ejemplo: Especificar datos de usuario durante el lanzamiento

Para especificar los datos de usuario cuando lance una instancia, ejecute el comando run-instances con el parámetro --user-data. Con run-instances, la AWS CLI lleva a cabo la codificación en base64 de los datos de usuario automáticamente.

En el siguiente ejemplo se muestra cómo especificar un script como cadena en la línea de comandos:

aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data echo user data

En el siguiente ejemplo se muestra cómo especificar un script utilizando un archivo de texto. Asegúrese de utilizar el prefijo file:// para especificar el archivo.

aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data file://my_script.txt

En el siguiente ejemplo se muestra un archivo de texto con un script de shell.

#!/bin/bash yum update -y service httpd start chkconfig httpd on

Ejemplo: Modificar los datos de usuario de una instancia detenida

Puede modificar los datos de usuario de una instancia detenida con el comando modify-instance-attribute. Con modify-instance-attribute, la AWS CLI no lleva a cabo la codificación en base64 de los datos de usuario automáticamente.

  • En un equipo Linux utilice el comando base64 para codificar los datos de usuario.

    base64 my_script.txt >my_script_base64.txt
  • En un equipo Windows, use el comando certutil para codificar los datos de usuario. Para poder usar este archivo con la AWS CLI, debe eliminar la primera línea (BEGIN CERTIFICATE) y la última (END CERTIFICATE).

    certutil -encode my_script.txt my_script_base64.txt notepad my_script_base64.txt

Use los parámetros --attribute y --value para usar el archivo de texto codificado para especificar los datos de usuario. Asegúrese de utilizar el prefijo file:// para especificar el archivo.

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --value file://my_script_base64.txt

Ejemplo: Borrar los datos de usuario de una instancia detenida

Para eliminar los datos de usuario existentes, utilice el comando modify-instance-attribute de la siguiente manera:

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --user-data Value=

Ejemplo: Ver los datos de usuario

Para recuperar los datos de usuario de una instancia, utilice el comando describe-instance-attribute. Con describe-instance-attribute, la AWS CLI no lleva a cabo la descodificación en base64 de los datos de usuario automáticamente.

aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData

El siguiente ejemplo es una salida de ejemplo donde se muestran los datos del usuario codificados en base64.

{ "UserData": { "Value": "IyEvYmluL2Jhc2gKeXVtIHVwZGF0ZSAteQpzZXJ2aWNlIGh0dHBkIHN0YXJ0CmNoa2NvbmZpZyBodHRwZCBvbg==" }, "InstanceId": "i-1234567890abcdef0" }
  • En un equipo Linux, use la opción --query para obtener los datos de usuario codificados y el comando base64 para descodificarlos.

    aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" | base64 --decode
  • En un equipo Windows, use la opción --query para obtener los datos de usuario codificados y el comando certutil para descodificarlos. Observe que el resultado codificado se guarda en un archivo y el resultado descodificado, en otro.

    aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" >my_output.txt certutil -decode my_output.txt my_output_decoded.txt type my_output_decoded.txt

A continuación, se muestra un ejemplo del resultado.

#!/bin/bash yum update -y service httpd start chkconfig httpd on