本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
步驟 2.5:部署應用程式
重要
該 AWS OpsWorks Stacks 服務於 2024 年 5 月 26 日終止使用壽命,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載移轉至其他解決方案。如果您對移轉有任何疑問,請透過 AWS Re: post
IIS 安裝會為應用程式的程式碼和相關檔案建立 C:\inetpub\wwwroot
目錄。下一步是在該目錄中安裝應用程式。在此範例中,您將在 default.html
中安裝靜態 HTML 首頁 C:\inetpub\wwwroot
。您可以輕鬆擴展一般方法以處理更複雜的案例,如 ASP.NET 應用程式。
您可以在技術指南中包含應用程式的檔案,並讓 install.rb
複製這些檔案到 C:\inetpub\wwwroot
。如需如何執行此作業的範例,請參閱 範例 6:建立檔案。但是,此方法並不靈活且效率不高,通常更好的方法是將技術指南開發與應用程式開發分隔開來。
慣用的解決方案是實作個別的部署方法,從儲存庫擷取應用程式的程式碼和相關檔案 (您偏好的任何儲存庫,而不只是食譜儲存庫),並將其安裝在每個 IIS 伺服器執行個體上。此方法會將技術指南開發與應用程式開發分隔開來,當您需要更新應用程式時,只需再次執行部署配方即可,無需更新技術指南。
本主題說明如何實作將 default.htm
部署到 IIS 伺服器的簡單部署配方。您可以隨時將此範例擴展到更複雜的應用程式。
建立應用程式並存放在儲存庫中。
您可以為應用程式使用任何您偏好的儲存庫。為求簡化,此範例會將 default.htm
存放在公有 S3 儲存貯體中。
建立應用程式
-
在您的工作站中方便的位置上,建立名為
iis-application
的目錄。 -
將
default.htm
檔案新增至具有以下內容的iis-application
。<!DOCTYPE html> <html> <head> <title>IIS Example</title> </head> <body> <h1>Hello World!</h1> </body> </html>
-
建立 S3 儲存貯體,將
default.htm
上傳到儲存貯體,並記錄此 URL 供以後使用。為求簡化,請將檔案設為公有。注意
這是一個非常簡單的應用程式,但您可以擴展基本原則以處理生產層級的應用程式。
-
針對具有多個檔案的更複雜應用程式,為
iis-application
建立 .zip 封存並將其上傳至您的 S3 儲存貯體通常會更簡單。然後,您可以下載 .zip 檔並將其內容解壓縮到適當的目錄。不需要下載多個檔案或建立目錄結構等作業。
-
針對生產應用程式,建議您將檔案保留為私有。如需如何讓配方從私有 S3 儲存貯體下載檔案的範例,請參閱 在 AWS OpsWorks 堆棧窗口實例上使用 SDK 進行紅寶石。
-
您可以將您的應用程式存放於任何適當的儲存庫。
通常,您會使用儲存庫的公有 API 來下載應用程式。此範例使用 Amazon S3 API。例如,如果您將應用程式儲存在上 GitHub,則可以使用 GitHub API
。
-
實作配方來部署應用程式
將名為 deploy.rb
的配方新增至 iis-cookbook
recipes
目錄中,其中包含下列內容。
chef_gem "aws-sdk-s3" do compile_time false action :install end ruby_block "download-object" do block do require 'aws-sdk-s3' #1 # Aws.config[:ssl_ca_bundle] = 'C:\ProgramData\Git\bin\curl-ca-bundle.crt' Aws.use_bundled_cert! #2 query = Chef::Search::Query.new app = query.search(:aws_opsworks_app, "type:other").first s3region = app[0][:environment][:S3REGION] s3bucket = app[0][:environment][:BUCKET] s3filename = app[0][:environment][:FILENAME] #3 s3_client = Aws::S3::Client.new(region: s3region) s3_client.get_object(bucket: s3bucket, key: s3filename, response_target: 'C:\inetpub\wwwroot\default.htm') end action :run end
這個例子使 SDK for Ruby v2 來下載文件。不過, AWS OpsWorks 堆疊不會在 Windows 執行個體上安裝此 SDK,因此方案從處理該工作的chef_gem
注意
chef_gem
資源會將 gem 安裝到 Chef 專用的 Ruby 版本 (配方使用的版本) 中。如果您要為全系統範圍的 Ruby 版本安裝 gem,請使用 gem_package
配方的大部分是一個ruby_block
default.htm
。ruby_block
中的程式碼可分為下列區段,這些區段分別對應於程式碼範例中的編號註解。
- 1:指定憑證套件
-
Amazon S3 使用 SSL,因此您需要適當的憑證才能從 S3 儲存貯體下載物件。適用於 Ruby v2 的 SDK 不包含憑證套件,因此您必須提供一個憑證套件,並設定 Ruby 使用的 SDK。 AWS OpsWorks 堆棧不會直接安裝證書包,但它確實安裝 Git,其中包括證書包(
curl-ca-bundle.crt
)。為了方便起見,這個範例會將 SDK 設定為使用 SSL 的 Git 憑證套件組合。您也可以安裝自己的套件,並依照需要來設定軟體開發套件。 - 2:擷取儲存庫資料
-
若要從 Amazon S3 下載物件,您需要 AWS 區域、儲存貯體名稱和金鑰名稱。如下文所述,此範例透過將一組環境變數與應用程式建立關聯來提供此資訊。部署應用程式時, AWS OpsWorks Stacks 會將一組屬性新增至執行個體的節點物件。這些屬性實際上是包含應用程式組態 (包括環境變數) 的雜湊表。此應用程式的應用程式屬性看起來會類似下列內容 (JSON 格式)。
{ "app_id": "8f71a9b5-de7f-451c-8505-3f35086e5bb3", "app_source": { "password": null, "revision": null, "ssh_key": null, "type": "other", "url": null, "user": null }, "attributes": { "auto_bundle_on_deploy": true, "aws_flow_ruby_settings": {}, "document_root": null, "rails_env": null }, "data_sources": [{"type": "None"}], "domains": ["iis_example_app"], "enable_ssl": false, "environment": { "S3REGION": "us-west-2", "BUCKET": "windows-example-app", "FILENAME": "default.htm" }, "name": "IIS-Example-App", "shortname": "iis_example_app", "ssl_configuration": { "certificate": null, "private_key": null, "chain": null }, "type": "other", "deploy": true }
此應用程式的環境變數存放在
[:environment]
屬性中。若要擷取,請使用 Chef 搜尋查詢來擷取應用程式的雜湊表,位於aws_opsworks_app
節點之下。此應用程式定義為other
類型,因此查詢會搜尋該類型的應用程式。配方會利用此執行個體上只有一個應用程式的事實,因此特定的雜湊表為app[0]
。為了方便起見,配方隨後會將區域、儲存貯體和檔案名稱指派至變數。如需如何使用 Chef 搜尋的詳細資訊,請參閱 使用 Chef 搜尋取得屬性值。
- 3:下載檔案
-
配方的第三個部分是建立 S3 用戶端物件 並使用其
get_object
方法來下載default.htm
到執行個體的C:\inetpub\wwwroot
目錄。
注意
配方是 Ruby 應用程式,因此 Ruby 程式碼不一定需要位於 ruby_block
中。不過,配方主體中的程式碼會先執行,接著才會執行資源。在此範例中,如果您將下載程式碼放在配方主體中,則會失敗,因為chef_gem
資源尚未安裝 SDK for Ruby。資源中的代碼在ruby_block
資源執行時執行,在chef_gem
資源已經安裝了 SDK for Ruby 之後。
更新執行個體的技術指南
AWS OpsWorks 堆疊功能會自動在新執行個體上安裝自訂食譜。但是因為您正在使用現有的執行個體,所以您必須手動更新技術指南。
更新執行個體的技術指南
-
建立
iis-cookbook
的.zip
存檔,並將其上傳至 S3 儲存貯體。這會覆寫現有的技術指南,但 URL 會保持不變,因此您不需要更新堆疊組態。
-
如果您的執行個體並未處於線上狀態,請將其重新啟動。
-
在執行個體上線之後,在導覽窗格中選擇 Stack (堆疊),然後選擇 Run Command (執行命令)。
-
針對 Command (命令),選擇 Update Custom Cookbooks (更新自訂技術指南)。此命令會在執行個體上安裝更新技術指南。
-
選擇 Update Custom Cookbooks (更新自訂技術指南)。此命令可能需要幾分鐘的時間來完成。
將配方新增至自訂 IIS Layer
如同 install.rb
一樣,處理部署的較佳方式是將 deploy.rb
指派給適當的生命週期事件。您通常會將部署配方指派至部署事件,並統稱為部署配方。將配方指派至部署事件不會觸發此事件。反之:
-
對於新的執行個體, AWS OpsWorks Stacks 會在安裝方法完成後自動執行 Deploy 方法,因此新執行個體會自動擁有目前的應用程式版本。
-
針對線上執行個體,請使用部署命令來手動安裝新的或更新應用程式。
此命令會在堆疊的執行個體上觸發部署事件,該事件會執行部署配方。
將 deploy.rb 指派給 layer 的部署事件
-
在導覽窗格中選擇 Layers (Layer),然後在 Layer IISExample 下方選擇 Recipes (配方)。
-
在 Custom Chef Recipes (自訂 Chef 配方) 下,將
iis-cookbook::deploy
新增至 Deploy (部署) 配方方塊,並選擇 + 來將配方新增至 layer。 -
選擇 Save (儲存) 以儲存新組態。自訂部署配方現在應包含
iis-cookbook::deploy
。
新增應用程式
最後一項工作是將應用程式新增至堆疊,以代表您在 AWS OpsWorks Stacks 環境中的應用程式。應用程式包含中繼資料 (如應用程式的顯示名稱) 和從儲存庫下載的應用程式所需資料。
將應用程式新增至堆疊
-
在導覽窗格中選擇 Apps (應用程式),然後選擇 Add an app (新增應用程式)。
-
使用以下設定來設定應用程式。
-
名稱 — 我
IIS-Example-App
-
存放庫類型 — 其他
-
環境變數 — 新增下列三個環境變數:
-
S3REGION
— 值區的區域 (在本例中為us-west-1
)。 -
BUCKET
— 值區名稱,例如windows-example-app
。 -
FILENAME
— 檔案名稱:default.htm
。
-
-
-
接受其餘設定的預設值,然後選擇 Add App (新增應用程式) 將應用程式新增至堆疊。
注意
此範例使用環境變數來提供下載資料。另一種方法是使用 S3 存檔存放庫類型並提供檔案的 URL。 AWS OpsWorks Stacks 會將資訊及選用資料 (例如 AWS 登入資料) 新增至應用程式的app_source
屬性。您的部署配方必須從應用程式屬性中取得 URL 並進行剖析,以擷取區域、儲存貯體名稱和檔案名稱。
部署應用程式和開啟應用程式
AWS OpsWorks 堆疊會自動將應用程式部署到新執行個體,但不會部署至線上執行個體 由於您的執行個體已在執行中,因此您必須手動部署應用程式。
部署應用程式
-
在導覽窗格中選擇 Apps (應用程式),然後在應用程式的 Actions (動作) 欄中選擇 deploy (部署)。
-
Command (命令) 應該設為 Deploy (部署)。選擇 Deploy App (部署應用程式) 頁面右下方的 Deploy (部署)。此命令可能需要幾分鐘的時間來完成。
在部署完成後,您可以返回 Apps (應用程式) 頁面。Status (狀態) 指標會顯示綠色的 successful (成功),且應用程式名稱旁會顯示綠色核取標記,指出部署成功。
注意
Windows 應用程式一律為 Other (其他) 應用程式類型,因此部署應用程式會執行下列作業:
-
將應用程式的資料新增至堆疊組態和部署屬性,如前所述。
-
在堆疊的執行個體上觸發部署事件,該事件會執行您的自訂部署配方。
注意
如需如何故障診斷故障之部署或應用程式的詳細資訊,請參閱除錯配方。
應用程式現在已安裝。您可以在 [功能] 窗格中選擇 [執行個體],然後選擇執行個體的公用 IP 位址來開啟它。這會將 HTTP 請求傳送到執行個體,您應該會在瀏覽器中看到類似以下的內容。
![](images/windows-iis-app.png)