我正在尝试通过用户数据中的Powershell命令来引导EC2 Windows实例。我试图通过用户数据执行的步骤是:
用户数据非常简单:
import sys
import subprocess
def main():
def start_process():
proc = subprocess.Popen([sys.executable, 'server.py'])
print("Started process:")
print(proc.pid)
return proc
def kill_process(the_process):
print("Killing process:")
print(the_process.pid)
the_process.kill()
user_input = input("Type something: ")
if user_input == 'start':
process = start_process()
while process.poll() is None:
user_input = input()
if user_input == 'kill' or user_input == 'exit':
kill_process(process)
if __name__ == '__main__':
main()
永远不会下载或执行引导程序脚本。如果我登录到实例并查看日志,则输出表明发生了一些奇怪的事情:
<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 cli之前出现此错误?'aws' is not recognized as the name of a cmdlet
。再次 - 在我们尝试获取该文件之前,为什么会出现这种错误?我不明白执行顺序发生了什么。如果我登录到该框并执行the term
'C:\Users\Administrator\AppData\Local\Temp\NewBootstrap.ps1' is not recognized as the name of a cmdlet, function,
script file
中包含的完全相同的用户数据脚本,它将按预期完全运行。
理解或调试此方面的任何帮助都将非常受欢迎。
来自C:\Windows\Temp
的输出,其中包含一些巧克力输出以简化
C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log
答案 0 :(得分:1)
问题在于,当作为cloud init进程的一部分安装时,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
中详细了解相关信息