Amazon Elastic Compute Cloud
Guía del usuario de instancias de Windows

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

Cuando se lanza una instancia de Windows en Amazon EC2, puede transmitir los datos de usuario a la instancia. Los datos de usuario de la instancia se tratan como datos opacos; la instancia es quien debe interpretarlos. Por ejemplo, puede especificar datos que se usen en tareas de configuración automatizadas o scripts que se ejecuten una vez iniciada la instancia. EC2Config procesa los datos de usuario en Windows Server 2012 R2 y versiones anteriores y EC2Launch los procesa en Windows Server 2016 y versiones posteriores.

Scripts de datos de usuario

Para que EC2Config o EC2Launch ejecuten scripts, debe incluir el script dentro de una etiqueta especial al añadirlo 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.

Sintaxis de los scripts de procesamiento por lotes

Especifique un script de procesamiento por lotes con la etiqueta script. Separe los comandos con saltos de línea. Por 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 lanza la instancia. Para ejecutarlos cada vez que se inicia o se reinicia la instancia, añada <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>

Sintaxis para los scripts de Windows PowerShell

Las AMI de Windows de AWS incluyen las Herramientas de AWS para 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. 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 lanza la instancia. Para ejecutarlos cada vez que se inicia o se reinicia la instancia, añada <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>

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 http://tools.ietf.org/html/rfc4648.

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 el lanzamiento inicial. Puede especificar que los scripts de datos de usuario se ejecuten la próxima vez que la instancia se reinicie o bien cada vez que la instancia se reinicie.

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

Lanzamiento de la instancia

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

El archivo de registro de EC2Launch es C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.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:

  • Userdata execution begins (Comienza la ejecución de los datos de usuario): inicio de la ejecución de los datos de usuario—

  • <persist> tag was provided: true (Etiqueta <persist> proporcionada: true): si se encuentra la etiqueta persist

  • Running userdata on every boot (Ejecución de datos de usuario en cada arranque): si se encuentra la etiqueta persist

  • <powershell> tag was provided.. running powershell content (Etiqueta <powershell> proporcionada. Ejecutando contenido powershell): si se encuentra la etiqueta powershell

  • <script> tag was provided.. running script content (Etiqueta <script> proporcionada. Ejecutando contenido script): si se encuentra la etiqueta script

  • Message: The output from user scripts (Mensaje: Resultado de los scripts de usuario): si se ejecutan scripts de datos de usuario, se registran sus resultados—

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 (Ec2HandleUserData: Mensaje: Comienza la ejecución de los datos de usuario): inicio de la ejecución de los datos de usuario—

  • Ec2HandleUserData: Message: Re-enabled userdata execution (Ec2HandleUserData: Mensaje: Ejecución de datos de usuario rehabilitada): si se encuentra la etiqueta persist—

  • Ec2HandleUserData: Message: Could not find <persist> and </persist> (Ec2HandleUserData: Mensaje: No se encontró <persist> ni </persist>): si no se encuentra la etiqueta persist

  • Ec2HandleUserData: Message: The output from user scripts (Ec2HandleUserData: Mensaje: Resultado de los scripts de usuario): si se ejecutan scripts de datos de usuario, se registran sus resultados—

Inicios o reinicios 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 vez al iniciar o reiniciar la instancia, o bien cada vez que esta se inicie o se reinicie.

Si elige la opción Shutdown with Sysprep (Cerrar con Sysprep), los scripts de datos de usuario se ejecutan al iniciar o reiniciar la instancia, aunque no se haya habilitado la ejecución de los datos de usuario para inicios o reinicios posteriores.

Para habilitar la ejecución de datos de usuario en Windows Server 2016 o versiones posteriores (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, detenga la instancia y actualice los datos de usuario. Para obtener más información, consulte Visualización y actualización de los datos de usuario de la instancia.

Para habilitar la ejecución de datos de usuario en Windows Server 2012 R2 y versiones anteriores (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, detenga la instancia y actualice los datos de usuario. Para obtener más información, consulte Visualización y actualización de los datos de usuario de la instancia.

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

Al lanzar una instancia, especifica el script en Advanced Details (Detalles avanzados), User data (Datos de usuario) en la página Step 3: Configure Instance Details (Paso 3: Configurar detalles de instancia) del asistente de Launch Instance. En el ejemplo de la siguiente imagen se crea un archivo en la carpeta temporal de Windows, con la fecha y la hora actuales en el nombre del archivo. Al incluir <persist>true</persist>, el script se ejecuta cada vez que se inicia o se reinicia la instancia. Al seleccionar As text (Como texto) la consola de Amazon EC2 realiza la codificación base64 de forma automática.

Visualización y actualización de 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, elija Instances (Instancias), la instancia.

  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). Para ejecutar los scripts de datos de usuario cada vez que se inicia o se reinicia la instancia, añada <persist>true</persist>, como se muestra en el siguiente ejemplo:

  7. Reinicie la instancia. Si ha habilitado la ejecución de los datos de usuario para inicios o reinicios posteriores, los scripts de datos de usuario actualizados se ejecutan como parte del proceso de inicio de la instancia.

Datos de usuario y la Herramientas para Windows PowerShell

Puede usar la Herramientas para 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 Recuperar los datos de usuario de la instancia. Para obtener más información acerca de los datos de usuario y la AWS CLI, consulte Datos de usuario y la AWS CLI en la Guía del usuario de Amazon EC2 para instancias de Linux.

Ejemplo: Especificar los datos de usuario de la instancia durante el lanzamiento

Cree un archivo de texto con los datos de usuario de la instancia. Para ejecutar los scripts de datos de usuario cada vez que se inicia o se reinicia la instancia, añada <persist>true</persist>, 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 lanza 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 comandos:

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 comandos:

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

Para leer el valor de la etiqueta, cambie el nombre a la instancia durante el primer arranque para que coincida con el valor de la etiqueta y reinicie, utilice el comando Get-EC2Tag. Para ejecutar este comando correctamente, debe tener un rol con permisos ec2:DescribeTags porque la información de etiquetas no está disponible en los metadatos y debe recuperarse mediante una llamada a la API. Para obtener más información sobre cómo asociar un rol a una instancia, consulte Adjuntar un rol de IAM a una instancia.

nota

Este script falla en versiones de Windows Server anteriores a 2008.

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