

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

# 步驟 2.5：部署應用程式
<a name="gettingstarted-windows-deploy"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 AWS 支援 團隊。

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

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

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

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

**Topics**
+ [建立應用程式並存放在儲存庫中。](#w2ab1c14c47c17c23c25c15)
+ [實作配方來部署應用程式](#w2ab1c14c47c17c23c25c17)
+ [更新執行個體的技術指南](#w2ab1c14c47c17c23c25c19)
+ [將配方新增至自訂 IIS Layer](#w2ab1c14c47c17c23c25c21)
+ [新增應用程式](#w2ab1c14c47c17c23c25c23)
+ [部署應用程式和開啟應用程式](#w2ab1c14c47c17c23c25c25)

## 建立應用程式並存放在儲存庫中。
<a name="w2ab1c14c47c17c23c25c15"></a>

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

**建立應用程式**

1. 在您的工作站中方便的位置上，建立名為 `iis-application` 的目錄。

1. 將 `default.htm` 檔案新增至具有以下內容的 `iis-application`。

   ```
   <!DOCTYPE html>
   <html>
     <head>
       <title>IIS Example</title>
     </head>
     <body>
       <h1>Hello World!</h1>
     </body>
   </html>
   ```

1. [建立 S3 儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html)，[將 `default.htm` 上傳到儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/gsg/PuttingAnObjectInABucket.html)，並記錄此 URL 供以後使用。為求簡化，請[將檔案設為公有](https://docs.aws.amazon.com/AmazonS3/latest/gsg/OpeningAnObject.html)。
**注意**  
這是一個非常簡單的應用程式，但您可以擴展基本原則以處理生產層級的應用程式。  
針對具有多個檔案的更複雜應用程式，為 `iis-application` 建立 .zip 封存並將其上傳至您的 S3 儲存貯體通常會更簡單。  
然後，您可以下載 .zip 檔並將其內容解壓縮到適當的目錄。不需要下載多個檔案或建立目錄結構等作業。
針對生產應用程式，建議您將檔案保留為私有。如需如何讓配方從私有 S3 儲存貯體下載檔案的範例，請參閱 [在 Stacks Windows 執行個體上使用適用於 Ruby OpsWorks 的 SDK](cookbooks-101-opsworks-s3-windows.md)。
您可以將您的應用程式存放於任何適當的儲存庫。  
通常，您會使用儲存庫的公有 API 來下載應用程式。此範例使用 Amazon S3 API。例如，如果您將應用程式存放在 GitHub 上，則可以使用 [GitHub API](https://developer.github.com/guides/getting-started/)。

## 實作配方來部署應用程式
<a name="w2ab1c14c47c17c23c25c17"></a>

將名為 `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
```

此範例使用[適用於 Ruby v2 的 SDK](https://docs.aws.amazon.com/sdkforruby/api/index.html) 下載 檔案。不過， OpsWorks Stacks 不會在 Windows 執行個體上安裝此開發套件，因此配方會從處理該任務[https://docs.chef.io/chef/resources.html#chef-gem](https://docs.chef.io/chef/resources.html#chef-gem)的資源開始。

**注意**  
`chef_gem` 資源會將 gem 安裝到 Chef 專用的 Ruby 版本 (配方使用的版本) 中。如果您要為全系統範圍的 Ruby 版本安裝 gem，請使用 [gem\$1package](https://docs.chef.io/chef/resources.html#gem-package) 資源。

大部分配方都是 [https://docs.chef.io/chef/resources.html#ruby-block](https://docs.chef.io/chef/resources.html#ruby-block) 資源，其會執行 Ruby 程式碼區塊，使用適用於 Ruby 的 SDK 下載 `default.htm`。`ruby_block` 中的程式碼可分為下列區段，這些區段分別對應於程式碼範例中的編號註解。

**1：指定憑證套件**  
Amazon S3 使用 SSL，因此您需要適當的憑證才能從 S3 儲存貯體下載物件。適用於 Ruby v2 的 SDK 不包含憑證套件，因此您必須提供憑證套件，並設定適用於 Ruby 的 SDK 來使用它。 OpsWorks Stacks 不會直接安裝憑證套件，但會安裝 Git，其中包含憑證套件 (`curl-ca-bundle.crt`)。為了方便起見，此範例會將適用於 Ruby 的 SDK 設定為使用適用於 SSL 的 Git 憑證套件。您也可以安裝自己的套件，並依照需要來設定軟體開發套件。

**2：擷取儲存庫資料**  
若要從 Amazon S3 下載物件，您需要 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 搜尋取得屬性值](cookbooks-101-opsworks-opsworks-stack-config-search.md)。

**3：下載檔案**  
配方的第三個部分是建立 [S3 用戶端物件](https://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html) 並使用其 `[get\$1object](https://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html#get_object-instance_method)` 方法來下載 `default.htm` 到執行個體的 `C:\inetpub\wwwroot` 目錄。

**注意**  
配方是 Ruby 應用程式，因此 Ruby 程式碼不一定需要位於 `ruby_block` 中。不過，配方主體中的程式碼會先執行，接著才會執行資源。在此範例中，如果您將下載程式碼放在配方內文中，它會失敗，因為`chef_gem`資源尚未安裝適用於 Ruby 的 SDK。`ruby_block` 資源中的程式碼會在資源執行時，在`chef_gem`資源安裝適用於 Ruby 的 SDK 之後執行。

## 更新執行個體的技術指南
<a name="w2ab1c14c47c17c23c25c19"></a>

OpsWorks Stacks 會自動在新的執行個體上安裝自訂技術指南。但是因為您正在使用現有的執行個體，所以您必須手動更新技術指南。

**更新執行個體的技術指南**

1. 建立 `iis-cookbook` 的 `.zip` 存檔，並將其上傳至 S3 儲存貯體。

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

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

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

1. 針對 **Command (命令)**，選擇 [Update Custom Cookbooks (更新自訂技術指南)](workingstacks-commands.md)。此命令會在執行個體上安裝更新技術指南。

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

## 將配方新增至自訂 IIS Layer
<a name="w2ab1c14c47c17c23c25c21"></a>

如同 `install.rb` 一樣，處理部署的較佳方式是將 `deploy.rb` 指派給適當的生命週期事件。您通常會將部署配方指派至部署事件，並統稱為部署配方。將配方指派至部署事件不會觸發此事件。反之：
+ 對於新的執行個體， OpsWorks Stacks 會在設定配方完成後自動執行部署配方，因此新的執行個體會自動擁有目前的應用程式版本。
+ 針對線上執行個體，請使用[部署命令](workingapps-deploying.md)來手動安裝新的或更新應用程式。

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

**將 deploy.rb 指派給 layer 的部署事件**

1. 在導覽窗格中選擇 **Layers (Layer)**，然後在 **Layer IISExample** 下方選擇 **Recipes (配方)**。

1. 在 **Custom Chef Recipes (自訂 Chef 配方)** 下，將 **iis-cookbook::deploy** 新增至 **Deploy (部署)** 配方方塊，並選擇 **\$1** 來將配方新增至 layer。

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

## 新增應用程式
<a name="w2ab1c14c47c17c23c25c23"></a>

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

**將應用程式新增至堆疊**

1. 在導覽窗格中選擇 **Apps (應用程式)**，然後選擇 **Add an app (新增應用程式)**。

1. 使用以下設定來設定應用程式。
   + **名稱** – I**IIS-Example-App**
   + **儲存庫類型** – **其他**
   + **環境變數** – 新增下列三個環境變數：
     + **S3REGION** – 儲存貯體的區域 （在此情況下為 `us-west-1`)。
     + **BUCKET** – 儲存貯體名稱，例如 `windows-example-app`。
     + **FILENAME** – 檔案名稱：**default.htm**。

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

**注意**  
此範例使用環境變數來提供下載資料。另一種方法是使用 S3 Archive 儲存庫類型，並提供檔案的 URL。 OpsWorks Stacks 會將資訊以及選用的資料，例如您的 AWS 登入資料，新增至應用程式的 `app_source` 屬性。您的部署配方必須從應用程式屬性中取得 URL 並進行剖析，以擷取區域、儲存貯體名稱和檔案名稱。

## 部署應用程式和開啟應用程式
<a name="w2ab1c14c47c17c23c25c25"></a>

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

**部署應用程式**

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

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

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

**注意**  
Windows 應用程式一律為 **Other (其他)** 應用程式類型，因此部署應用程式會執行下列作業：  
將應用程式的資料新增至[堆疊組態和部署屬性](workingcookbook-json.md)，如前所述。
在堆疊的執行個體上觸發部署事件，該事件會執行您的自訂部署配方。

**注意**  
如需如何故障診斷故障之部署或應用程式的詳細資訊，請參閱[除錯配方](troubleshoot-debug.md)。

應用程式現在已安裝。您可以在**導覽**窗格中選擇**執行個體**，然後選擇執行個體的公有 IP 地址來開啟它。這會將 HTTP 請求傳送到執行個體，您應該會在瀏覽器中看到類似以下的內容。

![\[Text displaying "Hello World!" in large, bold font against a white background.\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/windows-iis-app.png)
