

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

# 擴充 Layer
<a name="workingcookbook-extend"></a>

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

針對透過修改 OpsWorks Stacks 屬性或自訂範本處理的項目以外的項目，您有時需要自訂內建 layer。例如，假設您需要建立符號連結、設定檔案或資料夾模式、安裝額外的套件，以此類推。您必須擴充自訂 layer，以提供高於最少功能的功能。在該情況下，您需要實作一或多個具有配方的自訂技術指南來處理自訂任務。本主題提供如何使用配方來擴充 layer 的一些範例。

如果您是第一次使用 Chef，建議您先閱讀[技術指南 101](cookbooks-101.md)，該教學介紹如何實作技術指南以執行各種常見任務的基本概念。如需如何實作自訂 layer 的詳細範例，請參閱[建立自訂 Tomcat 伺服器 Layer](create-custom.md)。

**Topics**
+ [

# 使用配方執行指令碼
](workingcookbook-extend-scripts.md)
+ [

# 使用 Chef 部署勾點
](workingcookbook-extend-hooks.md)
+ [

# 在 Linux 執行個體上執行 Cron 任務
](workingcookbook-extend-cron.md)
+ [

# 在 Linux 執行個體上安裝和設定套件
](workingcookbook-extend-package.md)

# 使用配方執行指令碼
<a name="workingcookbook-extend-scripts"></a>

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

如果您的現有指令碼執行所需的自訂任務，則擴充 layer 的最簡單方式實作通常是實作簡單配方來執行指令碼。您接著可以將配方指派給適當的生命週期事件 (一般是安裝或部署)，或使用 `execute_recipes` 堆疊命令手動執行配方。

下列範例會在 Linux 執行個體上執行 Shell 指令碼，但您可以將相同的方式用於其他類型的指令碼 (包括 Windows PowerShell 指令碼)。

```
cookbook_file "/tmp/lib-installer.sh" do
  source "lib-installer.sh"
  mode 0755
end

execute "install my lib" do
  command "sh /tmp/lib-installer.sh"
end
```

`cookbook_file` 資源代表存放在技術指南 `files` 目錄之子目錄中的檔案，並將檔案傳輸至執行個體上的指定位置。此範例會將 Shell 指令碼 `lib-installer.sh` 傳輸至執行個體的 `/tmp` 目錄，並將檔案的模式設定為 `0755`。如需詳細資訊，請參閱 [cookbook\$1file](https://docs.chef.io/chef/resources.html#cookbook-file)。

`execute` 資源代表命令 (如 Shell 命令)。此範例執行 `lib-installer.sh`。如需詳細資訊，請參閱 [execute](https://docs.chef.io/chef/resources.html#execute)。

您也可以將指令碼併入配方來執行指令碼。下列範例會執行 bash 指令碼，但 Chef 也支援 Csh、Perl、Python 和 Ruby。

```
script "install_something" do
  interpreter "bash"
  user "root"
  cwd "/tmp"
  code <<-EOH
    #insert bash script
  EOH
end
```

`script` 資源代表指令碼。此範例指定 bash 解譯器、將使用者設定為 `"root"`，並將工作目錄設定為 `/tmp`。它接著會執行 `code` 區塊中的 bash 指令碼，可視需要包括多行。如需詳細資訊，請參閱 [script](https://docs.chef.io/chef/resources.html#script)。

如需如何使用配方執行指令碼的詳細資訊，請參閱[範例 7：執行命令和指令碼](cookbooks-101-basics-commands.md)。如需如何在 Windows 執行個體上執行 PowerShell 指令碼的範例，請參閱[執行 Windows PowerShell 指令碼](cookbooks-101-opsworks-opsworks-powershell.md)。

# 使用 Chef 部署勾點
<a name="workingcookbook-extend-hooks"></a>

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

部署的自訂方式是實作自訂配方來執行所需任務，並將它指派給適當 layer 的部署事件。替代且有時更簡單的方法，特別是當您不需要實作技術指南用於其他用途時，就是使用 Chef 部署勾點來執行自訂程式碼。此外，自訂部署配方會在內建配方已執行部署之後執行。部署勾點可讓您在部署期間互動，例如，從儲存庫簽出應用程式碼之後，但在重新啟動 Apache 之前。

Chef 會以四個階段部署應用程式：
+ **結帳** – 從儲存庫下載檔案
+ **Migrate** – 視需要執行遷移
+ **Symlink** – 建立符號連結
+ **重新啟動** – 重新啟動應用程式

Chef 部署勾點提供一種簡單的方法，選擇性地在每個階段完成之後執行使用者所提供的 Ruby 應用程式來自訂部署。若要使用部署勾點，請實作一或多個 Ruby 應用程式，並將它們放入您應用程式的 `/deploy` 目錄中 (如果您的應用程式沒有 `/deploy` 目錄，則請在 `APP_ROOT` 層級建立該目錄)。應用程式必須具有下列其中一個名稱，以決定其何時執行。
+ `before_migrate.rb` 是在 Checkout (簽出) 階段完成之後但在 Migrate (遷移) 之前執行。
+ `before_symlink.rb` 是在 Migrate (遷移) 階段完成之後但在 Symlink (符號連結) 之前執行。
+ `before_restart.rb` 是在 Symlink (符號連結) 階段完成之後但在 Restart (重新啟動) 之前執行。
+ `after_restart.rb` 是在 Restart (重新啟動) 階段完成之後執行。

Chef 部署勾點使用標準節點語法，即可存取節點物件，就像配方一樣。部署勾點也可以存取您所指定之任何[應用程式環境變數](workingapps-creating.md#workingapps-creating-environment)的值。不過，您必須使用 `new_resource.environment["VARIABLE_NAME"] ` 存取變數的值，而不是 `ENV["VARIABLE_NAME"]`。

# 在 Linux 執行個體上執行 Cron 任務
<a name="workingcookbook-extend-cron"></a>

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

Linux Cron 任務會指示 Cron 協助程式依指定的排程執行一或多個命令。例如，假設您的堆疊支援 PHP 電子商務應用程式。您可以設定 cron 任務，讓伺服器在每週的指定時間將銷售報告傳送給您。如需 cron 的詳細資訊，請參閱 Wikipedia 上的 [cron](http://en.wikipedia.org/wiki/Cron)。如需如何直接在 Linux 電腦或執行個體上執行 cron 任務的詳細資訊，請參閱 Indiana University 知識庫網站上的 [What are cron and crontab, and how do I use them? (什麼是 cron 和 crontab 以及如何使用它們？)](https://kb.iu.edu/d/afiz)。

雖然您可以使用 SSH 連線 `cron` 任務並編輯其 `crontab` 項目以在個別 Linux 執行個體上手動設定它們，但是 OpsWorks Stacks 的主要優點是您可以指示它跨整 layer 的執行個體執行任務。下列程序說明如何在 PHP App Server layer 的執行個體上設定`cron`任務，但您可以將相同的方法與任何 layer 搭配使用。

**若要在 layer 執行個體上設定 `cron` 任務**

1. 實作配方具有已設定任務之 `cron` 資源的技術指南。此範例假設配方命名為 `cronjob.rb`；稍後會說明實作詳細資訊。如需技術指南和配方的詳細資訊，請參閱[技術指南和配方](workingcookbook.md)。

1. 在您的堆疊上安裝技術指南。如需詳細資訊，請參閱[安裝自訂技術指南](workingcookbook-installingcustom-enable.md)。

1. 讓 OpsWorks Stacks 透過將配方指派給下列生命週期事件，在 layer 的執行個體上自動執行配方。如需詳細資訊，請參閱[自動執行配方](workingcookbook-assigningcustom.md)。
   + **設定** – 指派給`cronjob.rb`此事件會指示 OpsWorks Stacks 在所有新執行個體上執行配方。
   + **部署** – 當您將應用程式部署或重新部署至 layer 時，指派`cronjob.rb`至此事件會指示 OpsWorks Stacks 在所有線上執行個體上執行配方。

   您也可以使用 `Execute Recipes` 堆疊命令手動在線上執行個體上執行配方。如需詳細資訊，請參閱[執行堆疊命令](workingstacks-commands.md)。

以下是 `cronjob.rb` 範例，可設定 Cron 任務一週一次執行使用者實作的 PHP 應用程式，以從伺服器收集銷售資料，並透過郵件傳送報告。如需如何使用 cron 資源的更多範例，請參閱 [cron](https://docs.chef.io/chef/resources.html#cron)。

```
cron "job_name" do
  hour "1"
  minute "10"
  weekday "6"
  command "cd /srv/www/myapp/current && php .lib/mailing.php"
end
```

`cron` 是代表 `cron` 任務的 Chef 資源。當 OpsWorks Stacks 在執行個體上執行配方時，相關聯的提供者會處理設定任務的詳細資訊。
+ `job_name` 是 `cron` 任務的使用者定義名稱，例如 `weekly report`。
+ `hour`/`minute`/`weekday` 指定何時應該執行命令。此範例會在每週六的上午 1:10 執行命令。
+ `command` 指定要執行的命令。

  此範例執行兩個命令。第一個導覽至 `/srv/www/myapp/current` 目錄。第二個執行使用者實作的 `mailing.php` 應用程式，以收集銷售資料並傳送報告。

**注意**  
`bundle` 命令預設不會與 `cron` 任務搭配運作。原因是 OpsWorks Stacks 在 `/usr/local/bin`目錄中安裝 Bundler。若要搭配使用 `bundle` 與 `cron` 任務，您必須將路徑 `/usr/local/bin` 明確地新增至 Cron 任務。此外，因為 \$1PATH 環境變數可能不會在 `cron` 任務中擴展，所以最佳實務是將任何必要的路徑資訊明確地新增至任務，而不依賴擴展 \$1PATH 變數。下列範例顯示兩種在 `cron` 任務中使用 `bundle` 的方式。  

```
cron "my first task" do
  path "/usr/local/bin"
  minute "*/10"
  command "cd /srv/www/myapp/current && bundle exec my_command"
end
```

```
cron_env = {"PATH" => "/usr/local/bin"}
cron "my second task" do
  environment cron_env
  minute "*/10"
  command "cd /srv/www/myapp/current && /usr/local/bin/bundle exec my_command"
end
```

如果您的堆疊有多個應用程式伺服器，`cronjob.rb`則指派給 PHP App Server layer 的生命週期事件可能不是理想的方法。例如，配方會在 layer 的所有執行個體上執行，因此您會收到多份報告。較佳的方式是使用自訂 layer，確保只有一部伺服器傳送報告。

**只在 layer 的其中一個執行個體上執行配方**

1. 建立自訂 layer (例如稱為 PHPAdmin)，並將 `cronjob.rb` 指派給其安裝和部署事件。自訂 layer 不一定需要執行很多操作。在此情況下，PHPAdmin 只會在其執行個體上執行一個自訂配方。

1. 將其中一個 PHP App Server 執行個體指派給 AdminLayer。如果執行個體屬於多個 layer， OpsWorks Stacks 會執行每個 layer 的內建和自訂配方。

由於只有一個執行個體屬於 PHP App Server 和 PHPAdmin layer，因此 `cronjob.rb`只會在該執行個體上執行，而且您只會收到一個報告。

# 在 Linux 執行個體上安裝和設定套件
<a name="workingcookbook-extend-package"></a>

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

內建 layer 只支援特定套件。如需詳細資訊，請參閱[層](workinglayers.md)。您可以安裝其他套件 (例如 Redis 伺服器)，方法是實作自訂配方來處理相關的安裝、組態和部署任務。在某些情況下，最佳方式是擴充內建 layer，讓它在其執行個體上安裝套件以及 layer 的標準套件。例如，如果您的堆疊支援 PHP 應用程式，而且您想要包含 Redis 伺服器，則除了 PHP 應用程式伺服器之外，您還可以擴展 PHP App Server layer 在 layer 的執行個體上安裝和設定 Redis 伺服器。

套件安裝配方一般需要執行任務，如下所示：
+ 建立一或多個目錄，並設定其模式。
+ 從範本建立組態檔案。
+ 在執行個體上執行安裝程式來安裝套件。
+ 啟動一或多個服務。

如需如何安裝 Tomcat 伺服器的範例，請參閱[建立自訂 Tomcat 伺服器 Layer](create-custom.md)。本主題說明如何設定自訂 Redis layer，但您可以使用更多相同的程式碼，以在內建 layer 上安裝和設定 Redis。如需如何安裝其他套件的範例，請參閱內建技術指南，網址為 https：//[https://github.com/aws/opsworks-cookbooks](https://github.com/aws/opsworks-cookbooks)。