Comment programmer / exécuter à distance un programme dans L'instance Windows EC2

j'aimerais lancer une instance Windows EC2, télécharger un EXEecutable et l'exécuter (tout en automatique, c'est important)

Jusqu'à présent j'ai pu programmer le lancement de l'instance Windows EC2 et obtenir ses paramètres (mot de passe / IP), maintenant j'aimerais trouver un moyen de télécharger cet exécutable (à partir de ma machine Windows ou à partir de mon autre EC2 instance de linux) et l'exécuter.

j'ai pensé lancer une connexion RDP et utiliser une macro logiciel pour télécharger et exécuter le fichier, mais basé sur des expériences précédentes c'est une approche pauvre/fragile pour dire le moins.

j'ai aussi pensé à télécharger cet EXE sur un serveur, puis faire quelque chose comme ça sur Windows:

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

sauf que Windows ne pas wget!

alors ma question Est:existe-t-il un moyen de programmer le téléchargement et l'exécution D'un exécutable dans une instance Windows EC2?

18
demandé sur gareth_bowles 2012-04-20 01:29:54

5 réponses

La commande ec2-run-instances a deux arguments supplémentaires qui peuvent être utilisés lors de l'exécution de la commande. user-data commande et user-data-file ces deux effectuer la même tâche juste qu'ils lisent à partir de différentes entrées. Lorsque vous utilisez cet argument, le contenu des données Utilisateur sera téléchargé dans un URI hébergé par amazon http://169.254.169.254/1.0/user-data disponible uniquement pour l'instance qui a été lancée.

la façon normale de faire cela dans l'environnement linux serait de télécharger un script shell vers l'instance de téléchargement l'exe, votre fichier de données pourrait ressembler à ça...

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

dans Windows il n'y a pas de service par défaut installé pour exécuter le fichier de données utilisateur lorsque l'instance est démarrée mais il y a un projet open-source CloudInit.NET qui simule le même processus mais avec un script powershell. Les seules exigences sont .NET 4.0 et CloudInit.NET. Une fois installé, il exécute le fichier user-data lorsque l'instance est démarrée. Il est très facile de télécharger un fichier et exécuter un script 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'
7
répondu bwight 2012-12-08 18:02:41

une approche alternative est D'utiliser Windows powershell et WinRM - il permet l'exécution à distance, un peu comme ssh sur Linux.

voici un exemple de script powershell que vous pouvez exécuter sur le client pour exécuter à distance un script (pris à partir de: 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"

vous pouvez exécuter cette commande à partir de votre propre script avec le suivant commande:

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

vous devriez probablement citer vos chaînes, en particulier le mot de passe et la commande, car ceux-ci auront généralement des caractères spéciaux que powershell peut interpréter comme autre chose.

le service WinRM est activé par défaut sur EC2 Amazon Windows AMIs. Tout ce que vous devez faire est d'ouvrir le port 5985 (le port WinRM) dans votre groupe de sécurité.

enfin, si vous n'avez jamais utilisé powershell remoting sur votre machine client avant, Il ya un couple de commandes que vous devez exécuter pour le configurer (vous n'avez besoin de le faire qu'une fois):

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

assurez-vous de les exécuter en tant qu'administrateur.

12
répondu Barak 2012-11-08 10:24:33

Vous pouvez gérer cela de 2 façons,

  • utiliser winscp dans Windows SFTP program.

    pour accéder à votre serveur Amazon en utilisant SFTP sous Windows, téléchargez une application Windows SFTP. En utilisant WinSCP, vous établirez une session SFTP avec votre serveur. WinSCP offre de belles fonctionnalités qui facilitent le travail avec votre serveur EC2. Par exemple, une commande dans la barre de boutons ouvre une session PuTTY SSH terminal en utilisant les mêmes informations d'identification que vous avez utilisées pour votre SFTP session. (Vous pouvez également lancer une session PuTTY en cliquant sur CTRL+P.).

  • obtenez un seau S3 et montez sur toutes vos instances EC2 windows et linux. Vous devriez être en mesure de télécharger les fichiers vers S3 bucket à partir de votre station de travail, qui sont accessibles à vos instances.

1
répondu Chakri 2012-04-19 22:00:29

cela ressemble à un cas d'utilisation parfaite de CloudFormation. J'ai créé un modèle de montre. Pour l'utiliser, Mettez votre exécutable dans un seau S3 et créez une nouvelle pile CloudFormation avec le modèle suivant. Il téléchargera votre exécutable à partir de S3 et l'exécutera. Remarque: le modèle rend l'utilisation de AMIsNuagedformationscripts construit en.

{
    "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" : {}
}
1
répondu Edwin 2012-11-08 10:27:23

j'avais fait une automatisation similaire pour AWS pour le déploiement d'entreprise en 2011. Amazon cloud formation et opsworks sont encore en construction.Cependant, nous avions réussi à automatiser le déploiement en utilisant dotnet pour les plateformes linux et windows.La powershell et ftp le modèle a été exclu parce qu'il s'agissait d'un environnement d'entreprise et qu'il y avait des restrictions portuaires. Ci-dessous sont les approches que j'ai utilisé.

Note:c'était asp.net application web

Pour linux déploiement.

nous avons utilisé un projet à source ouverte appelé sharpshell (sharpSSH).C'est l'application c# qui simule la communication shell entre windows et linux.Il suffit de fournir l'Adresse cible aws et la clé de sécurité pour se connecter. Nous avons adapté l'application autour de notre exigence

Pour windows

cela étant dit, L'API de formation des nuages n'est pas encore disponible et il y a moins de documentation disponible par AWS. Nous avons utilisé une solution de contournement, l'approche webservice. Crearted a webservice qui envoie essentiellement un fichier sur le serveur et le déployer. Avec ce serveur hébergé sur amazaon windows server.Créé une image de base de ce et certificat. Enfin, une nouvelle instance créée à partir de cette image aurait des webservices hébergés qui pourraient être appelés à télécharger le paquet de déploiement et à l'installer sur ce système.

bien que les startergies ci-dessus n'ont pas de preuve évidente et ont moins de controlll. nous avons atteint la fonctionnalité de déploiement direct multiplateformes à partir de windows à linux sans utiliser de S3 buckets ou powershell.

s'il vous Plaît laissez-moi savoir si vous avez besoin d'éclaircissements.

Cheers! Charles

0
répondu charles anil dsouza 2013-07-30 11:42:04