

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

# 覆寫內建屬性
<a name="cookbooks-101-opsworks-attributes"></a>

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

**注意**  
本主題僅適用於 Linux 堆疊。您無法在 Windows 堆疊上覆寫內建屬性。

OpsWorks Stacks 會在每個執行個體上安裝一組內建技術指南。許多內建技術指南都支援內建 layer，而且其屬性檔案定義各種預設系統和應用程式設定 (例如 Apache 伺服器組態設定)。將這些設定放在屬性檔案中，即可使用下列方式覆寫對應內建屬性來自訂許多組態設定：
+ 使用自訂 JSON 定義屬性。

  此方式的優點是簡單並具彈性。不過，您必須手動輸入自訂 JSON，因此沒有健全的方法可以管理屬性定義。
+ 實作自訂技術指南，並在 `customize.rb` 屬性檔案中定義屬性。

  此方式比使用自訂 JSON 更不具彈性，但是更為健全，因為您可以將自訂技術指南放在來源控制之下。

本主題說明如何使用自訂技術指南屬性檔案覆寫內建屬性，並使用 Apache 伺服器做為範例。如需如何覆寫具有自訂 JSON 之屬性的詳細資訊，請參閱 [使用自訂 JSON](workingcookbook-json-override.md)。如需如何覆寫屬性的一般討論，請參閱[覆寫屬性](workingcookbook-attributes.md)。

**注意**  
偏好使用覆寫屬性來自訂組態設定，但不會一律透過屬性呈現設定。在該情況下，您通常可以覆寫內建配方用來建立組態檔案的範本，來自訂組態檔案。如需範例，請參閱 [覆寫內建範本](cookbooks-101-opsworks-templates.md)。

內建屬性通常代表範本檔案中安裝配方用來建立組態檔案的值。例如，其中一個 `apache2` 安裝配方 [https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/recipes/default.rb](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/recipes/default.rb) 使用 [https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/templates/default/apache2.conf.erb](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/templates/default/apache2.conf.erb) 範本來建立 Apache 伺服器的主要組態檔案 `httpd.conf` (Amazon Linux) 或 `apache2.conf` (Ubuntu)。以下是範例檔案中的摘錄：

```
...
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests <%= node[:apache][:keepaliverequests] %>
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout <%= node[:apache][:keepalivetimeout] %>
##
## Server-Pool Size Regulation (MPM specific)
##

...
```

此範例中的 `KeepAliveTimeout` 設定是 `[:apache][:keepalivetimeout]` 屬性的值。此屬性的預設值定義於 `apache2` 技術指南的 [https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/attributes/apache.rb](https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/apache2/attributes/apache.rb) 屬性檔案，如下列摘錄所示：

```
...
# General settings
default[:apache][:listen_ports] = [ '80','443' ]
default[:apache][:contact] = 'ops@example.com'
default[:apache][:log_level] = 'info'
default[:apache][:timeout] = 120
default[:apache][:keepalive] = 'Off'
default[:apache][:keepaliverequests] = 100
default[:apache][:keepalivetimeout] = 3
...
```

**注意**  
如需常用內建屬性的詳細資訊，請參閱[內建技術指南屬性](attributes-recipes.md)。

若要支援覆寫內建屬性，所有內建技術指南都會包含 `customize.rb` 屬性檔案，而此屬性檔案透過 `include_attribute` 指令併入所有模組中。內建技術指南的 `customize.rb` 檔案未包含任何屬性定義，而且不會影響內建屬性。若要覆寫內建屬性，您可以建立與內建技術指南同名的自訂技術指南，並將自訂屬性定義放入也命名為 `customize.rb` 的屬性檔案中。該檔案的優先順序高於內建版本，並包含在任何相關模組中。如果您在 `customize.rb` 中定義任何內建屬性，則它們會覆寫對應的內建屬性。

此範例顯示如何覆寫內建 `[:apache][:keepalivetimeout]` 屬性，以將其值設定為 5，而非 3。您可以將類似的方式用於任何內建屬性。不過，請注意您覆寫哪些屬性。例如，`opsworks` 命名空間中的覆寫屬性可能會導致一些內建配方的問題。

**重要**  
請不要修改內建屬性檔案的複本本身來覆寫內建屬性。例如，您「可以」**將 `apache.rb` 的複本放入您自訂技術指南的 `apache2/attributes` 資料夾，並修改它的一些設定。不過，此檔案的優先順序高於內建版本，而內建配方現在會使用您的 `apache.rb` 版本。如果 OpsWorks Stacks 稍後修改內建`apache.rb`檔案，除非您手動更新版本，否則配方將不會取得新值。透過使用 `customize.rb`，您只會覆寫指定的屬性；內建配方會持續自動取得每個尚未覆寫之屬性的最新值。

若要開始，請建立自訂技術指南。

**建立技術指南**

1. 在 `opsworks_cookbooks` 目錄內，建立並導覽至名為 `apache2` 的技術指南目錄。

   若要覆寫內建屬性，自訂技術指南必須與內建技術指南同名，在此範例中為 `apache2`。

1. 在 `apache2` 目錄中，建立 `attributes` 目錄。

1. 將名為 `customize.rb` 的檔案新增至 `attributes` 目錄，並使用它來定義您想要覆寫的內建技術指南屬性。在此範例中，檔案應該包含下列項目：

   ```
   normal[:apache][:keepalivetimeout] = 5
   ```
**重要**  
若要覆寫內建屬性，自訂屬性必須是 `normal` 類型或以上類型，並且具有與對應內建屬性完全相同的節點名稱。`normal` 類型確保自訂屬性的優先順序高於內建屬性，即所有 `default` 類型。如需詳細資訊，請參閱[屬性優先順序](workingcookbook-attributes-precedence.md)。

1. 建立`opsworks_cookbooks`名為 的`.zip`封存，`opsworks_cookbooks.zip`並將封存上傳至 Amazon Simple Storage Service (Amazon S3) 儲存貯體。為求簡化，請[將檔案設為公有](https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingPermissionsonanObject.html)。記錄 URL，供日後使用。您也可以將技術指南存放在私有 Amazon S3 封存或其他儲存庫類型中。如需詳細資訊，請參閱[技術指南儲存庫](workingcookbook-installingcustom-repo.md)。

   傳遞至 Amazon S3 儲存貯體的內容可能包含客戶內容。如需移除敏感資料的詳細資訊，請參閱[如何清空 S3 儲存貯體？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)或[如何刪除 S3 儲存貯體？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)。

若要使用自訂屬性，請建立堆疊，並安裝技術指南。

**使用自訂屬性**

1. 開啟 [OpsWorks Stacks 主控台](https://console.aws.amazon.com/opsworks/)，然後選擇 **Add Stack (新增堆疊)**。

1. 指定下列標準設定。
   + **名稱** – ApacheConfig
   + **區域** – 美國西部 （奧勒岡）

     您可以將堆疊放在任何區域，但我們建議美國西部 （奧勒岡） 進行教學課程。
   + **預設 SSH 金鑰** – EC2 金鑰對

     如果您需要建立 EC2 金鑰對，請參閱 [Amazon EC2 金鑰對](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。請注意，金鑰對必須屬於與堆疊相同的 AWS 區域。

   選擇 **Advanced>> (進階>>)**，並將 **Use custom Chef cookbooks (使用自訂 Chef 技術指南)** 設定為 **Yes (是)**，然後指定下列設定。
   + **儲存庫類型** – **Http Archive**
   + **儲存庫 URL** – 您先前記錄的技術指南封存的 URL

   接受其他設定的預設值，然後選擇 **Add Stack (新增堆疊)** 來建立堆疊。
**注意**  
此範例使用預設作業系統：Amazon Linux。如果您想要，可以使用 Ubuntu。唯一的差異是，在 Ubuntu 系統上，內建安裝配方會產生具有相同設定且名為 `apache2.conf` 的組態檔案，並將它放入 `/etc/apache2` 目錄中。

1. 選擇**新增 layer**，然後將具有預設設定的 [Java App Server layer 新增至](layers-java.md)堆疊。

1. [新增全年無休執行個體](workinginstances-add.md) (具有預設設定) 至 layer，然後啟動執行個體。

   在此範例中，t2.micro 執行個體就已足夠。

1. 執行個體上線之後，請[使用 SSH 連線至它](workinginstances-ssh.md)。`httpd.conf` 檔案位在 `/etc/httpd/conf` 目錄中。如果您檢查檔案，則應該會看到您的自訂 `KeepAliveTimeout` 設定。這些設定的其餘部分將會有內建 `apache.rb` 檔案中的預設值。`httpd.conf` 的相關部分應該看起來與下列類似：

   ```
   ...
   #
   # KeepAliveTimeout: Number of seconds to wait for the next request from the
   # same client on the same connection.
   #
   KeepAliveTimeout 5
   ...
   ```