windows - EC2 Windows 用户数据 : Powershell does not run as expected

标签 windows powershell amazon-web-services amazon-ec2 user-data

我正在尝试通过用户数据中的 Powershell 命令引导 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>

引导脚本永远不会被下载或执行。如果我登录实例并查看日志,输出表明发生了一些奇怪的事情:

  • 在日志的顶部有错误提示 'aws' 未被识别为 cmdlet 的名称。为什么在尝试安装 aws cli 之前就出现此错误?
  • 在那之后术语 'C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1' 未被识别为 cmdlet、函数的名称, 脚本文件。再一次 - 为什么在我们尝试获取该文件之前出现此错误?
  • 然后日志显示 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

您可以在 chocolatey troubleshooting guide 中阅读更多相关信息

关于windows - EC2 Windows 用户数据 : Powershell does not run as expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47140812/

相关文章:

windows - 在关机或启动时运行 Cygwin 脚本

amazon-web-services - AWS查找S3存储桶中的最大文件大小

amazon-web-services - 在单个 ECS 集群上运行多个 Web 服务

powershell - 搜索 Internet Explorer 应用程序对象

Powershell - 从 Gmail 下载附件

powershell.exe 选项卡完成 - 列出替代方案?

amazon-web-services - 如何使用 AWS 云 Controller 管理器

python - 多处理池中的全局变量

PHP proc_open 多次打开

windows - 从远程桌面 session 注销不会关闭 session ,在 Windows XP 32 位 - SP2 上再次显示登录屏幕