EC2 Windows用户数据:Powershell未按预期运行

时间:2017-11-06 15:50:57

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

我正在尝试通过用户数据中的Powershell命令来引导EC2 Windows实例。我试图通过用户数据执行的步骤是:

  • 安装chocolatey
  • 使用chocolatey安装Python
  • 使用chocolatey安装AWS CLI
  • 使用AWS CLI从S3下载Powershell脚本
  • 运行该Powershell脚本

用户数据非常简单:

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。再次 - 在我们尝试获取该文件之前,为什么会出现这种错误?
  • 然后日志显示choco,python和awscli实际 正确安装。

我不明白执行顺序发生了什么。如果我登录到该框并执行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

1 个答案:

答案 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

您可以在chocolatey troubleshooting guide

中详细了解相关信息