Dot-Net

在 AWS Elastic Beanstalk 上部署 Windows 服務和 Web 應用程序

  • December 23, 2013

我們希望將 ASP.NET MVC Web 應用程序和 Windows 服務部署到彈性 beanstalk。我們使用 awsdeploy.exe 來處理 Web 應用程序的部署。該服務和 Web 應用程序共享一個配置和庫。要部署該服務,我的計劃是:

  1. 在web部署包\bin目錄下包含windows服務exe,將服務和web應用一起部署
  2. 使用 .ebextensions 文件安裝服務

但是,這似乎不起作用,因為 .ebextensions 操作是在安裝 webdeploy 包之前執行的,因此無法安裝服務 exe。

看來我的選擇是:

S3

壓縮服務 exe 並將其發佈到 S3,以便在部署 Web 應用程序時通過 .ebextensions 安裝它。

這並不理想,因為服務和 Web 應用程序共享依賴項 + 配置。該服務需要使用一組單獨的依賴項和配置進行安裝,因為它需要在 Web 應用程序更新之前啟動並執行。

部署後腳本

使用不受支持的部署後腳本技術,我需要將其轉換為 Windows 世界。

Windows 目錄 = C:\Program Files\Amazon\ElasticBeanstalk\hooks\appdeploy\post 那裡有一個 .ps1 腳本文件。(是否支持 .cmd?)

將 Web 部署包用作 .ebextensions zip 源

我們可以使用 webdeploy 包 @“C:\cfn\ebdata\source_bundle.zip” 作為源,解壓縮並從那里安裝服務。問題是 zip 中的內部路徑取決於使用者機器的建構方式,因此在解壓縮的文件結構中查找 exe 會很棘手。範例路徑 = “Content\C_C\gitdeploy\blah\blahSolution\blahProject\obj\awsTestDebug\Package\PackageTmp\bin\myservice.exe”

關於採取哪種方法有什麼建議嗎?

編輯

接受 Jim 的建議,我使用了 container_commands,它執行良好。我的 .ebextensions/install.config 看起來像這樣..

...
container_commands:
 installTaskRunner:
   command: C:\\inetpub\\wwwroot\\App_Data\\installTaskRunner.cmd >> C:\\inetpub\\wwwroot\\App_Data\\installTaskRunner.log
commands:
 stop_service:
   command: net stop MyService
   ignoreErrors: true
...

批處理文件看起來像這樣……

pushd C:\inetpub\wwwroot\bin
C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\installutil  MyService.exe
net start MyService
popd

編輯#2

向 instal.config 添加了附加命令,用於在應用 webdeploy 包之前停止服務,因為 service.exe 會鎖定一些部署文件。

關於部署後腳本,其中一個文件夾中帶有 .ps1、.bat 或 .exe 的任何文件都將在該階段執行。如果您需要對實例上發生的事情進行精細控制,則可以使用此方法。

還有第三種選擇,即使用**container_commands:而不是commands:**

container_commands:將在應用程序部署後執行。

可以在Elastic Beanstalk 開發人員指南中找到這方面的文件。

引用自:https://stackoverflow.com/questions/20647913