

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

# 步驟 3：建立和部署自訂技術指南
<a name="other-services-redis-cookbook"></a>

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

目前堆疊還沒有什麼功能。您必須啟用您的應用程式，才能存取 Redis 伺服器。最靈活的方式便是在應用程式的 `config` 子資料夾中置放一個帶有存取資訊的 YAML 檔案。應用程式接著便能從檔案取得資訊。使用此方法，您可以變更連線資訊，無需重新撰寫和重新部署應用程式。在此範例中，檔案應該命名`redis.yml`並包含 ElastiCache 叢集的主機名稱和連接埠，如下所示：

```
host: cache-cluster-hostname
port: cache-cluster-port
```

您可以手動將此檔案複製到伺服器，但更好的方法是實作 Chef *配方*來產生檔案，並讓 OpsWorks Stacks 在每個伺服器上執行配方。Chef 配方是專門的 Ruby 應用程式，由 OpsWorks Stacks 用來在執行個體上執行任務，例如安裝套件或建立組態檔案。配方是封裝在「技術指南」**中，而技術指南可以包含多個配方和相關檔案 (例如組態檔案的範本)。技術指南會放置於儲存庫 (例如 GitHub) 中，且必須擁有標準目錄結構。如果您還沒有自訂技術指南儲存庫，請參閱[技術指南儲存庫](workingcookbook-installingcustom-repo.md)，以取得如何設定技術指南的資訊。

針對此範例，請將名為 `redis-config` 的技術指南新增至您的技術指南儲存庫，其內容如下：

```
my_cookbook_repository
  redis-config
    recipes
      generate.rb
    templates
      default
        redis.yml.erb
```

`recipes` 資料夾包含名為 `generate.rb` 的配方，該配方會從 `redis.yml.erb` 產生應用程式的組態檔案，如下所示：

```
node[:deploy].each do |app_name, deploy_config|
  # determine root folder of new app deployment
  app_root = "#{deploy_config[:deploy_to]}/current"

  # use template 'redis.yml.erb' to generate 'config/redis.yml'
  template "#{app_root}/config/redis.yml" do
    source "redis.yml.erb"
    cookbook "redis-config"

    # set mode, group and owner of generated file
    mode "0660"
    group deploy_config[:group]
    owner deploy_config[:user]

    # define variable “@redis” to be used in the ERB template
    variables(
      :redis => deploy_config[:redis] || {}
    )

    # only generate a file if there is Redis configuration
    not_if do
      deploy_config[:redis].blank?
    end
  end
end
```

配方取決於 Stacks OpsWorks [堆疊組態和部署 JSON](workingcookbook-json.md) 物件的資料，這些物件會安裝在每個執行個體上，並包含堆疊和任何部署應用程式的詳細資訊。物件的 `deploy` 節點具有以下結構：

```
{
   ...
  "deploy": {
    "app1": {
      "application" : "short_name",
      ...
    }
    "app2": {
      ...
    }
    ...
  }
}
```

deploy 節點包含每個部署應用程式 (以應用程式的短名命名) 的一組內嵌 JSON 物件。每個應用程式物件都包含一組定義應用程式組態的屬性，例如文件根和應用程式類型。如需部署屬性的清單，請參閱[deploy 屬性](attributes-json-deploy.md)。配方可使用 Chef 屬性語法來表示堆疊組態及部署 JSON 的。例如：`[:deploy][:app1][:application]` 表示 app1 應用程式的短名。

針對 `[:deploy]` 中的每個應用程式，配方會執行關聯的程式碼區塊，其中 `deploy_config` 表示應用程式屬性。第一個配方會將 `app_root` 設為應用程式的根目錄，`[:deploy][:app_name][:deploy_to]/current`。它接著會使用 Chef [範本資源](https://docs.chef.io/chef/resources.html#template)從 `redis.yml.erb` 產生組態檔案，然後將其置放於 `app_root/config` 中。

 組態檔案通常會從範本建立，其中許多設定都由 Chef「屬性」**定義。使用屬性，您可以於稍後使用自訂 JSON 變更設定，而無須重新撰寫範本檔案。`redis.yml.erb` 範本包含下列項目：

```
host: <%= @redis[:host] %>
port: <%= @redis[:port] || 6379 %>
```

<%... %> 元素為代表屬性值的預留位置。
+ `<%= @redis[:host] %>` 表示 `redis[:host]` 的值，也就是快取叢集的主機名稱。
+ `<%= @redis[:port] || 6379 %>` 表示 `redis[:port]` 的值或預設連接埠值 6379 (若屬性尚未定義的話)。

`template` 資源的運作方式如下：
+ `source` 和 `cookbook` 分別指定範本和技術指南名稱。
+ `mode`、`group` 和 `owner` 會給予組態檔案與應用程式相同的存取權。
+ `variables` 區段會將範本中使用的 `@redis` 變數設為應用程式的 `[:redis]` 屬性值。

  `[:redis]` 屬性值是透過使用自訂 JSON 來設定，如稍後所述。它並非標準應用程式屬性之一。
+ `not_if` 指示詞會確保配方不會在已有現有檔案時再次產生組態檔案。

在您撰寫技術指南之後，您必須將其部署至每個執行個體的技術指南快取。此操作不會執行配方。它只會將新的技術指南安裝到堆疊的執行個體上。您通常會藉由將其指派給 layer 的生命週期事件來執行配方，如稍後所述。

**部署您的自訂技術指南**

1. 在 OpsWorks 堆疊**堆疊**頁面上，按一下**堆疊設定**，然後按一下**編輯**。

1. 在 **Configuration Management (組態管理)** 區段中，將 **Use custom Chef cookbooks (使用自訂 Chef 技術指南)** 設為 **Yes (是)**，輸入技術指南儲存庫資訊，然後按一下 **Save (儲存)** 以更新堆疊組態。  
![\[Configuration form for custom Chef cookbooks with repository details and options.\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/redis_walkthrough_cookbook.png)

1. 在 **Stack (堆疊)** 頁面中，按一下 **Run Command (執行命令)**，選取 **Update Custom Cookbooks (更新自訂技術指南)** 堆疊命令，然後按一下 **Update Custom Cookbooks (更新自訂技術指南)** 以將新的技術指南安裝到執行個體的技術指南快取中。  
![\[Run Command interface showing Update Custom Cookbooks option and instance selection for Rails App Server.\]](http://docs.aws.amazon.com/zh_tw/opsworks/latest/userguide/images/redis_walkthrough_command.png)

若您修改您的技術指南，只須再次執行 **Update Custom Cookbooks (更新自訂技術指南)** 即可安裝更新後的版本。如需此程序的詳細資訊，請參閱[安裝自訂技術指南](workingcookbook-installingcustom-enable.md)。