我想推出一个EC2 Windows实例,上传一个EXEecutable&执行它(全部以自动方式,这很重要)
到目前为止,我能够以编程方式启动EC2 Windows实例&得到它的参数(密码/ IP),现在我想找到一种方法来上传这个可执行文件(来自我的Windows机器或来自我的其他EC2 linux实例)&跑吧。
我考虑过启动RDP连接&使用宏软件上传&执行该文件,但根据以前的经验,至少可以说这是一个糟糕/脆弱的方法。
我还想过将这个EXE上传到服务器,然后在Windows上执行类似的操作:
wget http://www.domain.com/my-file.exe
除了Windows 没有wget!
所以我的问题是:有没有办法以编程方式上传&在EC2 Windows实例中执行EXEcutable?
答案 0 :(得分:12)
另一种方法是使用Windows powershell和WinRM - 它允许远程执行,有点像Linux上的ssh。
以下是您可以在客户端上运行以远程执行脚本的powershell脚本示例(取自:https://github.com/CloudifySource/cloudify/blob/master/esc/src/main/resources/clouds/ec2-win/upload/bootstrap-client.ps1):
param ([string]$target, [string]$username, [string]$password, [string]$command)
$ErrorActionPreference="Stop"
# Set up the password
$securePassword = ConvertTo-SecureString -AsPlainText -Force $password
$cred = New-Object System.Management.Automation.PSCredential $username, $securePassword
Write-Host "Connecting to management service of $target"
Connect-WSMan -Credential $cred $target
set-item WSMan:\$target\Client\TrustedHosts -Value * -Force
set-item WSMan:\$target\Shell\MaxMemoryPerShellMB -Value 0 -Force
Write-Host Invoking command on Remote host $target
Invoke-Command -ComputerName $target -Credential $cred -ScriptBlock {
Invoke-Expression $args[0]
} -ArgumentList $command
Write-Host "Command finished"
您可以使用以下命令从您自己的脚本运行此命令:
powershell.exe -inputformat none -File PATH_TO_SCRIPT -target TARGET_IP -password PASSWORD -username USERNAME -command COMMAND_TO_EXECUTE
你应该引用你的字符串,尤其是密码和命令,因为这些字符通常会包含powershell可以解释为其他内容的特殊字符。
默认情况下,Win2M服务在EC2 Amazon Windows AMI上启用。您需要做的就是在安全组中打开端口5985(WinRM端口)。
最后,如果您以前从未在客户端计算机上使用过PowerShell远程处理,则应该执行一些命令来设置它(您只需要执行一次):
set-item WSMan:\localhost\Client\TrustedHosts -Value * -Force
set-item WSMan:\localhost\Shell\MaxMemoryPerShellMB -Value 0 -Force
Enable-PSRemoting
Set-ExecutionPolicy unrestricted
确保以管理员身份运行这些。
答案 1 :(得分:7)
命令ec2-run-instances
有两个额外的参数可以在运行命令时使用。 user-data
命令和user-data-file
这两个命令只是从不同的输入读取时执行相同的任务。当您使用此参数时,用户数据的内容将上传到亚马逊托管的URI http://169.254.169.254/1.0/user-data
,该URI仅对已启动的实例可用。
在linux环境中执行此操作的常规方法是将shell脚本上传到实例以下载exe,您的用户数据文件可能看起来像这样......
#! /bin/bash
wget http://www.domain.com/my-file.exe
在Windows中,没有安装默认服务来在引导实例时执行用户数据文件,但是有一个开源项目CloudInit.NET模拟相同的进程但使用了PowerShell脚本。唯一的要求是.NET 4.0和CloudInit.NET。安装后,它将在引导实例时执行用户数据文件。下载文件并使用PowerShell脚本执行它非常容易。
!# /powershell/
$wc = New-Object System.Net.WebClient
$wc.DownloadFile("http://www.domain.com/my-file.exe", "C:\my-file.exe");
& 'C:\my-file.exe'
答案 2 :(得分:1)
您可以通过两种方式处理此问题,
在Windows SFTP程序中使用winscp。
要在Windows上使用SFTP访问您的Amazon服务器,请下载Windows SFTP应用程序。使用WinSCP,您将与服务器建立SFTP会话。 WinSCP提供了一些很好的功能,使您可以轻松使用EC2服务器。例如,按钮栏中的命令使用您用于SFTP会话的相同凭据打开PuTTY SSH终端会话。 (您也可以通过单击CTRL + P启动PuTTY会话。)。
获取一个S3存储桶并挂载在所有Windows和Linux EC2实例上。您应该能够从工作站上传和下载文件到S3存储桶,您的实例可以访问这些存储桶。
答案 3 :(得分:1)
这听起来像是CloudFormation的完美用例。我创建了一个演示模板。要使用,请将您的可执行文件放在S3存储桶中,并使用以下模板创建新的CloudFormation堆栈。它将从S3下载您的可执行文件并运行它。注意:该模板使用内置AMIs的特殊CloudFormationScripts。
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "Spot Autoscaling for installing and running Windows Services.",
"Parameters" : {
"InstanceType" : {
"Description" : "WebServer EC2 instance type",
"Type" : "String",
"Default" : "m1.small",
"AllowedValues" : ["t1.micro", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "c1.medium", "c1.xlarge", "cc1.4xlarge", "cc2.8xlarge", "cg1.4xlarge"],
"ConstraintDescription" : "must be a valid EC2 instance type."
},
"KeyName" : {
"Description" : "The EC2 Key Pair to get Admin password to Instance.",
"Type" : "String"
},
"DeployS3Bucket" : {
"Description" : "The S3 Bucket where deploy files are stored",
"Type" : "String"
},
"DeployS3Key" : {
"Description" : "The exe file that runs on startup",
"Type" : "String"
}
},
"Mappings" : {
"RegionToAMIMap" : {
"us-east-1" : {
"AMI" : "ami-60b90609"
},
"us-west-1" : {
"AMI" : "ami-5bd6f11e"
},
"eu-west-1" : {
"AMI" : "ami-07151573"
},
"ap-southeast-1" : {
"AMI" : "ami-6ab5f538"
},
"ap-northeast-1" : {
"AMI" : "ami-424ff043"
}
}
},
"Resources" : {
"IAMUser" : {
"Type" : "AWS::IAM::User",
"Properties" : {
"Path" : "/",
"Policies" : [{
"PolicyName" : "root",
"PolicyDocument" : {
"Statement" : [{
"Effect" : "Allow",
"Action" : "*",
"Resource" : "*"
}]
}
}]
}
},
"IAMUserAccessKey" : {
"Type" : "AWS::IAM::AccessKey",
"Properties" : {
"UserName" : {
"Ref" : "IAMUser"
}
}
},
"SecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable RDP",
"SecurityGroupIngress" : [{
"IpProtocol" : "tcp",
"FromPort" : "3389",
"ToPort" : "3389",
"CidrIp" : "0.0.0.0/0"
}]
}
},
"RunExecutable" : {
"Type" : "AWS::EC2::Instance",
"Metadata" : {
"AWS::CloudFormation::Init" : {
"config" : {
"files" : {
"c:\\ToRun\\executable.exe" : {
"source" : {
"Fn::Join" : ["/", ["http://s3.amazonaws.com", {
"Ref" : "DeployS3Bucket"
}, {
"Ref" : "DeployS3Key"
}]]
},
"authentication" : "S3AccessCreds"
}
},
"commands" : {
"1-run-executable" : {
"command" : "c:\\ToRun\\executable.exe"
}
}
}
},
"AWS::CloudFormation::Authentication" : {
"S3AccessCreds" : {
"type" : "S3",
"accessKeyId" : {
"Ref" : "IAMUserAccessKey"
},
"secretKey" : {
"Fn::GetAtt" : ["IAMUserAccessKey", "SecretAccessKey"]
},
"buckets" : [{
"Ref" : "DeployS3Bucket"
}]
}
}
},
"Properties" : {
"KeyName" : {
"Ref" : "KeyName"
},
"ImageId" : {
"Fn::FindInMap" : ["RegionToAMIMap", {
"Ref" : "AWS::Region"
}, "AMI"]
},
"SecurityGroups" : [{
"Ref" : "SecurityGroup"
}],
"InstanceType" : {
"Ref" : "InstanceType"
},
"UserData" : {
"Fn::Base64" : {
"Fn::Join" : ["", ["<script>\n", "cfn-init.exe -v -s ", {
"Ref" : "AWS::StackName"
}, " -r RunExecutable ", " --access-key ", {
"Ref" : "IAMUserAccessKey"
}, " --secret-key ", {
"Fn::GetAtt" : ["IAMUserAccessKey", "SecretAccessKey"]
}, "\n", "</script>"]]
}
}
}
}
},
"Outputs" : {}
}
答案 4 :(得分:0)
我在2011年为AWS企业部署做了类似的自动化。亚马逊云形成和opsworks仍在建设中。然而,我们已成功使用dotnet为linux和windows平台完成部署自动化.powerhell和ftp 被排除在外的模型因为它是一个企业环境而且有端口限制。 以下是我使用的方法。
注意:这是asp.net web应用程序
我们使用了一个名为sharpshell(sharpSSH)的开源项目。这是c#应用程序,它简化了windows和linux之间的shell通信。只需要提供目标aws地址和安全密钥进行连接。我们根据我们的要求定制了应用程序
已经说过云形成API仍然无法使用AWS提供的文档和更少的文档。我们使用了一种解决方法,即Web服务方法。创建了一个Web服务,它基本上将文件上传到服务器并进行部署。这个网络服务器托管在amazaon windows server.Created基础图像和证书。最后,从该映像创建的新实例将托管webservices,可以调用它来上载部署包并在该系统上安装。
虽然上面的初学者不是傻瓜证明,并且控制较少。我们实现了从Windows到Linux的跨平台直接部署功能,而无需使用S3存储桶或PowerShell。
如果您需要任何澄清,请与我们联系。
干杯! 查尔斯