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

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

步驟 2.5:部署應用程式

重要

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

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 儲存貯體中。

建立應用程式
  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 儲存貯體下載檔案的範例,請參閱 在 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資源,它運行一個使用 Ruby SDK 下載的 Ruby 代碼塊default.htmruby_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 堆疊功能會自動在新執行個體上安裝自訂食譜。但是因為您正在使用現有的執行個體,所以您必須手動更新技術指南。

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

    這會覆寫現有的技術指南,但 URL 會保持不變,因此您不需要更新堆疊組態。

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

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

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

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

將配方新增至自訂 IIS Layer

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

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

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

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

將 deploy.rb 指派給 layer 的部署事件
  1. 在導覽窗格中選擇 Layers (Layer),然後在 Layer IISExample 下方選擇 Recipes (配方)

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

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

新增應用程式

最後一項工作是將應用程式新增至堆疊,以代表您在 AWS OpsWorks Stacks 環境中的應用程式。應用程式包含中繼資料 (如應用程式的顯示名稱) 和從儲存庫下載的應用程式所需資料。

將應用程式新增至堆疊
  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 請求傳送到執行個體,您應該會在瀏覽器中看到類似以下的內容。