步驟 2.5:部署應用程式 - AWS OpsWorks

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

步驟 2.5:部署應用程式

重要

所以此 AWS OpsWorks Stacks 服務於 2024 年 5 月 26 日終止使用壽命,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載移轉至其他解決方案。如果您對移轉有任何疑問,請聯絡 AWS Support 團隊上 AWS Re: 郵寄或透過 AWS 高級 Support

IIS安裝程式會建立應用程式程式碼和相關檔案的C:\inetpub\wwwroot目錄。下一步是在該目錄中安裝應用程式。在此範例中,您將安裝靜態HTML首頁、default.html、中C:\inetpub\wwwroot。您可以輕鬆擴展一般方法來處理更複雜的情況,例如ASP. NET應用程式。

您可以在技術指南中包含應用程式的檔案,並讓 install.rb 複製這些檔案到 C:\inetpub\wwwroot。如需如何執行此作業的範例,請參閱 範例 6:建立檔案。但是,此方法並不靈活且效率不高,通常更好的方法是將技術指南開發與應用程式開發分隔開來。

偏好的解決方案是實作個別的部署方法,從儲存庫擷取應用程式的程式碼和相關檔案 (您偏好的任何儲存庫,而不只是食譜儲存庫),並將其安裝在每個伺服器執行個體上。IIS此方法會將技術指南開發與應用程式開發分隔開來,當您需要更新應用程式時,只需再次執行部署配方即可,無需更新技術指南。

本主題說明如何實作部署至IIS伺服器的簡單部署方案。default.htm您可以隨時將此範例擴展到更複雜的應用程式。

建立應用程式並存放在儲存庫中。

您可以為應用程式使用任何您偏好的儲存庫。為求簡化,此範例會將 default.htm 存放在公有 S3 儲存貯體中。

建立應用程式
  1. 在您的工作站中方便的位置上,建立名為 iis-application 的目錄。

  2. default.htm 檔案新增至具有以下內容的 iis-application

    <!DOCTYPE html> <html> <head> <title>IIS Example</title> </head> <body> <h1>Hello World!</h1> </body> </html>
  3. 建立 S3 儲存貯體上傳default.htm到儲存貯體,然後記錄以URL供日後使用。為求簡化,請將檔案設為公有

    注意

    這是一個非常簡單的應用程式,但您可以擴展基本原則以處理生產層級的應用程式。

    • 針對具有多個檔案的更複雜應用程式,為 iis-application 建立 .zip 封存並將其上傳至您的 S3 儲存貯體通常會更簡單。

      然後,您可以下載 .zip 檔並將其內容解壓縮到適當的目錄。不需要下載多個檔案或建立目錄結構等作業。

    • 針對生產應用程式,建議您將檔案保留為私有。如需如何讓配方從私有 S3 儲存貯體下載檔案的範例,請參閱 在一個上使SDK用紅寶石 AWS OpsWorks 堆棧窗口實例

    • 您可以將您的應用程式存放於任何適當的儲存庫。

      您通常使用存放庫的公用下載應用程式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用 Ruby v2 來下載文件。然而, AWS OpsWorks 堆疊不會SDK在 Windows 執行個體上安裝此項目,因此方案會從處理該工作的chef_gem資源開始。

注意

chef_gem 資源會將 gem 安裝到 Chef 專用的 Ruby 版本 (配方使用的版本) 中。如果您要為全系統範圍的 Ruby 版本安裝 gem,請使用 gem_package 資源。

配方的大部分是一個ruby_block資源,它運行使用 Ruby 下載SDK的 Ruby 代碼塊default.htmruby_block 中的程式碼可分為下列區段,這些區段分別對應於程式碼範例中的編號註解。

1:指定憑證套件

Amazon S3 使用SSL,因此您需要適當的憑證,才能從 S3 儲存貯體下載物件。SDK對於 Ruby v2 不包含證書包,因此您必須提供一個證書包並配置 Ruby 才能使用它。SDK AWS OpsWorks 堆棧不會直接安裝證書包,但它確實安裝 Git,其中包括證書包(curl-ca-bundle.crt)。為了方便起見,此範例會將 Ruby 設定SDK為使用 Git 憑證套件。SSL您也可以安裝自己的套件,並SDK相應地設定。

2:擷取儲存庫資料

若要從 Amazon S3 下載物件,您需要AWS區域、儲存貯體名稱和金鑰名稱。如下文所述,此範例透過將一組環境變數與應用程式建立關聯來提供此資訊。當您部署應用程式時, AWS OpsWorks 堆棧將一組屬性添加到實例的節點對象。這些屬性實際上是包含應用程式組態 (包括環境變數) 的雜湊表。此應用程序的應用程序屬性將看起來像下面的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的 Ruby 之後。

更新執行個體的技術指南

AWS OpsWorks 堆疊功能會自動在新執行個體上安裝自訂食譜。但是因為您正在使用現有的執行個體,所以您必須手動更新技術指南。

更新執行個體的技術指南
  1. 建立 iis-cookbook.zip 存檔,並將其上傳至 S3 儲存貯體。

    這會覆蓋現有的食譜,但URL保持不變,因此您不需要更新堆棧配置。

  2. 如果您的執行個體並未處於線上狀態,請將其重新啟動。

  3. 在執行個體上線之後,在導覽窗格中選擇 Stack (堆疊),然後選擇 Run Command (執行命令)

  4. 針對 Command (命令),選擇 Update Custom Cookbooks (更新自訂技術指南)。此命令會在執行個體上安裝更新技術指南。

  5. 選擇 Update Custom Cookbooks (更新自訂技術指南)。此命令可能需要幾分鐘的時間來完成。

將配方添加到自定義IIS層

如同 install.rb 一樣,處理部署的較佳方式是將 deploy.rb 指派給適當的生命週期事件。您通常會將部署配方指派至部署事件,並統稱為部署配方。將配方指派至部署事件不會觸發此事件。反之:

  • 對於新實例, AWS OpsWorks 堆疊會在安裝方法完成後自動執行 Deploy 方法,因此新執行個體會自動擁有目前的應用程式版本。

  • 針對線上執行個體,請使用部署命令來手動安裝新的或更新應用程式。

    此命令會在堆疊的執行個體上觸發部署事件,該事件會執行部署配方。

將 deploy.rb 指派給 layer 的部署事件
  1. 選擇導航窗格中的層,然後在圖下選擇配方IISExample。

  2. Custom Chef Recipes (自訂 Chef 配方) 下,將 iis-cookbook::deploy 新增至 Deploy (部署) 配方方塊,並選擇 + 來將配方新增至 layer。

  3. 選擇 Save (儲存) 以儲存新組態。自訂部署配方現在應包含 iis-cookbook::deploy

新增應用程式

最後一項任務是將應用程序添加到堆棧中以代表您的應用程序 AWS OpsWorks 堆棧環境。應用程式包含中繼資料 (如應用程式的顯示名稱) 和從儲存庫下載的應用程式所需資料。

將應用程式新增至堆疊
  1. 在導覽窗格中選擇 Apps (應用程式),然後選擇 Add an app (新增應用程式)

  2. 使用以下設定來設定應用程式。

    • 名稱 — 我 IIS-Example-App

    • 存放庫類型其他

    • 環境變數 — 新增下列三個環境變數:

      • S3REGION— 值區的區域 (在本例中為us-west-1)。

      • BUCKET— 值區名稱,例如windows-example-app

      • FILENAME— 檔案名稱:default.htm

  3. 接受其餘設定的預設值,然後選擇 Add App (新增應用程式) 將應用程式新增至堆疊。

注意

此範例使用環境變數來提供下載資料。另一種方法是使用 S3 存檔存放庫類型並提供檔案URL。 AWS OpsWorks Stacks 會將資訊以及選用資料 (例如AWS憑證) 新增至應用程式的app_source屬性。您的部署配方必須URL從應用程序屬性中獲取並對其進行解析以提取區域,存儲桶名稱和文件名。

部署應用程式和開啟應用程式

AWS OpsWorks 堆疊會自動將應用程式部署到新執行個體,但不會部署至線上執行個體 由於您的執行個體已在執行中,因此您必須手動部署應用程式。

部署應用程式
  1. 在導覽窗格中選擇 Apps (應用程式),然後在應用程式的 Actions (動作) 欄中選擇 deploy (部署)

  2. Command (命令) 應該設為 Deploy (部署)。選擇 Deploy App (部署應用程式) 頁面右下方的 Deploy (部署)。此命令可能需要幾分鐘的時間來完成。

    在部署完成後,您可以返回 Apps (應用程式) 頁面。Status (狀態) 指標會顯示綠色的 successful (成功),且應用程式名稱旁會顯示綠色核取標記,指出部署成功。

注意

Windows 應用程式一律為 Other (其他) 應用程式類型,因此部署應用程式會執行下列作業:

  • 將應用程式的資料新增至堆疊組態和部署屬性,如前所述。

  • 在堆疊的執行個體上觸發部署事件,該事件會執行您的自訂部署配方。

注意

如需如何故障診斷故障之部署或應用程式的詳細資訊,請參閱除錯配方

應用程式現在已安裝。您可以在 [功能] 格中選擇 [執行個體],然後選擇執行個體的公用 IP 位址來開啟它。這將向實例發送HTTP請求,並且您應該在瀏覽器中看到類似以下內容。

Text displaying "Hello World!" in large, bold font against a white background.