Как программно / удаленно выполнить программу в экземпляре EC2 Windows

Я хотел бы запустить экземпляр Windows EC2, загрузить EXEecutable и выполнить его (все это автоматизировано, это важно)

До сих пор я был в состоянии программно запустить экземпляр Windows EC2 и получить его параметры (пароль / IP), теперь я хотел бы найти способ загрузить этот исполняемый файл (с моей машины Windows или из другого экземпляра EC2 linux) и запустить его,

Я думал о запуске RDP-соединения и использовании макропрограммы для загрузки и выполнения файла, но, исходя из предыдущего опыта, это, по меньшей мере, плохой / хрупкий подход.

Я также думал о загрузке этого EXE на сервер, а затем сделать что-то вроде этого в Windows:

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

За исключением того, что в Windows нет wget!

Итак, мой вопрос: есть ли способ программно загрузить и выполнить EXEcutable в экземпляре Windows EC2?

5 ответов

Решение

Команда ec2-run-instances имеет два дополнительных аргумента, которые можно использовать при запуске команды. user-data командование и user-data-file оба они выполняют одну и ту же задачу, только они читают из разных входных данных. Когда вы используете этот аргумент, содержимое пользовательских данных будет загружено в URI Amazon. http://169.254.169.254/1.0/user-data доступно только для экземпляра, который был запущен.

Обычный способ сделать это в среде Linux - это загрузить сценарий оболочки в экземпляр, чтобы загрузить исполняемый файл, ваш файл пользовательских данных может выглядеть примерно так...

#! /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'

Альтернативный подход заключается в использовании Windows powershell и WinRM - он допускает удаленное выполнение, немного похожее на ssh в Linux.

Вот пример скрипта 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 по умолчанию включена в AM2 Amazon Windows AMI EC2. Все, что вам нужно сделать, это открыть порт 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

Обязательно запустите их как администратор.

Это звучит как идеальный вариант использования 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" : {}
}

Вы можете справиться с этим двумя способами,

  • Использование winscp в программе Windows SFTP.

    Чтобы получить доступ к серверу Amazon с помощью SFTP в Windows, загрузите приложение Windows SFTP. Используя WinSCP, вы устанавливаете сеанс SFTP с вашим сервером. WinSCP предлагает несколько приятных функций, которые облегчают работу с сервером EC2. Например, команда на панели кнопок открывает сеанс терминала PuTTY SSH с использованием тех же учетных данных, которые вы использовали для сеанса SFTP. (Вы также можете запустить сеанс PuTTY, нажав CTRL+P.).

  • Получите ведро S3 и смонтируйте на всех своих экземплярах Windows и Linux EC2. Вы должны иметь возможность загружать и загружать файлы в корзину S3 со своей рабочей станции, которые доступны для ваших экземпляров.

Я проделал аналогичную автоматизацию для AWS для развертывания на предприятиях еще в 2011 году. Формирование облака Amazon и эксплуатационные операции там, где все еще находились в стадии разработки. Однако мы успешно провели автоматизацию развертывания с использованием dotnet как для Linux, так и для платформы Windows. Модели powershell и ftp исключены. потому что это была среда предприятия и было ограничение порта. Ниже приведены подходы, которые я использовал.

Примечание: это было веб-приложение asp.net

Для развертывания Linux.

Мы использовали проект с открытым исходным кодом, называемый sharpshell(sharpSSH). Это приложение на языке C#, которое упрощает взаимодействие оболочки между windows и linux. Просто необходимо указать целевой адрес aws и ключ безопасности для подключения. Мы настроили приложение в соответствии с нашими требованиями

Для окон

Сказав это API формирования облаков, где до сих пор не доступно и меньше документации, доступной AWS. Мы использовали обходной путь, веб-сервис. Создан веб-сервис, который в основном загружает файл на сервер и развертывает. Этот веб-сервер размещается на сервере windows amazaon. Из него создается базовый образ и сертификат. Наконец, в новых экземплярах, созданных из этого образа, будут размещаться веб-сервисы, которые можно вызывать для загрузки пакета развертывания и установки в этой системе.

Хотя вышеупомянутые стартеры не были дураками и имели меньше контроля. мы достигли функциональности кроссплатформенного прямого развертывания из windows в linux без использования S3 buckets или powershell.

Пожалуйста, дайте мне знать, если вам нужны какие-либо разъяснения.

Ура! Чарльз

Другие вопросы по тегам