7

AWS Elastic Beanstalk の機能を利用して、作成する EC2 インスタンスをカスタマイズしようとしています。これには、.ebextensions ディレクトリに .config ファイルを作成する必要があります。

アプリケーションがインスタンスにデプロイされるときに実行するコマンドの数を指定できます。これを使用して、いくつかの msi ファイルをインストールし、インスタンスに一意の名前を割り当てるように EC2 を構成しています。これには再起動が必要です。

私の問題は、インスタンスが最初にデプロイされたときにのみこれらのコマンドを実行したいということです。コードのみの変更を既存のインスタンスにデプロイする場合、それらは実行されるべきではありません。

コマンドの実行を妨げる「テスト」パラメーターを使用してみました。最後のコマンドとしてファイルを作成し、「test」パラメーターでそのファイルの存在を確認します。しかし、うまくいかないようです。

私の設定ファイルは次のようなものです:

# File structure documented at http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-windows-ec2.html
files:
  "C:\\Users\\Public\\EnableEc2SetComputerName.ps1":
    source: "[File Source]"
commands:
  init-01-ec2setcomputername-enable:
    test: cmd /c "if exist C:\\Users\\Public\\initialised (exit 1) else (exit 0)"
    command: powershell.exe -ExecutionPolicy Bypass -File "C:\\Users\\Public\\EnableEc2SetComputerName.ps1"
    waitAfterCompletion: 0
  init-05-reboot-instance:
    test: cmd /c "if exist C:\\Users\\Public\\initialised (exit 1) else (exit 0)"
    command: shutdown -r # restart to enable EC2 to set the computer name
    waitAfterCompletion: forever
  init-06-mark-initialised:
    test: cmd /c "if exist C:\\Users\\Public\\initialised (exit 1) else (exit 0)"
    command: echo initialised > C:\\Users\\Public\\initialised
    waitAfterCompletion: 0

これを達成する別の方法はありますか?それとも私は愚かなことをしていますか?

Unix ベースのシステムには、コマンドtouchとコマンドがあります ( Unix システムに対して同等の質問をするこの回答testで言及されています)。この状況で最適に機能する Windows の同等のものは何ですか?

4

3 に答える 3

4

問題は、初期化されたファイルを書き込む前にマシンを再起動しているという事実にあると思います。最初にセマフォを書き込み、次にインスタンスを再起動し、セマフォの存在に応じてその.batファイルを実行するbatファイルを使用できるはずです。

ディレクティブを使用して .bat ファイルをダウンロードするか、files:source:ディレクティブを使用して .config に作成することができますfiles:content:

それ以外の場合は、test:回線は良好に見えます (再起動せずにローカルでテストしました)。

于 2013-09-04T23:05:06.153 に答える
3

基本的に、いいえ。Elastic Beanstalk は抽象化されており、基盤となるインフラストラクチャを管理します。多くの環境制御をあきらめて、展開を容易にします。CloudFormation、特にメタデータと cfn-init / cfn-hup を調査すると、beanstalkfilescommands http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuideの周りに非常によく似た構造が表示されます。 /aws-resource-init.html

アプリケーションのカスタマイズを超えてインスタンスのカスタマイズを行う必要がある場合は、間違ったツールを使用している可能性があり、不器用な回避策を講じる必要があります (AWS から touch/test が届くまで) Cloud Formation スクリプトの方が適切です。

Cloudformation を介して Windows インスタンスを構成する方法について書きましたが、Amazon自体にも広範なドキュメントがあります。

コマンドに関する大変な作業がすべて終わったので、Cloud Formation スクリプトに移行して、ワンタイム スタートアップ コードをユーザーデータに挿入するのはかなり簡単だと思います。

**編集 - 弾性のある豆の木を使っていれば、このようにできると思います command: dir initialised || powershell.exe -ExecutionPolicy Bypass -File "C:\\Users\\Public\\EnableEc2SetComputerName.ps1"

于 2013-09-04T11:53:21.707 に答える
1

私は最近、非常によく似た問題に遭遇し、上記の Jim Flanagan からの回答を利用して、これを行うための PowerShell スクリプトを作成しました。

#  restarts the server if this is not the first deployment
 param (

 )


$strFileName="C:\Users\Public\fwinitialised.txt"
If (Test-Path $strFileName){
  #This file was created on a previous deployment, reboot now.
  Restart-Computer -Force
}Else{
  # this is a new instance, no need to reboot.
  New-Item $strFileName -type file 
}

そして .ebextensions ファイルで...

6-reboot-instance:
    command: powershell.exe -ExecutionPolicy Bypass -File "C:\\PERQ\\Deployment\\RestartServerOnRedeployment.ps1" 
    waitAfterCompletion: forever
于 2015-10-27T11:17:06.930 に答える