Ejecución de comandos al lanzar una instancia de EC2 con la entrada de datos de usuario - Amazon Elastic Compute Cloud

Ejecución de comandos al lanzar una instancia de EC2 con la entrada de datos de usuario

Al iniciar una instancia de Amazon EC2, los datos de usuario se pueden transmitir a la instancia utilizada para realizar tareas de configuración automáticas o ejecutar scripts después de que se inicie la instancia.

Si le interesan escenarios de automatización más complejos, puede plantearse el uso de AWS CloudFormation y AWS OpsWorks. Para más información, consulte los siguientes temas:

En las instancias de Linux, puede transferir dos tipos de datos de usuario a Amazon EC2: scripts de intérprete de comandos y directivas cloud-init. También puede pasar estos datos en el asistente de inicialización de instancias como texto sin formato, como archivo (esto resulta útil para iniciar instancias con las herramientas de la línea de comandos) o como texto codificado en base64 (para llamadas a la API).

En las instancias de Windows, los agentes de inicialización gestionan los scripts de datos de usuario. En las siguientes secciones se describen las diferencias en la forma en que se gestionan los datos de los usuarios en cada sistema operativo.

Datos de usuario en la AWS Management Console

Puede especificar los datos de usuario de la instancia al iniciar 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.

Especificación de los datos de usuario de la instancia durante la inicialización con Launch Wizard

Puede especificar los datos de usuario al lanzar una instancia con Launch Wizard en la consola de EC2. Para especificar los datos de usuario en la inicialización, siga el procedimiento para inicializar una instancia. El campo User data (Datos de usuario) se encuentra en la sección Detalles avanzados del asistente de inicialización de instancias. Ingrese el script de shell en el campo User data y, a continuación, complete el procedimiento de inicialización de instancias.

En la siguiente captura de pantalla del campo de datos del usuario, la secuencia de comandos de ejemplo crea un archivo en la carpeta temporal de Windows, utilizando la fecha y la hora actuales en el nombre del archivo. Al incluir <persist>true</persist>, el script se ejecuta cada vez que comienzas o reinicias la instancia. Si deja vacía la casilla Los datos del usuario ya están codificados en base64, la consola Amazon EC2 realizará la codificación en base64 por usted.

Campo de texto de datos del usuario de Advance Details (Detalles avanzados).

Para obtener más información, consulte Especificación de los datos de usuario de la instancia durante la inicialización con Launch Wizard. Para ver un ejemplo de Linux en el que se usa la AWS CLI, consulte Datos de usuario y las AWS CLI. Para ver un ejemplo de Windows en el que se utiliza Tools for Windows PowerShell, consulte Datos de usuario y las Tools for Windows PowerShell.

Visualizar y actualizar los datos de usuario de la instancia

Puede ver los datos de usuario de cualquier instancia y actualizarlos en las instancias detenidas.

Para actualizar los datos de usuario de una instancia con la consola
  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 instance (Detener instancia).

    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 de ellos en un almacenamiento persistente.

  4. Cuando se le pida que confirme, elija Stop. 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 Edit user data (Editar 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 Modificar datos del usuario, actualiza los datos de usuario y a continuación selecciona Guardar. Para ejecutar los scripts de datos de usuario cada vez que comienzas o reinicias la instancia, agrega <persist>true</persist>, tal como se muestra en el siguiente ejemplo:

    Cuadro de diálogo Edit User Data (Editar datos de usuario).
  7. Inicie la instancia. Si habilitaste la ejecución de los datos de usuario para arranques o reinicios posteriores, los scripts de datos de usuario actualizados se ejecutan como parte del proceso de inicio de la instancia.

Gestión por parte de Amazon EC2 de los datos de usuario de las instancias de Linux

En los ejemplos siguientes, los comandos de Install a LAMP server on Amazon Linux 2 se convierten en un script de intérprete de comandos y un conjunto de directivas de cloud-init que se ejecutan cuando se inicia 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

Los ejemplos de este tema suponen lo siguiente:

  • Su instancia tiene un nombre de DNS público al que se puede acceder desde Internet.

  • El grupo de seguridad asociado a la instancia está configurado para permitir el tráfico SSH (puerto 22) para que pueda conectarse a la instancia y ver los archivos de registro de salida.

  • La instancia se inicia con una AMI de Amazon Linux 2. Estas instrucciones son para usar con Amazon Linux 2; es posible que los comandos y directivas 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 el scripting desde el shell, esta es la forma más sencilla y completa de enviar instrucciones a una instancia tras su inicialización. 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 de cloud-init solo se ejecutan durante el ciclo de arranque cuando se inicia una instancia por primera vez. Puede actualizar la configuración para asegurarse de que los scripts de datos de usuario y las directivas de cloud-init se ejecuten cada vez que reinicie la instancia. Para obtener más información, consulte ¿Cómo puedo utilizar los datos de usuario para ejecutar automáticamente un script con cada reinicio de mi instancia de Amazon EC2 Linux? en el AWSCentro de Conocimientos.

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 a las secuencias de intérprete de comandos, consulte el Manual de referencia de Bash en el sitio web del Sistema operativo GNU.

Los scripts que se introducen como datos de usuario se ejecutan como el usuario raíz; por consiguiente, no use el comando sudo en el script. Recuerde que los archivos que cree serán propiedad del usuario raíz; 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).

Si utiliza una API de AWS, incluida la CLI de AWS, en un script de datos del usuario, debe utilizar un perfil de instancia al iniciar la instancia. Un perfil de instancia proporciona las credenciales de AWS adecuadas requeridas por el script de datos del usuario para emitir la llamada a la API. Para obtener más información, consulte Uso de perfiles de instancia en la Guía del usuario de IAM. Los permisos que asigne al rol de IAM dependen de los servicios a los que llame con la API. Para obtener más información, consulte Roles de IAM para Amazon EC2.

El archivo de registro de salida cloud-init captura la salida para que pueda depurar sus scripts fácilmente después de la inicialización si una instancia no se comporta de la manera prevista. Para ver el archivo de registro, conéctese a la instancia y abra /var/log/cloud-init-output.log.

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 iniciada desde la AMI.

Actualización de los datos de usuario de la instancia

Para poder actualizar los datos de usuario de la instancia, primero debe detener la instancia. Si la instancia se está ejecutando, podrá ver los datos del usuario, pero no modificarlos.

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 de ellos en un almacenamiento persistente.

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 Instancias.

  3. Seleccione la instancia y elija Instance State (Estado de la instancia) y Stop instance (Detener instancia). Si esta opción está desactivada, la instancia ya está detenida o bien su dispositivo raíz es un volumen de almacén de instancias.

  4. Cuando se le pida que confirme, elija Stop. 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 Edit user data (Editar datos del usuario).

  6. Modifique los datos de usuario según sea necesario y después elija Save (Guardar).

  7. Inicie la instancia. Los nuevos datos de usuario son visibles en su 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 inicia; 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 sobre las tareas de configuración que el paquete cloud-init lleva a cabo para las instancias de Amazon Linux, consulte Using cloud-init on Amazon Linux 2 en la Guía del usuario de Amazon Linux 2.

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

importante

De forma predeterminada, los scripts de datos de usuario y las directivas de cloud-init solo se ejecutan durante el ciclo de arranque cuando se inicia una instancia por primera vez. Puede actualizar la configuración para asegurarse de que los scripts de datos de usuario y las directivas de cloud-init se ejecuten cada vez que reinicie la instancia. Para obtener más información, consulte ¿Cómo puedo utilizar los datos de usuario para ejecutar automáticamente un script con cada reinicio de mi instancia de Amazon EC2 Linux? en el AWSCentro de Conocimientos.

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 iniciar una instancia. El campo User data (Datos de usuario) se encuentra en la sección Detalles avanzados del asistente de inicialización de instancias. Ingrese el texto de la directiva de inicio en la nube en el campo User data y, a continuación, complete el procedimiento de inicialización de instancias.

    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 este 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 Configurar reglas del 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, conéctese a la instancia, examine el archivo de registro de salida de cloud-init (/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 Acceso a los metadatos de instancia de una instancia de EC2.

En Windows puede utilizar las AWS Tools for Windows PowerShell en vez de la AWS CLI. Para obtener más información, consulte Datos de usuario y las Tools for Windows PowerShell.

Ejemplo: Especificar datos de usuario durante la inicialización

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

Combinación de scripts de shell y directivas cloud-init

De forma predeterminada, solo puede incluir un tipo de contenido en los datos de usuario a la vez. Sin embargo, puede utilizar los tipos de contenido text/cloud-config y text/x-shellscript en un archivo MIME de varias partes para incluir tanto un script de shell como las directivas cloud-init en los datos de usuario.

A continuación se muestra el formato MIME de varias partes.

Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud-init directives --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash shell script commands --//--

Por ejemplo, los siguientes datos de usuario incluyen las directivas cloud-init y un script de un shell bash. Las directivas cloud-init crean un archivo (/test-cloudinit/cloud-init.txt) y escriben Created by cloud-init en dicho archivo. El script de shell bash crea un archivo (/test-userscript/userscript.txt) y escribe Created by bash shell script en dicho archivo.

Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config runcmd: - [ mkdir, /test-cloudinit ] write_files: - path: /test-cloudinit/cloud-init.txt content: Created by cloud-init --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash mkdir test-userscript touch /test-userscript/userscript.txt echo "Created by bash shell script" >> /test-userscript/userscript.txt --//--

Cómo gestiona Amazon EC2 los datos de usuario de las instancias de Windows

En las instancias de Windows, el agente de inicialización realiza las tareas relacionadas con los datos de usuario. Para más información, consulte los siguientes temas:

Para obtener ejemplos del ensamblado de una propiedad UserData en una plantilla deAWS CloudFormation, consulte Propiedad UserData cifrada en Base64 y Propiedad UserData cifrada en Base64 con AccessKey y SecretKey.

Para ver un ejemplo de ejecución de comandos en una instancia del grupo de escalado automático que funciona con enlaces de ciclo de vida, consulte el Tutorial: Configurar datos de usuario para recuperar el estado de ciclo de vida de destino a través de los metadatos de la instancia en la Guía del usuario de Amazon EC2 Auto Scaling.

Scripts de datos de usuario

Para que EC2Config o EC2Launch ejecuten scripts, debe incluir el script dentro de una etiqueta especial al agregarlo a los datos de usuario. La etiqueta que se utiliza depende de si los comandos se ejecutan en una ventana del símbolo del sistema (comandos por lotes) o con Windows PowerShell.

Si se especifica tanto un script de procesamiento por lotes como un script de Windows PowerShell, el script por lotes se ejecuta en primer lugar y después lo hace el script de Windows PowerShell, independientemente del orden en el que aparezcan en los datos de usuario de la instancia.

Si utiliza una API de AWS, incluida la AWS CLI, en un script de datos del usuario, debe utilizar un perfil de instancia al iniciar la instancia. Un perfil de instancia proporciona las credenciales de AWS adecuadas requeridas por el script de datos de usuario para ejecutar la llamada a la API. Para obtener más información, consulte Perfiles de instancias. Los permisos que asigne al rol de IAM dependen de los servicios a los que llame con la API. Para obtener más información, consulte Roles de IAM para Amazon EC2.

Sintaxis de los scripts de procesamiento por lotes

Especifique un script de procesamiento por lotes con la etiqueta script. Separe los comandos mediante saltos de línea, como se muestra en el siguiente ejemplo.

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script>

De forma predeterminada, los scripts de datos de usuario se ejecutan solo una vez, cuando se inicia la instancia. Para ejecutarlos cada vez que se inicia o se reinicia la instancia, añade <persist>true</persist> a los datos de usuario.

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script> <persist>true</persist>
Agente EC2Launch v2

Para ejecutar un script de datos de usuario XML como un proceso independiente con la tarea executeScript de EC2Launch v2 en la etapa UserData, agregue <detach>true</detach> a sus datos de usuario.

nota

La etiqueta detach no es compatible con los agentes de inicialización anteriores.

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script> <detach>true</detach>

Sintaxis de los scripts de Windows PowerShell

Las AMI de Windows de AWS incluyen las AWS Tools for Windows PowerShell, por lo que puede especificar estos cmdlets en los datos de usuario. Si asocia un rol de IAM a la instancia, no es necesario especificar credenciales para los cmdlets, ya que las aplicaciones que se ejecutan en la instancia pueden utilizar las credenciales del rol para obtener acceso a los recursos de AWS (por ejemplo, los buckets de Amazon S3).

Especifique un script de Windows PowerShell con la etiqueta <powershell>. Separe los comandos con saltos de línea. La etiqueta <powershell> no distingue entre mayúsculas y minúsculas.

Por ejemplo:

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell>

De forma predeterminada, los scripts de datos de usuario se ejecutan solo una vez, cuando se inicia la instancia. Para ejecutarlos cada vez que se inicia o se reinicia la instancia, añade <persist>true</persist> a los datos de usuario.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

Puede especificar uno o varios argumentos de PowerShell con la etiqueta <powershellArguments>. Si no se pasa ningún argumento, EC2Launch y EC2Launch v2 agregan el siguiente argumento de forma predeterminada: -ExecutionPolicy Unrestricted.

Ejemplo:

<powershell> $file = $env:SystemRoot + "\Temp" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <powershellArguments>-ExecutionPolicy Unrestricted -NoProfile -NonInteractive</powershellArguments>
Agente EC2Launch v2

Para ejecutar un script de datos de usuario XML como un proceso independiente con la tarea executeScript de EC2Launch v2 en la etapa UserData, agregue <detach>true</detach> a sus datos de usuario.

nota

La etiqueta detach no es compatible con los agentes de inicialización anteriores.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <detach>true</detach>

Sintaxis de los scripts de configuración de YAML

Si está utilizando EC2Launch v2 para ejecutar scripts, puede utilizar el formato YAML. Para ver tareas de configuración, detalles y ejemplos de EC2Launch v2, consulte Configuración de tareas de EC2Launch v2.

Especifique una secuencia de comandos YAML con el paso executeScript.

Ejemplo de sintaxis de YAML para ejecutar un script de PowerShell

version: 1.0 tasks: - task: executeScript inputs: - frequency: always type: powershell runAs: localSystem content: |- $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file

Ejemplo de sintaxis YAML para ejecutar un script por lotes

version: 1.1 tasks: - task: executeScript inputs: - frequency: always type: batch runAs: localSystem content: |- echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log

Codificación Base64

Si utiliza Amazon EC2 API o una herramienta que no realice codificación base64 de los datos de usuario, debe codificar los datos de usuario usted mismo. De lo contrario, se registra un error por imposibilidad de encontrar etiquetas script o powershell para ejecutar. A continuación se ofrece un ejemplo de codificación con Windows PowerShell.

$UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))

A continuación se ofrece un ejemplo de descodificación con PowerShell.

$Script = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData))

Para obtener más información acerca de la codificación base64, consulte https://www.ietf.org/rfc/rfc4648.txt.

Ejecución de datos de usuario

De forma predeterminada, todas las AMI de Windows de AWS tienen habilitada la ejecución de datos de usuario para la inicialización inicial. Puede especificar que los scripts de datos de usuario se ejecuten la próxima vez que la instancia se inicie o reinicie. O puede especificar que los scripts de datos de usuario se ejecuten cada vez que la instancia se inicie o reinicie.

nota

Los datos de usuario no están habilitados para ejecutarse de forma predeterminada después de la inicialización inicial. Para permitir que los datos de usuario se ejecuten al reiniciar o iniciar la instancia, consulte Ejecución de scripts durante los reinicios o inicios posteriores.

Los scripts de datos de usuario se ejecutan desde la cuenta del administrador local cuando se genera una contraseña aleatoria. De lo contrario, los scripts de datos de usuario se ejecutan desde la cuenta Sistema.

Scripts de inicialización de instancias

Los scripts de los datos de usuario de la instancia se ejecutan durante la inicialización inicial de la instancia. Si se encuentra la etiqueta persist, significa que la ejecución de los datos de usuario está habilitada para inicios o reinicios posteriores. Los archivos de registro de EC2Launch v2, EC2Launch y EC2Config contienen información del resultado estándar y las secuencias de error estándar.

EC2Launch v2

El archivo de registro de EC2Launch v2 es C:\ProgramData\Amazon\EC2Launch\log\agent.log.

nota

Es posible que la carpeta C:\ProgramData esté oculta. Para ver la carpeta, debe mostrar los archivos y las carpetas ocultos.

Al ejecutar los datos de usuario, se registra la información siguiente:

  • Info: Converting user-data to yaml format: si los datos del usuario se proporcionaron en formato XML

  • Info: Initialize user-data state: el inicio de la ejecución de datos de usuario

  • Info: Frequency is: always: si la tarea de datos de usuario se está ejecutando en cada arranque

  • Info: Frequency is: once: si la tarea de datos de usuario se está ejecutando una sola vez

  • Stage: postReadyUserData execution completed: el final de la ejecución de datos de usuario

EC2Launch

El archivo de registro de EC2Launch es C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log.

Es posible que la carpeta C:\ProgramData esté oculta. Para ver la carpeta, debe mostrar los archivos y las carpetas ocultos.

Al ejecutar los datos de usuario, se registra la información siguiente:

  • Userdata execution begins: el inicio de la ejecución de datos de usuario

  • <persist> tag was provided: true: si se encuentra la etiqueta persistir

  • Running userdata on every boot: si se encuentra la etiqueta persistir

  • <powershell> tag was provided.. running powershell content: si se encuentra la etiqueta powershell

  • <script> tag was provided.. running script content: si se encuentra la etiqueta script

  • Message: The output from user scripts: si se ejecutan scripts de datos de usuario, se registra su salida

EC2Config

El archivo de registro de EC2Config es C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2Config.log. Al ejecutar los datos de usuario, se registra la información siguiente:

  • Ec2HandleUserData: Message: Start running user scripts: el inicio de la ejecución de datos de usuario

  • Ec2HandleUserData: Message: Re-enabled userdata execution: si se encuentra la etiqueta persistir

  • Ec2HandleUserData: Message: Could not find <persist> and </persist>: si no se encuentra la etiqueta persistir

  • Ec2HandleUserData: Message: The output from user scripts: si se ejecutan scripts de datos de usuario, se registra su salida

Ejecución de scripts durante los reinicios o inicios posteriores

Cuando se actualizan los datos de usuario de la instancia, los scripts de datos de usuario no se ejecutan automáticamente al iniciar o reiniciar la instancia. Sin embargo, puede habilitar la ejecución de los datos de usuario para que los scripts que los contienen se ejecuten una sola vez al iniciar o reiniciar la instancia, o bien cada vez que esta se inicie o se reinicie.

Si elige la opción Cerrar con Sysprep, los scripts de datos de usuario se ejecutarán la próxima vez que comience o se reinicie la instancia, aunque no se haya habilitado la ejecución de los datos de usuario para comienzos o reinicios posteriores. Los scripts de datos de usuario no se ejecutarán en reinicios o comienzos posteriores.

Para habilitar la ejecución de datos de usuario con EC2Launch v2
  • Ejecutar una tarea en los datos de usuario en el primer arranque, establezca frequency en once.

  • Ejecutar una tarea en los datos de usuario en cada arranque, establezca frequency en always.

Para habilitar la ejecución de datos de usuario con EC2Launch
  1. Conéctese a la instancia de Windows.

  2. Abra una ventana de comandos de PowerShell y ejecute el comando siguiente:

    C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
  3. Desconéctese de la instancia de Windows. Para ejecutar los scripts actualizados la próxima vez que se inicie la instancia, detén la instancia y actualiza los datos de usuario.

Para habilitar la ejecución de datos de usuario con EC2Config
  1. Conéctese a la instancia de Windows.

  2. Abrir C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe.

  3. En User Data (Datos de usuario), seleccione Enable UserData execution for next service start (Habilitar la ejecución de datos de usuario en el siguiente inicio de servicio).

  4. Desconéctese de la instancia de Windows. Para ejecutar los scripts actualizados la próxima vez que se inicie la instancia, detén la instancia y actualiza los datos de usuario.

Datos de usuario y las Tools for Windows PowerShell

Puede usar la Tools for Windows PowerShell 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 Acceso a los metadatos de instancia de una instancia de EC2. Para obtener más información sobre datos de usuario y AWS CLI, consulte Datos de usuario y las AWS CLI.

Ejemplo: Especificar los datos de usuario de la instancia durante la inicialización

Cree un archivo de texto con los datos de usuario de la instancia. Para ejecutar los scripts de datos de usuario cada vez que arrrancas o reinicias la instancia, agrega <persist>true</persist>, tal como se muestra en el siguiente ejemplo.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

Para especificar los datos de usuario de la instancia cuando inicia la instancia, use el comando New-EC2Instance. Este comando no realiza codificación base64 de los datos de usuario. Para codificar los datos de usuario en un archivo de texto llamado script.txt, utilice los siguientes comando.

PS C:\> $Script = Get-Content -Raw script.txt PS C:\> $UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))

Utilice el parámetro -UserData para pasar los datos de usuario al comando New-EC2Instance.

PS C:\> New-EC2Instance -ImageId ami-abcd1234 -MinCount 1 -MaxCount 1 -InstanceType m3.medium \ -KeyName my-key-pair -SubnetId subnet-12345678 -SecurityGroupIds sg-1a2b3c4d \ -UserData $UserData
Ejemplo: Actualizar los datos de usuario de una instancia detenida

Puede modificar los datos de usuario de una instancia detenida utilizando el comando Edit-EC2InstanceAttribute.

Cree un archivo de texto con el nuevo script. Para codificar los datos de usuario en el archivo de texto llamado new-script.txt, utilice los siguientes comando.

PS C:\> $NewScript = Get-Content -Raw new-script.txt PS C:\> $NewUserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($NewScript))

Utilice los parámetros -UserData y -Value para especificar los datos de usuario.

PS C:\> Edit-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData -Value $NewUserData
Ejemplo: Ver los datos de usuario de la instancia

Para recuperar los datos de usuario de una instancia, utilice el comando Get-EC2InstanceAttribute.

PS C:\> (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData

A continuación, se muestra un ejemplo del resultado. Tenga en cuenta que los datos de usuario están codificados.

PHBvd2Vyc2hlbGw+DQpSZW5hbWUtQ29tcHV0ZXIgLU5ld05hbWUgdXNlci1kYXRhLXRlc3QNCjwvcG93ZXJzaGVsbD4=

Para almacenar los datos de usuario codificados en una variable y luego decodificarlos, utilice los siguientes comandos.

PS C:\> $UserData_encoded = (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData_encoded))

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

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>
Ejemplo: Cambiar el nombre a la instancia para que coincida con el valor de la etiqueta

Puede utilizar el comando Get-EC2Tag para leer el valor de la etiqueta, cambiar el nombre a la instancia durante el primer arranque para que coincida con el valor de la etiqueta y reiniciar. Para ejecutar este comando correctamente, debe tener un rol con permisos ec2:DescribeTags adjunto a la instancia, porque la información de etiquetas se recupera mediante una llamada a la API. Para obtener más información acerca de los permisos de configuración mediante roles de IAM, consulte Asociar un rol de IAM a una instancia.

IMDSv2
<powershell> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing $instanceId = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/instance-id' -UseBasicParsing $nameValue = (Get-EC2Tag -Filter @{Name="resource-id";Value=$instanceid},@{Name="key";Value="Name"}).Value $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>
IMDSv1
<powershell> $instanceId = (Invoke-WebRequest http://169.254.169.254/latest/meta-data/instance-id -UseBasicParsing).content $nameValue = (Get-EC2Tag -Filter @{Name="resource-id";Value=$instanceid},@{Name="key";Value="Name"}).Value $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>

También puede cambiar el nombre de la instancia mediante etiquetas en los metadatos de la instancia, si la instancia está configurada para etiquetas de acceso desde los metadatos de instancia. Para obtener más información, consulte Visualización de etiquetas para las instancias de EC2 mediante los metadatos de la instancia.

IMDSv2
<powershell> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing $nameValue = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/tags/instance/Name' -UseBasicParsing $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>
IMDSv1
<powershell> $nameValue = Get-EC2InstanceMetadata -Path /tags/instance/Name $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>