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 リモート処理を使用したことがない場合は、セットアップのために実行する必要があるコマンドがいくつかあります (これは 1 回だけ実行する必要があります)。

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には、コマンドの実行時に使用できる 2 つの追加引数があります。user-dataコマンドとこれらのuser-data-file両方は、異なる入力から読み取るだけで同じタスクを実行します。この引数を使用すると、ユーザー データのコンテンツは、起動されhttp://169.254.169.254/1.0/user-dataたインスタンスでのみ利用可能な Amazon ホスト URI にアップロードされます。

Linux 環境でこれを行う通常の方法は、シェル スクリプトをインスタンスにアップロードして 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

これは、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 のエンタープライズ展開用に同様の自動化を行っていました。Amazon クラウドの形成と opsworks はまだ建設中でした。しかし、Linux と Windows プラットフォームの両方で dotnet を使用して展開の自動化に成功しました。PowerShell と ftp モデルは除外されました。エンタープライズ環境であり、ポート制限があったためです。以下は、私が使用したアプローチです。

注: これは asp.net Web アプリケーションでした

Linux 展開用。

私たちは、sharpshell (sharpSSH) と呼ばれるオープン ソース プロジェクトを使用しました。これは、Windows と Linux 間のシェル通信をシミュレートする C# アプリケーションです。接続するには、ターゲットの aws アドレスとセキュリティ キーを指定するだけです。要件に合わせてアプリをカスタマイズしました

窓用

とはいえ、クラウド形成 API はまだ利用できず、AWS で利用できるドキュメントも少なくなります。回避策として、Web サービス アプローチを使用しました。基本的にファイルをサーバーにアップロードしてデプロイする Web サービスを作成しました。この Web サーバーを使用して、amazaon Windows サーバーでホストされています。これと証明書から基本イメージを作成しました。最後に、このイメージから作成された新しいインスタンスには、デプロイ パッケージをアップロードしてそのシステムにインストールするために呼び出すことができる Web サービスがホストされます。

上記のスタータージーは、ばかげた証拠ではなく、制御が不十分でしたが。S3 バケットや PowerShell を使用せずに、Windows から Linux へのクロスプラットフォーム直接展開の機能を実現しました。

説明が必要な場合はお知らせください。

乾杯!チャールズ

于 2013-07-30T11:42:04.847 に答える