Подтвердить что ты не робот

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

#! /bin/bash
wget http://www.domain.com/my-file.exe

В Windows нет установки по умолчанию для выполнения пользовательского файла данных при загрузке экземпляра, но есть проект с открытым исходным кодом CloudInit.NET, который имитирует тот же процесс, но с powershell script. Единственными требованиями являются .NET 4.0 и CloudInit.NET. После установки он выполнит файл user-data при загрузке экземпляра. Очень легко загрузить файл и выполнить его с помощью powershell script.

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

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

Вот пример powershell script, который вы можете запустить на клиенте для удаленного выполнения script (взято из: 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"

Вы можете запустить эту команду из своего собственного script с помощью следующей команды:

powershell.exe -inputformat none -File PATH_TO_SCRIPT -target TARGET_IP -password PASSWORD -username USERNAME -command COMMAND_TO_EXECUTE

Вероятно, вы должны указывать свои строки, особенно пароль и команду, так как обычно они имеют специальные символы, которые powershell может интерпретировать как что-то еще.

Служба WinRM включена по умолчанию в AMI Amazon Windows AMI. Все, что вам нужно сделать, это открыть порт 5985 (порт WinRM) в вашей группе безопасности.

Наконец, если вы никогда не использовали удаленную удаленную систему на своем клиентском компьютере, есть несколько команд, которые вы должны выполнить для его настройки (вам нужно только сделать это один раз):

set-item WSMan:\localhost\Client\TrustedHosts -Value * -Force
set-item WSMan:\localhost\Shell\MaxMemoryPerShellMB -Value 0 -Force
Enable-PSRemoting
Set-ExecutionPolicy unrestricted

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

У меня была аналогичная автоматизация для AWS для развертывания предприятия еще в 2011 году. Формирование облаков в Amazon и opsworks, которые все еще находятся в стадии разработки. Однако мы успешно выполнили автоматизацию развертывания с использованием dotnet для платформы linux и windows. Powershell и ftp которая исключалась из-за того, что это была корпоративная среда, и было ограничение порта. Ниже приведены подходы, которые я использовал.

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

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

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

Для окон

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

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

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

Ура! Чарльз