我创建了一个PowerShell脚本,可以在AWS Windows实例的用户数据中运行。如果我以管理员身份手动执行脚本,它会成功运行并且可以正常运行。
但是当我在用户数据中发送脚本时(在实例创建期间),它会抛出异常。在从系统帐户
安装模块期间会发生这种情况EC2上的PowerShell版本Windows 2012 R2 = v4.0
Cannot bind argument to parameter 'Path' because it is an empty string.
2017-04-10T18:24:25.004Z: Ec2HandleUserData: Message: Executing C:Windowssystem32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy unrestricted . 'C:\Program Files\Amazon\Ec2ConfigService\Scripts\UserScript.ps1' from System account
2017-04-10T18:24:25.006Z: Ec2HandleUserData: Message: Executing User Data with PID: 1084
2017-04-10T18:24:34.639Z: Ec2HandleUserData: Message: ExitCode of User Data with PID: 1084 is 1
2017-04-10T18:24:34.642Z: Ec2HandleUserData: Message: The errors from user scripts: iex : Cannot bind argument to parameter 'Path' because it is an empty string.
At C: Program Files Amazon Ec2ConfigService Scripts UserScript.ps1:5 char:79
+ (new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1")
| ie ...
+
~~
+ CategoryInfo : InvalidData: (:) [Invoke-Expression], ParameterB
indingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAl
lowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand
2017-04-10T18:24:34.642Z: Ec2HandleUserData: Message: The output from user scripts:
2017-04-10T18:24:34.642Z: Background plugin complete: Ec2HandleUserData
解决方案/解决方案:这更多是PsGet模块问题,而不是EC2问题
https://github.com/psget/psget/issues/208
在系统帐户级别,PsGet模块正在设置Path InCorrectly。 截至目前,我已修改PsGet.ps1来读取我的自定义路径$ env:PSModulePath,它没有任何问题。
PsGet.Ps1第1615行 注释#Add-PathToPSModulePath -PathToAdd:$ Destination -PersistEnvironment:$ PersistEnvironment -Global:$ Global
补充:[环境] :: SetEnvironmentVariable(" PSModulePath",&#34 ;; C:{DirectoryIwantModulesToBe} \ Modules"," Machine")
它在系统帐户级别上没有问题
感谢Alex的帮助。
答案 0 :(得分:0)
我建议使用特定路径。 userdata块在windows系统帐户下执行,因此它没有配置文件目录,也没有临时路径。
例如,[System.IO.Path]::GetTempFileName()
在使用此用户执行时失败。
当代码部署包执行时,这是相同的。
如果您必须经常使用AWS-EC2,那么最好尝试尽可能地在本地复制环境,因为EC2至少需要6分钟才能启动,这可能是您的主要减速故障排除工作出于这个原因,我决定使用匹配的操作系统设置一个流浪盒,在那个盒子上我执行/测试我需要的东西。当事情变得艰难并且我怀疑系统用户的特殊性时,我使用psexec来启动我的进程。这是一个很好的起点How to: become the LOCAL SYSTEM account with PsExec