我在AWS windows EC2堆栈创建云形式脚本的userdata部分编写了以下powershell脚本。我可以使用脚本安装AWSCLI,但安装cmdlet后脚本无法识别'aws s3 cp'命令。 当我登录EC2实例时,我能够从powershell提示中成功运行aws s3 cp命令。 任何人都能说出我做错了什么。
{
"contents":[
"<powershell> ","\n",
"$awscliurl = \"https://s3.amazonaws.com/aws-cli/AWSCLI64.msi\" \n",
"$awsclidownloadloc = \"C:/Windows/Temp/AWSCLI64.msi\" \n",
"(New-Object System.Net.WebClient).DownloadFile($awscliurl, $awsclidownloadloc) \n",
"$argstr = \"/I C:\\Windows\\Temp\\AWSCLI64.msi /quiet /L*v ./awscli-output.log\" \n",
"Start-Process msiexec.exe -Wait -ArgumentList $argstr \n",
"Start-Process powershell.exe -RedirectStandardOutput c:\\s3out.txt -RedirectStandardError c:\\s3err.out -Wait -ArgumentList \"aws s3 cp s3://mybucket/myfile.exe c:\\myfile.exe\" \n",
"</powershell>"
]
}
当我看到s3err.out时,我看到了下面的
aws:术语“aws”未被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查 拼写名称,或者如果包含路径,请验证路径是否正确,然后重试。 在行:1个字符:1 + aws s3 cp s3://mybucket/myfile.exe c:\ myfile.exe + ~~~ + CategoryInfo:ObjectNotFound:(aws:String)[],CommandNotFoundException + FullyQualifiedErrorId:CommandNotFoundException
答案 0 :(得分:1)
&#34; AWS&#34;是一个位于&#34; C:\ Program Files \ Amazon \ AWSCLI \ aws.exe&#34;的可执行文件。当用户数据脚本启动时,系统PATH环境变量不包括AWS CLI目录,因此即使在安装后也无法找到它。当您登录时,您将获得包含cli的更新PATH,因此当您手动登录和测试时它将起作用。
在您的用户数据中,您应该可以替换&#34; aws&#34;对于绝对路径,但您需要确保其正确转义。
以下是未经测试的,但我认为应该有效。使用PowerShell`转义字符,您可以在双引号字符串中包含双引号...
-ArgumentList "`"C:\Program Files\Amazon\AWSCLI\aws.exe`" cp ..."
为了使这个JSON友好,我们需要进一步转义双引号,以便整行变为:
"Start-Process powershell.exe -RedirectStandardOutput c:\\s3out.txt -RedirectStandardError c:\\s3err.out -Wait -ArgumentList \"`\"C:\Program Files\Amazon\AWSCLI\aws.exe`\" s3 cp s3://mybucket/myfile.exe c:\\myfile.exe\" \n",
另一种方法是将PowerShell cmdlet用于S3:
Read-S3Object -BucketName mybucket -Key myfile.exe -File c:\\myfile.exe
答案 1 :(得分:0)
我也遇到了同样的问题,在安装aws cli后添加了以下代码,对我有用。
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")