如何以编程/远程执行在EC2 Windows实例程序(How to programmatically

2019-06-23 19:01发布

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

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

我想过推出的RDP连接和使用宏软件上传及执行文件,但根据以往的经验,这是一个贫困/脆弱的办法,至少可以说。

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

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

除了Windows 没有 wget的!

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

Answer 1:

命令ec2-run-instances具有可运行命令时,可以使用两个额外的参数。 该user-data的命令和user-data-file这两个执行相同的任务只是他们从不同的输入读取。 当您使用此参数的用户数据的内容将被上传到托管的URI亚马逊http://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'


Answer 2:

另一种方法是使用Windows PowerShell和WinRM - 它允许远程执行,有点像在Linux上的SSH。

这里是一个PowerShell脚本,你可以在客户端远程执行脚本上运行的样品(摘自: https://github.com/CloudifySource/cloudify/blob/master/esc/src/main/resources/clouds/ec2 -WIN /上传/自举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的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

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



Answer 3:

您可以通过两种方式解决这个问题,

  • 在Windows SFTP程序的WinSCP。

    要访问Windows上使用您的SFTP服务器亚马逊,下载一个Windows应用SFTP。 的WinSCP,你会与您的服务器建立会话SFTP。 WinSCP赋予提供了一些不错的功能,可以轻松与您的EC2服务器的工作。 例如,在按钮栏命令打开使用您用于SFTP会话相同凭据的PuTTY SSH终端会话。 (您也可以启动通过按Ctrl + P PuTTY会话)。

  • 获取一个S3桶和安装在所有的Windows和Linux EC2实例。 您应该能够从工作站,这是你的实例访问的上传和下载文件到S3桶。



Answer 4:

这听起来像CloudFormation的一个完美的使用情况。 我创建演示模板。 使用时,把你可执行在S3桶和创建具有以下模板的新CloudFormation堆栈。 它将从S3下载可执行文件并运行它。 注:模板利用特殊的的AMI与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" : {}
}


Answer 5:

我不得不做类似的自动化AWS为企业部署早在2011年亚马逊云的形成和opsworks地方仍在建设then.However我们一直使用的dotnet用于Linux和Windows PowerShell的platform.The和ftp模型成功地完成部署自动化,其中排除becasue这是一个企业的环境和有端口限制。 下面是我使用的方法。

注:这是asp.net web应用程序

对于Linux部署。

我们用所谓的sharpshell一个开源项目(sharpSSH)。这是C#应用程序,它simpulates窗口和linux.Just之间壳连通需要提供目标AWS地址和安全密钥进行连接。 我们围绕定制我们的要求的应用

对于windows

话虽如此云的形成API,其中还没有可用的和可用的AWS文件较少。 我们用一种变通方法,Web服务的方法。 Crearted web服务基本上文件上载到服务器和部署。 有了这个网络服务器托管在amazaon窗口server.Created基础映像出这和证书。 终于创造出这个形象的一个新实例将有托管web服务可称为上传部署包,安装该系统上。

虽然上述startergies那里骗不了的证据,并有较少的控制研究。 我们实现了跨平台的直接部署的功能从Windows,而无需使用S3桶或PowerShell来Linux操作系统。

请让我知道如果你需要任何澄清。

干杯! 查尔斯



文章来源: How to programmatically/remotely execute a program in EC2 Windows instance