在 AWS Elastic Beanstalk 上部署 Windows 服務和 Web 應用程序
我們希望將 ASP.NET MVC Web 應用程序和 Windows 服務部署到彈性 beanstalk。我們使用 awsdeploy.exe 來處理 Web 應用程序的部署。該服務和 Web 應用程序共享一個配置和庫。要部署該服務,我的計劃是:
- 在web部署包\bin目錄下包含windows服務exe,將服務和web應用一起部署
- 使用 .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 開發人員指南中找到這方面的文件。