18

我想启动一个 EC2 Windows 实例,上传一个 EXEecutable 并执行它(全部以自动化方式,这很重要)

到目前为止,我能够以编程方式启动 EC2 Windows 实例并获取其参数(密码/IP),现在我想找到一种方法来上传这个可执行文件(从我的 Windows 机器或从我的其他 EC2 linux 实例)并运行它.

我考虑过启动 RDP 连接并使用宏软件上传和执行文件,但根据以前的经验,这至少可以说是一种糟糕/脆弱的方法。

我也想过把这个 EXE 上传到服务器,然后在 Windows 上做这样的事情:

wget http://www.domain.com/my-file.exe

除了Windows没有wget!

所以我的问题是:有没有办法在 EC2 Windows 实例中以编程方式上传和执行可执行文件?

4

5 回答 5

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 可以解释为其他内容的特殊字符。

WinRM 服务在 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

确保以管理员身份运行这些。

于 2012-11-08T07:19:16.393 回答
7

该命令ec2-run-instances有两个附加参数,可在运行该命令时使用。该user-data命令和user-data-file它们都执行相同的任务,只是它们从不同的输入中读取。当您使用此参数时,用户数据的内容将上传到亚马逊托管的 URI,该 URIhttp://169.254.169.254/1.0/user-data仅适用于已启动的实例。

在 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'
于 2012-04-20T15:11:10.977 回答
1

您可以通过两种方式处理此问题,

  • 在 Windows SFTP 程序中使用 winscp。

    要在 Windows 上使用 SFTP 访问您的 Amazon 服务器,请下载 Windows SFTP 应用程序。使用 WinSCP,您将与您的服务器建立 SFTP 会话。WinSCP 提供了一些不错的功能,可以轻松使用您的 EC2 服务器。例如,按钮栏中的命令使用您用于 SFTP 会话的相同凭据打开一个 PuTTY SSH 终端会话。(您也可以通过单击 CTRL+P 来启动 PuTTY 会话。)。

  • 获取一个 S3 存储桶并安装在您的所有 Windows 和 linux EC2 实例上。您应该能够从您的工作站将文件上传和下载到 S3 存储桶,您的实例可以访问这些存储桶。

于 2012-04-19T22:00:29.660 回答
1

这听起来像是 CloudFormation 的完美用例。我创建了一个演示模板。要使用,请将您的可执行文件放在 S3 存储桶中,并使用以下模板创建一个新的 CloudFormation 堆栈。它将从 S3 下载您的可执行文件并运行它。注意:该模板使用内置CloudFormationScripts的特殊AMI

{
    "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" : {}
}
于 2012-11-06T16:52:59.617 回答
0

早在 2011 年,我就为 AWS 进行了类似的企业部署自动化。当时亚马逊云形成和 opsworks 仍在建设中。但是我们已经成功地使用 dotnet 为 linux 和 windows 平台完成了部署自动化。排除了 powershell 和 ftp 模型因为是企业环境,有端口限制。以下是我使用的方法。

注意:这是 asp.net 网络应用程序

用于 linux 部署。

我们使用了一个名为sharpshell(sharpSSH)的开源项目。这是一个模拟windows和linux之间shell通信的c#应用程序。只需要提供目标aws地址和安全密钥即可连接。我们围绕我们的要求定制了应用程序

对于窗户

话虽如此,云形成 API 仍然不可用,AWS 可用的文档也更少。我们使用了一种解决方法,即 Web 服务方法。创建了一个网络服务,它基本上将文件上传到服务器并部署。使用托管在 amazaon windows server.Created 基础图像的这个网络服务器和证书。最后,从此映像创建的新实例将托管 Web 服务,可以调用它来上传部署包并安装在该系统上。

虽然上面的 startergies 不是万无一失的并且控制较少。我们实现了从 windows 到 linux 的跨平台直接部署的功能,而无需使用 S3 bucket 或 powershell。

如果您需要任何澄清,请告诉我。

干杯! 查尔斯

于 2013-07-30T11:42:04.847 回答