Amazon Elastic Compute Cloud
Windows 实例用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

启动时在 Windows 实例上运行命令

当您在 Amazon EC2 中启动 Windows 实例时,可以将用户数据传递到实例。实例用户数据被视为不透明数据;需要由实例来解释。例如,您可以指定数据由自动配置任务使用,或者指定在实例启动之后运行的脚本。在 Windows Server 2012 R2 及更早版本上,用户数据由 EC2Config 处理;在 Windows Server 2016 上由 EC2Launch 处理。

用户数据脚本

要让 EC2Config 或 EC2Launch 执行脚本,在将脚本添加到用户数据中时,您必须将脚本封装在特殊标签中。您使用的标签取决于命令是在命令提示符窗口 (批处理命令) 中还是使用 Windows PowerShell 运行。

如果同时指定批处理脚本和 Windows PowerShell 脚本,则批处理脚本先运行,然后运行 Windows PowerShell 脚本,不论这些脚本在实例用户数据中的显示顺序如何。

批处理脚本的语法

使用 script 标签指定批处理脚本。使用换行符分隔命令。例如:

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

默认情况下,用户数据脚本在您启动实例时执行一次。要在每次重新引导或启动实例时执行用户数据脚本,请将 <persist>true</persist> 添加到用户数据。

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

Windows PowerShell 脚本的语法

AWS Windows AMI 包括 适用于 Windows PowerShell 的 AWS 工具,因此您可在用户数据中指定这些 cmdlet。如果您将一个 IAM 角色与实例相关联,那么您不必为 cmdlet 指定凭证,因为实例上运行的应用程序可以使用该角色的凭证访问 AWS 资源 (例如 Amazon S3 存储桶)。

使用 powershell 标签指定 Windows PowerShell 脚本。使用换行符分隔命令。例如:

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

默认情况下,用户数据脚本在您启动实例时执行一次。要在每次重新引导或启动实例时执行用户数据脚本,请将 <persist>true</persist> 添加到用户数据。

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

Base64 编码

如果使用的是 Amazon EC2 API 或不对用户数据执行 base64 编码的工具,则您必须自行对用户数据进行编码。否则,系统会记录找不到要执行的 scriptpowershell 标签的错误。下面是使用 Windows PowerShell 进行编码的示例。

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

下面是一个使用 PowerShell 进行解码的示例。

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

有关 base64 编码的更多信息,请参阅 http://tools.ietf.org/html/rfc4648

用户数据执行

默认情况下,所有 AWS Windows AMI 均已为初次启动启用了用户数据执行。您可以指定用户数据脚本在下次实例重新引导或重启时执行。此外,您可以指定用户数据脚本在每次实例重新引导或重启时执行。

生成随机密码之后,从本地管理员账户执行用户数据脚本。否则,从系统账户执行用户数据脚本。

实例启动

实例用户数据中的任意脚本在实例的初次启动期间执行。如果找到 persist 标签,则为后续重新引导或启动启用用户数据执行。EC2Launch 和 EC2Config 的日志文件包含源自标准输出和标准错误流的输出。

使用 EC2Launch,日志文件为 C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log。执行用户数据时将记录以下信息。

  • Userdata execution begins (用户数据执行开始) — 用户数据执行的开始

  • <persist> tag was provided: true (提供 <persist> 标签:true) — 找到 persist 标签时

  • Running userdata on every boot (每次引导时运行用户数据) — 找到 persist 标签时

  • <powershell> tag was provided.. running powershell content(提供了 <powershell> 标签,运行 powershell 内容) — 找到 powershell 标签时

  • <script> tag was provided.. running script content(提供了 <script> 标签,运行脚本内容) — 找到 script 标签时

  • Message: The output from user scripts (消息:来自用户脚本的输出) — 如果执行用户数据脚本,则记录其输出

使用 EC2Config,日志文件为 C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2Config.log。执行用户数据时将记录以下信息。

  • Ec2HandleUserData: Message: Start running user scripts (Ec2HandleUserData:消息:开始运行用户脚本) — 用户数据执行的开始

  • Ec2HandleUserData: Message: Re-enabled userdata execution (Ec2HandleUserData:消息:重新启用了用户数据执行) — 找到 persist 标签时

  • Ec2HandleUserData: Message: Could not find <persist> and </persist> (2HandleUserData:消息:找不到 <persist> 和 </persist>) — 找不到 persist 标签时

  • Ec2HandleUserData: Message: The output from user scripts (Ec2HandleUserData:消息:来自用户脚本的输出) — 如果执行用户数据脚本,则记录其输出

后续重新引导或启动

在您更新实例用户数据后,重新引导或启动实例时不会自动执行用户数据脚本。不过,您可以启用用户数据执行,这样用户数据脚本在您重新引导或启动实例时执行一次,或者在每次重新引导或启动实例时执行。

如果您选择 Shutdown with Sysprep (使用 Sysprep 关闭) 选项,则用户数据脚本在实例重新引导或重新启动时执行,即使您没有为后续的重新引导或启动启用用户数据执行。

在 Windows Server 2016 (EC2Launch) 上启用用户数据执行

  1. 连接到您的 Windows 实例。

  2. 打开 PowerShell 命令窗口,并运行以下命令:

    InitializeInstance.ps1 -Schedule
  3. 从 Windows 实例断开连接。要在下次实例启动时执行更新后的脚本,请停止实例并更新用户数据。有关更多信息,请参阅 查看和更新实例用户数据

在 Windows Server 2012 R2 和更早版本 (EC2Config) 上启用用户数据执行

  1. 连接到您的 Windows 实例。

  2. 打开 C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe

  3. 对于用户数据,选择 Enable UserData execution for next service start (为下次服务启动启用用户数据执行)。

  4. 从 Windows 实例断开连接。要在下次实例启动时执行更新后的脚本,请停止实例并更新用户数据。有关更多信息,请参阅 查看和更新实例用户数据

用户数据和控制台

您可在启动实例时指定实例用户数据。如果实例的根卷是 EBS 卷,您还可以停止实例并更新其用户数据。

启动时指定实例用户数据

启动实例时,在启动实例向导的 Step 3: Configure Instance Details 页面上的 Advanced DetailsUser data 中指定脚本。以下图像中的示例在 Windows 临时文件夹中创建文件,在文件名中使用当前日期和时间。当您包括 <persist>true</persist> 时,每次重新引导或启动实例时将执行脚本。如果选择以文本形式,Amazon EC2 控制台将执行 base64 编码。

查看和更新实例用户数据

您可以查看任何实例的实例用户数据,也可以更新已停止实例的实例用户数据。

使用控制台更新实例的用户数据

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Instances。实例。

  3. 选择所需实例,然后依次选择 ActionsInstance StateStop

    警告

    当您停止某个实例时,任何实例存储卷上的数据都将被擦除。因此,如果实例存储卷上有任何您要保留的数据,请确保将其备份到持久性存储。

  4. 当系统提示您确认时,选择 Yes, Stop。停止实例可能需要几分钟时间。

  5. 保持实例选定的情况下,依次选择操作实例设置查看/更改用户数据。如果实例正在运行,您不能更改用户数据,但是可以查看。

  6. View/Change User Data 对话框中,更新用户数据,然后选择 Save。要在每次重新引导或启动实例时执行用户数据脚本,请添加 <persist>true</persist>,如下例中所示:

  7. 重新启动实例。如果为后续重新引导或启动启用了用户数据执行,则在实例启动过程中执行更新后的用户数据脚本。

用户数据和 Windows PowerShell 工具

您可以使用 Windows PowerShell 工具 指定、修改和查看实例的用户数据。有关使用实例元数据从实例查看用户数据的信息,请参阅检索实例用户数据。有关用户数据和 AWS CLI 的信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的用户数据和 AWS CLI

示例:启动时指定实例用户数据

使用实例用户数据创建一个文本文件。要在每次重新引导或启动实例时执行用户数据脚本,请添加 <persist>true</persist>,如下例中所示:

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

要在启动实例时指定实例用户数据,请使用 New-EC2Instance 命令。该命令不会对用户数据进行 base64 编码。使用以下命令在名为 script.txt 的文本文件中对用户数据进行编码。

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

使用 -UserData 参数可将用户数据传递到 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

示例:更新已停止实例的实例用户数据

您可以使用 Edit-EC2InstanceAttribute 命令修改已停止的实例的用户数据。

使用新脚本创建一个文本文件。使用以下命令在名为 new-script.txt 的文本文件中对用户数据进行编码。

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

使用 -UserData-Value 参数可指定用户数据。

PS C:\> Edit-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData -Value $NewUserData

示例:查看实例用户数据

要检索实例的用户数据,请使用 Get-EC2InstanceAttribute 命令。

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

下面是示例输出。请注意,用户数据已编码。

PHBvd2Vyc2hlbGw+DQpSZW5hbWUtQ29tcHV0ZXIgLU5ld05hbWUgdXNlci1kYXRhLXRlc3QNCjwvcG93ZXJzaGVsbD4=

使用以下命令可将已编码的用户数据存储在变量中,然后对其进行编码。

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

下面是示例输出。

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