

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

# 步驟 2.3：實作自訂技術指南
<a name="gettingstarted-windows-cookbook"></a>

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

儘管堆疊基本上是執行個體的容器，但您無法直接將執行個體新增到堆疊。您將會新增一或多個 layer，每一個代表相關執行個體的群組，然後將執行個體新增至這些 layer。

layer 基本上是 Stacks OpsWorks 用來建立一組具有相同組態的 Amazon EC2 執行個體的藍圖。執行個體從基礎版本的作業系統開始，且執行個體的 layer 會在執行個體上執行各種任務來實作該藍圖，這些任務可能包括：
+ 建立目錄和檔案
+ 管理使用者
+ 安裝並設定軟體
+ 啟動或停止伺服器
+ 部署應用程式程式碼以及相關檔案。

layer 會透過執行 [Chef 配方](https://docs.chef.io/recipes.html)在執行個體上執行任務，簡稱為 配方。配方是使用 Chef 網域專用語言 (DSL) 來描述執行個體最終狀態的 Ruby 應用程式。透過 OpsWorks Stacks，每個配方通常會指派給 layer 的生命週期[事件](workingcookbook-events.md)之一：設定、組態、部署、取消部署和關機。當執行個體上發生生命週期事件時， OpsWorks Stacks 會執行事件的配方來執行適當的任務。例如，安裝事件會在執行個體完成開機後發生。 OpsWorks 堆疊接著會執行安裝配方，通常會執行安裝和設定伺服器軟體以及啟動相關服務等任務。

OpsWorks Stacks 為每個 layer 提供一組執行標準任務的內建配方。您可以實作自訂配方來執行額外任務，並將其指派到 layer 的生命週期事件，以擴展 layer 的功能。Windows 堆疊支援[自訂 layer](workinglayers-custom.md)，這些 layer 具有一組僅執行幾項基本任務的最少量配方。若要將功能新增至您的 Windows 執行個體，您必須實作自訂配方來安裝軟體、部署應用程式等等。本主題說明如何建立簡單的自訂 layer 來支援 IIS 執行個體。

**Topics**
+ [技術指南和配方的快速簡介](#gettingstarted-windows-layer-recipes)
+ [實作配方來安裝和啟動 IIS](#gettingstarted-windows-layer-recipe-iis)
+ [啟用自訂技術指南](#gettingstarted-windows-layer-enable-cookbook)

## 技術指南和配方的快速簡介
<a name="gettingstarted-windows-layer-recipes"></a>

配方定義執行個體預期狀態的一或多個 layer 面：應包含哪些目錄、應安裝哪些軟體套件、應部署哪些應用程式等等。配方封裝在「技術指南」**中，而技術指南可以包含一或多個相關配方，再加上相關檔案 (例如建立組態檔案的範本)。

本主題為配方做了基本的介紹，足以為您示範如何實作技術指南以支援簡單的自訂 IIS layer。如需技術指南一般簡介的詳細資訊，請參閱 [技術指南和配方](workingcookbook.md)。如需詳細的實作技術指南教學介紹，包括某些 Windows 特定主題，請參閱[技術指南 101](cookbooks-101.md)。

技術上而言，Chef 配方是 Ruby 應用程式，但大部分 (如非全部) 程式碼位於 Chef DSL 中。DSL 主要由一組「資源」**組成，可用於宣告性指定執行個體狀態的某一 layer 面。例如，[`directory` 資源](https://docs.chef.io/chef/resources.html#directory)會定義要新增至系統的目錄。下列範例定義一個具有完整控制權的 `C:\data` 目錄，此目錄屬於指定使用者，且不會從父目錄繼承權限。

```
directory 'C:\data' do
  rights :full_control, 'WORKGROUP\username'
  inherits false
  action :create
end
```

當 Chef 執行配方時，會透過將資料傳遞給相關聯的「提供者」**(這是處理修改執行個體狀態詳細資訊的 Ruby 物件) 來執行每項資源。在此範例中，供應者會使用指定組態來建立新目錄。

自訂 IIS layer 的自訂技術指南必須執行下列任務：
+ 安裝 IIS 功能，並開始服務。

  您通常會在完成啟動執行個體後的安裝期間執行此任務。
+ 將應用程式部署到執行個體 (此範例中為一個簡單的 HTML 頁面)。

  您通常會在設定期間執行此任務。不過，應用程式通常需要定期更新，所以您也需要在執行個體處於上線狀態時部署更新。

您可以使用單一配方來執行所有這些任務。但是，首選方法是將單獨的配方用於設定和部署任務。這樣一來，您無需執行設定程式碼，也可隨時部署應用程式更新。下列說明如何設定技術指南來支援自訂 IIS layer。後續主題將說明如何實作配方。

**開始使用**

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

1. 將具有下列內容的 `metadata.rb` 檔案新增至 `iis-cookbook`。

   ```
   name "iis-cookbook"
   version "0.1.0"
   ```

   此範例使用最少量的 `metadata.rb`。如需如何使用此檔案的詳細資訊，請參閱 [metadata.rb](https://docs.chef.io/config_rb_metadata.html)。

1. 將 `recipes` 目錄新增至 `iis-cookbook`。

   此目錄 (必須命名為 `recipes`) 包含技術指南的配方。

一般而言，技術指南可以包含各種其他目錄。例如，如果配方使用範本來建立組態檔案，範本通常會位於 `templates\default` 目錄中。此範例的技術指南完全由配方所組成，所以不需要其他目錄。此外，此範例僅使用單一技術指南，但您可以使用所需數量的技術指南；針對複雜的專案，通常使用多個技術指南會更適當。例如，針對設定和部署任務，您可以使用個別的技術指南。如需更多技術指南範例，請參閱 [技術指南和配方](workingcookbook.md)。

## 實作配方來安裝和啟動 IIS
<a name="gettingstarted-windows-layer-recipe-iis"></a>

 IIS 是一項 Windows「功能」**，是可安裝在 Windows Server 上的選用系統元件之一。您可以讓配方透過下列其中一種方法來安裝 IIS：
+ 透過使用 [https://docs.chef.io/chef/resources.html#powershell-script](https://docs.chef.io/chef/resources.html#powershell-script) 資源，來執行 [https://docs.microsoft.com/en-us/powershell/module/servermanager/install-windowsfeature?view=winserver2012-ps](https://docs.microsoft.com/en-us/powershell/module/servermanager/install-windowsfeature?view=winserver2012-ps) cmdlet。
+ 透過使用 Chef [ Windows 技術指南](https://github.com/opscode-cookbooks/windows)的 `windows_feature` 資源。

  `windows` 技術指南包含一組資源，這些資源的供應者使用[部署映像服務和管理](https://technet.microsoft.com/en-us/library/dd744256%28v=ws.10%29.aspx) (DISM) 在 Windows 執行個體上執行各種任務，包括功能安裝。

**注意**  
`powershell_script` 位於 Windows 配方的最有用資源之間。您可使用其透過執行適當的 PowerShell 指令碼或 cmdlet 在執行個體上執行各種任務。尤其適用於不受 Chef 資源支援的任務。

此範例使用 PowerShell 指令碼來安裝和啟動 Web Server (IIS)。下文將介紹 `windows` 技術指南。如需如何使用 `windows_feature` 來安裝 IIS 的範例，請參閱 [安裝 Windows 功能：IIS](cookbooks-101-opsworks-install-software-feature.md)

將下列內容和名為 `install.rb` 的配方新增至技術指南的 `recipes` 目錄。

```
powershell_script 'Install IIS' do
  code 'Install-WindowsFeature Web-Server'
  not_if "(Get-WindowsFeature -Name Web-Server).Installed"
end

service 'w3svc' do
  action [:start, :enable]
end
```

此配方包含兩種資源。

**powershell\$1script**  
`powershell_script` 執行指定的 PowerShell 指令碼或 cmdlet。此範例具有下列屬性設定：  
+ `code` – 要執行的 PowerShell cmdlet。

  此範例執行 `Install-WindowsFeature` cmdlet，這會安裝 Web 伺服器 (IIS)。一般而言，`code` 屬性可以具有任意數目的行，因此您可以執行所需數量的 cmdlet。
+ `not-if` – [確保配方僅在尚未安裝 IIS 時才安裝的*防護屬性*](https://docs.chef.io/chef/resources.html#guards)。

  您通常會希望配方是「等冪」**，因此配方不會浪費時間重複執行相同的任務。
每個資源都有一個動作，指定提供者要採取的動作。在此範例中沒有明確的動作，因此供應者會採取預設 `:run` 動作，該動作會執行指定 PowerShell 指令碼。如需詳細資訊，請參閱[執行 Windows PowerShell 指令碼](cookbooks-101-opsworks-opsworks-powershell.md)。

**服務**  
一個 [https://docs.chef.io/chef/resources.html#service](https://docs.chef.io/chef/resources.html#service) 管理一項服務，在此範例中為 Web Server IIS 服務 (W3SVC)。此範例使用預設屬性並指定 `:start` 與 `:enable` 這兩個動作來啟動和啟用 IIS。

**注意**  
如果您希望安裝使用套件安裝程式的軟體 (例如 MSI)，您可以使用 `windows_package` 資源。如需詳細資訊，請參閱[安裝套件](cookbooks-101-opsworks-install-software-package.md)。

## 啟用自訂技術指南
<a name="gettingstarted-windows-layer-enable-cookbook"></a>

OpsWorks Stacks 會在每個執行個體上從本機快取執行配方。若要執行您的自訂配方，您必須執行下列作業：
+ 將技術指南存放在遠端儲存庫中。

  OpsWorks Stacks 會將技術指南從此儲存庫下載到每個執行個體的本機快取。
+ 編輯堆疊以啟用自訂技術指南。

  自訂技術指南預設為停用，所以您必須為堆疊啟用自訂技術指南，並提供儲存庫的 URL 和相關資訊。

OpsWorks Stacks 支援自訂技術指南的 S3 封存和 Git 儲存庫；此範例使用 S3 封存。如需詳細資訊，請參閱[技術指南儲存庫](workingcookbook-installingcustom-repo.md)。

**使用 S3 封存**

1. 建立 `iis-cookbook` 目錄的 `.zip` 存檔。

   OpsWorks Stacks 也支援 Windows 堆疊的 `.tgz`(gzip 壓縮 tar) 封存。

1. 將封存上傳至美國西部 （加利佛尼亞北部） 區域的 S3 儲存貯體，並將檔案設為公有。您也可以使用私有 S3 封存，但在這個範例中公有封存已足夠，且使用起來更簡單。

   1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) 的 Amazon S3 主控台。

   1. 如果您在 中還沒有儲存貯體`us-west-1`，請選擇**建立儲存貯**體，並在美國西部 （加利佛尼亞北部） 區域中建立儲存貯體。

   1. 在儲存貯體清單中，選擇您要上傳檔案的儲存貯體名稱，然後選擇 **Upload (上傳)**。

   1. 選擇 **Add Files (新增檔案)**。

   1. 選取要上傳的存檔，然後選擇 **Open (開啟)**。

   1. 在 **Upload - Select Files and Folders (上傳 - 選取檔案與資料夾)** 對話方塊的底部，選擇 **Set Details (設定詳細資訊)**。

   1. 在 **Set Details (設定詳細資訊)** 對話方塊中，選擇 **Set Permissions (設定許可)**。

   1. 在 **Set Permissions (設定許可)** 對話方塊中，選擇 **Make everything public (公開所有項目)**。

   1. 在 **Set Permissions (設定許可)** 對話方塊中，選擇 **Start Upload (開始上傳)**。上傳完成時，`iis-cookbook.zip` 檔案會出現在您的儲存貯體中。

   1. 選擇儲存貯體，然後選擇儲存貯體的 **Properties (屬性)** 標籤。在 **Link (連結)** 旁，記錄封存檔案的 URL 以供日後使用。

   如需將檔案上傳至 Amazon S3 儲存貯體的詳細資訊，請參閱《Amazon [ S3 主控台使用者指南》中的如何將檔案和資料夾上傳至 S3 儲存貯體？](https://docs.aws.amazon.com/AmazonS3/latest/UG/UploadingObjectsintoAmazonS3.html)。 *Amazon S3 *

**重要**  
到目前為止，本演練只需您稍微花一點時間； OpsWorks Stacks 服務本身是免費的。不過，您必須支付您使用的任何 AWS 資源，例如 Amazon S3 儲存體。一旦您上傳封存，即會開始產生費用。如需詳細資訊，請參閱 [AWS 定價](https://aws.amazon.com/pricing/)。

**為堆疊啟用自訂技術指南。**

1. 在 OpsWorks Stacks 主控台的導覽窗格中，選擇 **Stack**，然後選擇右上角的**堆疊設定**。

1. 在 **Settings (設定)** 頁面的右上角，選擇 **Edit (編輯)**。

1. 在 **Settings (設定)** 頁面上，將 **Use custom Chef cookbooks (使用自訂 Chef 技術指南)** 設定為 **Yes (是)** 然後輸入下列資訊：
   + 儲存庫類型 – **S3 Archive**。
   + 儲存庫 URL – 您先前記錄之技術指南封存檔案的 S3 URL。

1. 選擇 **Save (儲存)** 來更新堆疊組態。

OpsWorks Stacks 會在所有新的執行個體上安裝您的自訂技術指南。請注意， OpsWorks Stacks 不會自動在線上執行個體上安裝或更新自訂技術指南。您可以手動執行此作業，如下所述。