EC2 Windows 用户数据:Powershell 未按预期 运行
EC2 Windows User Data: Powershell does not run as expected
我正在尝试通过用户数据中的 Powershell 命令 bootstrap EC2 Windows 实例。我试图通过用户数据执行的步骤是:
- 安装巧克力
- 使用chocolatey安装Python
- 使用 chocolatey 安装 AWS CLI
- 使用 AWS CLI 从 S3 下载 Powershell 脚本
- 运行 Powershell 脚本
用户数据非常简单:
<powershell>
Set-ExecutionPolicy Bypass -Force;
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'));
choco install python3 -y;
choco install awscli -y
refreshenv
$BootstrapScript = (Join-Path $env:TEMP "NewBootstrap.ps1")
& aws s3api get-object --bucket my-bucket-name --key bootstrap/WindowsBootstrap.ps1 "$BootstrapScript"
iex "$BootstrapScript"
</powershell>
bootstrap 脚本从未被下载或执行。如果我登录实例并查看日志,输出表明发生了一些奇怪的事情:
- 在日志的顶部有错误抱怨
'aws' is not recognized as the name of a cmdlet
。为什么在尝试安装 aws cli 之前就出现此错误?
- 之后
the term
'C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1' is not recognized as the name of a cmdlet, function,
script file
。再次 - 为什么在我们尝试获取该文件之前出现此错误?
- 然后日志显示 choco、python 和 awscli 实际上 安装正确。
我不明白执行顺序是怎么回事。如果我登录到该框并执行 C:\Windows\Temp
中包含的完全相同的用户数据脚本,它会完全按预期运行。
如能帮助理解或调试此问题,我们将不胜感激。
C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log
的输出,为简洁起见省略了一些 choco 输出
2017/11/06 12:11:49Z: Userdata execution begins
2017/11/06 12:11:49Z: Zero or more than one <persist> tag was not provided
2017/11/06 12:11:49Z: Unregistering the persist scheduled task
2017/11/06 12:11:54Z: Zero or more than one <runAsLocalSystem> tag was not provided
2017/11/06 12:11:54Z: Zero or more than one <script> tag was not provided
2017/11/06 12:11:54Z: Zero or more than one <powershellArguments> tag was not provided
2017/11/06 12:11:54Z: <powershell> tag was provided.. running powershell content
2017/11/06 15:13:42Z: Userdata execution begins
2017/11/06 15:13:42Z: Zero or more than one <persist> tag was not provided
2017/11/06 15:13:42Z: Unregistering the persist scheduled task
2017/11/06 15:13:54Z: Zero or more than one <runAsLocalSystem> tag was not provided
2017/11/06 15:13:54Z: Zero or more than one <script> tag was not provided
2017/11/06 15:13:54Z: Zero or more than one <powershellArguments> tag was not provided
2017/11/06 15:13:55Z: <powershell> tag was provided.. running powershell content
2017/11/06 15:16:11Z: Userdata: is currently executing. To end it kill the process with id: 2828
2017/11/06 15:17:40Z: Message: The errors from user scripts: & : The term 'aws' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\Windows\TEMP\UserScript.ps1:15 char:3
+ & aws s3api get-object --bucket my-bucket-name --key bootstra ...
+ ~~~
+ CategoryInfo : ObjectNotFound: (aws:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1 : The term
'C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:1 char:1
+ C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\Admini...ewBootstrap.ps1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
2017/11/06 15:17:40Z: Message: The output from user scripts: This is the new bootstrap
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 11/6/2017 3:14 PM chocInstall
Getting latest version of the Chocolatey package for download.
Getting Chocolatey from https://chocolatey.org/api/v2/package/chocolatey/0.10.8.
... Chocolatey Install output ...
Chocolatey (choco.exe) is now ready.
You can call choco from anywhere, command line or powershell by typing choco.
Run choco /? for a list of functions.
You may need to shut down and restart powershell and/or consoles
first prior to using choco.
Ensuring chocolatey commands are on the path
Ensuring chocolatey.nupkg is in the lib folder
Installing awscli
Chocolatey v0.10.8
Installing the following packages:
python3
.. Python Download / Install output ...
Download of python-3.6.3-amd64.exe (30.16 MB) completed.
Hashes match.
Installing python3...
python3 has been installed.
Installed to 'C:\Python36'
python3 can be automatically uninstalled.
Environment Vars (like PATH) have changed. Close/reopen your shell to
see the changes (or in powershell/cmd.exe just type `refreshenv`).
The install of python3 was successful.
Software installed as 'EXE', install location is likely default.
Chocolatey installed 1/1 packages.
See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
Chocolatey v0.10.8
Installing the following packages:
awscli
.. AWS CLI Download / Install output ...
The install of awscli was successful.
Software installed as 'msi', install location is likely default.
Chocolatey installed 1/1 packages.
See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..
2017/11/06 15:17:40Z: Userdata execution done
问题是,当作为云初始化进程的一部分安装时,Powershell 配置文件无法导入 Chocolatey。这意味着软件包将通过 choco install
安装正常,但在环境中不可用,即使您调用 refreshenv
(因此我对 aws
的调用失败,即使它安装成功。)
要解决此问题,您可以通过编辑 Powershell 配置文件手动强制 Powershell 导入 Chocolatey 模块。
# Updated profile content to explicitly import Choco
$ChocoProfileValue = @'
$ChocolateyProfile = "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
if (Test-Path($ChocolateyProfile)) {
Import-Module "$ChocolateyProfile"
}
'@
# Write it to the $profile location
Set-Content -Path "$profile" -Value $ChocoProfileValue -Force
# Source it
. $profile
中阅读更多相关信息
我正在尝试通过用户数据中的 Powershell 命令 bootstrap EC2 Windows 实例。我试图通过用户数据执行的步骤是:
- 安装巧克力
- 使用chocolatey安装Python
- 使用 chocolatey 安装 AWS CLI
- 使用 AWS CLI 从 S3 下载 Powershell 脚本
- 运行 Powershell 脚本
用户数据非常简单:
<powershell>
Set-ExecutionPolicy Bypass -Force;
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'));
choco install python3 -y;
choco install awscli -y
refreshenv
$BootstrapScript = (Join-Path $env:TEMP "NewBootstrap.ps1")
& aws s3api get-object --bucket my-bucket-name --key bootstrap/WindowsBootstrap.ps1 "$BootstrapScript"
iex "$BootstrapScript"
</powershell>
bootstrap 脚本从未被下载或执行。如果我登录实例并查看日志,输出表明发生了一些奇怪的事情:
- 在日志的顶部有错误抱怨
'aws' is not recognized as the name of a cmdlet
。为什么在尝试安装 aws cli 之前就出现此错误? - 之后
the term 'C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1' is not recognized as the name of a cmdlet, function, script file
。再次 - 为什么在我们尝试获取该文件之前出现此错误? - 然后日志显示 choco、python 和 awscli 实际上 安装正确。
我不明白执行顺序是怎么回事。如果我登录到该框并执行 C:\Windows\Temp
中包含的完全相同的用户数据脚本,它会完全按预期运行。
如能帮助理解或调试此问题,我们将不胜感激。
C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log
的输出,为简洁起见省略了一些 choco 输出
2017/11/06 12:11:49Z: Userdata execution begins
2017/11/06 12:11:49Z: Zero or more than one <persist> tag was not provided
2017/11/06 12:11:49Z: Unregistering the persist scheduled task
2017/11/06 12:11:54Z: Zero or more than one <runAsLocalSystem> tag was not provided
2017/11/06 12:11:54Z: Zero or more than one <script> tag was not provided
2017/11/06 12:11:54Z: Zero or more than one <powershellArguments> tag was not provided
2017/11/06 12:11:54Z: <powershell> tag was provided.. running powershell content
2017/11/06 15:13:42Z: Userdata execution begins
2017/11/06 15:13:42Z: Zero or more than one <persist> tag was not provided
2017/11/06 15:13:42Z: Unregistering the persist scheduled task
2017/11/06 15:13:54Z: Zero or more than one <runAsLocalSystem> tag was not provided
2017/11/06 15:13:54Z: Zero or more than one <script> tag was not provided
2017/11/06 15:13:54Z: Zero or more than one <powershellArguments> tag was not provided
2017/11/06 15:13:55Z: <powershell> tag was provided.. running powershell content
2017/11/06 15:16:11Z: Userdata: is currently executing. To end it kill the process with id: 2828
2017/11/06 15:17:40Z: Message: The errors from user scripts: & : The term 'aws' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\Windows\TEMP\UserScript.ps1:15 char:3
+ & aws s3api get-object --bucket my-bucket-name --key bootstra ...
+ ~~~
+ CategoryInfo : ObjectNotFound: (aws:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1 : The term
'C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:1 char:1
+ C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Users\Admini...ewBootstrap.ps1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
2017/11/06 15:17:40Z: Message: The output from user scripts: This is the new bootstrap
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 11/6/2017 3:14 PM chocInstall
Getting latest version of the Chocolatey package for download.
Getting Chocolatey from https://chocolatey.org/api/v2/package/chocolatey/0.10.8.
... Chocolatey Install output ...
Chocolatey (choco.exe) is now ready.
You can call choco from anywhere, command line or powershell by typing choco.
Run choco /? for a list of functions.
You may need to shut down and restart powershell and/or consoles
first prior to using choco.
Ensuring chocolatey commands are on the path
Ensuring chocolatey.nupkg is in the lib folder
Installing awscli
Chocolatey v0.10.8
Installing the following packages:
python3
.. Python Download / Install output ...
Download of python-3.6.3-amd64.exe (30.16 MB) completed.
Hashes match.
Installing python3...
python3 has been installed.
Installed to 'C:\Python36'
python3 can be automatically uninstalled.
Environment Vars (like PATH) have changed. Close/reopen your shell to
see the changes (or in powershell/cmd.exe just type `refreshenv`).
The install of python3 was successful.
Software installed as 'EXE', install location is likely default.
Chocolatey installed 1/1 packages.
See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
Chocolatey v0.10.8
Installing the following packages:
awscli
.. AWS CLI Download / Install output ...
The install of awscli was successful.
Software installed as 'msi', install location is likely default.
Chocolatey installed 1/1 packages.
See the log for details (C:\ProgramData\chocolatey\logs\chocolatey.log).
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..
2017/11/06 15:17:40Z: Userdata execution done
问题是,当作为云初始化进程的一部分安装时,Powershell 配置文件无法导入 Chocolatey。这意味着软件包将通过 choco install
安装正常,但在环境中不可用,即使您调用 refreshenv
(因此我对 aws
的调用失败,即使它安装成功。)
要解决此问题,您可以通过编辑 Powershell 配置文件手动强制 Powershell 导入 Chocolatey 模块。
# Updated profile content to explicitly import Choco
$ChocoProfileValue = @'
$ChocolateyProfile = "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1"
if (Test-Path($ChocolateyProfile)) {
Import-Module "$ChocolateyProfile"
}
'@
# Write it to the $profile location
Set-Content -Path "$profile" -Value $ChocoProfileValue -Force
# Source it
. $profile
中阅读更多相关信息