Amazon Elastic Compute Cloud
Windows 实例用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

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

当您在 Amazon EC2 中启动实例时,您可以将用户数据传递到可用于执行常见自动配置任务甚至在实例启动后运行脚本的实例。

用户数据和 脚本

您可指定脚本在实例启动时执行。

为了 EC2Config 或 EC2Launch 能执行用户数据脚本,您必须将指定脚本的各行包含在以下某个特殊标签内:

<script></script>

运行您可以在命令提示符窗口运行的任何命令。

示例:<script>dir > c:\test.log</script>

<powershell></powershell>

运行您可以通过 Windows PowerShell 命令提示符运行的任何命令。

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

示例:<powershell>Read-S3Object -BucketName myS3Bucket -Key myFolder/myFile.zip -File c:\destinationFile.zip</powershell>

您可以在脚本中使用换行符分隔命令。

如果 scriptpowershell 标签同时存在,则无论它们以什么顺序显示,都会先运行批处理脚本,然后再运行 PowerShell 脚本。

\Log (EC2Launch) 或 \Logs (EC2Config) 文件夹中包含源自标准输出和标准错误流的输出。

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

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

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

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

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

用户数据执行

默认情况下,所有 Amazon AMI 均已为初始启动启用用户数据执行。对于使用 EC2Config 服务的实例,您可以指定必须在下次启动或重新启动服务时执行用户数据。有关更多信息,请参阅 Ec2 服务属性

Initial Boot (初始启动)

仅当随机密码生成之后,本地管理员用户才可执行用户数据脚本。EC2Config 服务会生成密码,并且暂时获知凭证 (在发送到控制台之前)。EC2Config 不会存储或跟踪密码更改,因此如果您没有生成随机密码,则 EC2Config 服务账户会执行用户数据。如果您在 EC2Config 中选中 Shutdown with Sysprep 选项,则无论 User Data 复选框的设置如何,系统都会启用用户数据脚本执行。

同样,对于使用 EC2Launch 服务的实例,如果您选中 Shutdown with Sysprep 选项,则会在此实例重新启动时启用用户数据脚本执行。

Subsequent Boots (后续启动)

因为初次启动后 Amazon AMI 会自动禁用用户数据脚本执行,所以您可以执行以下操作之一,以便在重新启动后保留用户数据:

  • 对于 EC2Config,指定必须在下次启动或重新启动服务时执行用户数据。有关更多信息,请参阅 Ec2 服务属性。如果需要添加或更改现有实例的用户数据,您也可以使用此选项。

  • 对于 EC2Config,您可以使用 schtasks.exe /Create 以编程的方式创建系统启动时要运行的计划任务,然后将计划任务指向 C:\Program Files\Amazon\Ec2ConfigService\Scripts\UserScript.ps1 中的用户数据脚本 (或其他脚本)。

  • 对于 EC2Config,使用类似于以下内容的脚本在 Config.xml 中以编程方式启用用户数据插件:

    Copy
    <powershell> $EC2SettingsFile="C:\Program Files\Amazon\Ec2ConfigService\Settings\Config.xml" $xml = [xml](get-content $EC2SettingsFile) $xmlElement = $xml.get_DocumentElement() $xmlElementToModify = $xmlElement.Plugins foreach ($element in $xmlElementToModify.Plugin) { if ($element.name -eq "Ec2SetPassword") { $element.State="Enabled" } elseif ($element.name -eq "Ec2HandleUserData") { $element.State="Enabled" } } $xml.Save($EC2SettingsFile) </powershell>
  • 对于 EC2Config 版本 2.1.10 及更高版本,或者对于 EC2Launch,您可以在用户数据中使用 <persist>true</persist>,以便在用户数据执行后启用此插件。

    Copy
    <powershell> insert script here </powershell> <persist>true</persist>

用户数据和控制台

启动实例时,在启动实例向导的 Step 3: Configure Instance Details 页面上的 Advanced DetailsUser data 中指定脚本。下图中的示例将在实例启动时使用 Rename-Computer 命令更改实例的名称。如果选择 As text,Amazon EC2 控制台将对输入执行 base64 编码。

您可以查看任何实例的实例元数据,也可以更改已停止实例的实例元数据。选择相应实例,然后依次选择 ActionsInstance SettingsView/Change User Data

用户数据和 Windows PowerShell 工具

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

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

要在启动实例时指定用户数据,请使用 New-EC2Instance 命令。

此命令不会对用户数据进行 base64 编码。使用以下命令可在文本文件中对用户数据进行编码。

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

使用 -UserData 参数可将用户数据传递到命令。

Copy
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 命令修改已停止的实例的用户数据。

此命令不会对用户数据进行 base64 编码。使用以下命令可在文本文件中对用户数据进行编码。

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

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

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

示例:查看用户数据

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

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

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

PHBvd2Vyc2hlbGw+DQpSZW5hbWUtQ29tcHV0ZXIgLU5ld05hbWUgdXNlci1kYXRhLXRlc3QNCjwvcG93ZXJzaGVsbD4=

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

Copy
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>
Rename-Computer -NewName user-data-test
</powershell>