

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

# 本機封裝技術指南依存性
<a name="best-practices-packaging-cookbooks-locally"></a>

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

您可以使用 Berkshelf 在本機封裝技術指南相依性、將套件上傳至 Amazon S3，以及修改堆疊以使用 Amazon S3 上的套件做為技術指南來源。傳遞至 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)。

下列逐步解說說明如何將技術指南及其相依性預先封裝至 .zip 檔案，然後使用 .zip 檔案做為 Stacks 中 Linux OpsWorks 執行個體的技術指南來源。第一個演練說明如何封裝單一技術指南。第二個演練說明如何封裝多個技術指南。

在開始之前，請先安裝 [Chef Development Kit](https://www.chef.io/downloads) (又稱為 Chef DK)，此為由 Chef 社群建置的各種工具。您需要此項目才能使用 `chef` 命令列工具。

## 在 Chef 12 中本機封裝依存性
<a name="best-practices-packaging-cookbooks-locally-12"></a>

在 Chef 12 Linux 中，根據預設，Berkshelf 不會再安裝到堆疊執行個體。我們建議您在本機開發電腦上安裝及使用 Berkshelf，以在本機封裝您的技術指南相依性。將包含相依性的套件上傳至 Amazon S3。最後，修改您的 Chef 12 Linux 堆疊，使其使用上傳的套件做為技術指南來源。請在於 Chef 12 中封裝技術指南時注意下列差異。

1. 在本機電腦上，透過執行 `chef` 命令列工具建立技術指南。

   ```
   chef generate cookbook "server-app"
   ```

   此命令會建立技術指南、一個 Berksfile、一個 `metadata.rb` 檔案和配方目錄，並將他們置放在一個具有和技術指南相同名稱的資料夾中。以下範例顯示建立項目的結構。

   ```
   server-app <-- the cookbook you've just created
       └── Berksfile
       ├── metadata.rb
       └── recipes
   ```

1. 在文字編輯器中，編輯 Berksfile，使其指向 `server-app` 技術指南依存的技術指南。在我們的範例中，我們希望 `server-app` 依存於來自 Chef Supermarket 的 [https://supermarket.chef.io/cookbooks/java](https://supermarket.chef.io/cookbooks/java) 技術指南。我們會指定版本 1.50.0 或更新的 minor (次要) 版本，但您可以在單引號中輸入任何發佈的版本。儲存您的變更並結束檔案。

   ```
   source 'https://supermarket.chef.io'
   cookbook 'java', '~> 1.50.0'
   ```

1. 編輯 `metadata.rb` 檔案來新增依存性。儲存您的變更並結束檔案。

   ```
   depends 'java' , '~> 1.50.0'
   ```

1. 變更為 Chef 為您建立的 `server-app` 技術指南目錄，然後執行 `package` 命令建立技術指南的 `tar` 檔案。若您要封裝多個技術指南，建議您在所有技術指南存放的根目錄中執行此命令。若要封裝單一技術指南，請在技術指南目錄層級執行此命令。在此範例中，我們會在 `server-app` 目錄執行此命令。

   ```
   berks package cookbooks.tar.gz
   ```

   輸出結果與以下內容相似。`tar.gz` 檔案會在您的本機目錄內建立。

   ```
   Cookbook(s) packaged to /Users/username/tmp/berks/cookbooks.tar.gz
   ```

1. 在 中 AWS CLI，將您剛建立的套件上傳至 Amazon S3。在您上傳至 S3 後記下技術指南套件的新 URL，您在堆疊設定中將需要此 URL。

   ```
   aws s3 cp cookbooks.tar.gz s3://bucket-name/
   ```

   輸出結果與以下內容相似。

   ```
   upload: ./cookbooks.tar.gz to s3://bucket-name/cookbooks.tar.gz
   ```

1. 在 OpsWorks Stacks 中，[修改堆疊](https://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-installingcustom-enable.html)以使用您上傳做為技術指南來源的套件。

   1. 將 **Use custom Chef cookbooks (使用自訂 Chef 技術指南)** 設定設為 **Yes (是)**。

   1. 將 **Repository type (儲存庫類型)** 設定為 **S3 Archive (S3 封存)**。

   1. 在 **Repository URL (儲存庫 URL)** 中，貼上您在步驟 5 中上傳之技術指南套件的 URL。

   儲存您的堆疊變更。

## 本機封裝單一技術指南依存性
<a name="best-practices-packaging-cookbooks-locally-one"></a>

****

1. 在本機電腦上，透過使用 chef 命令列工具建立技術指南：

   ```
   chef generate cookbook "server-app"
   ```

   此命令會建立技術指南及一個 Berksfile，並將他們置放在一個具有和技術指南相同名稱的資料夾中。

1.  變更為 Chef 為您建立的技術指南目錄，然後透過執行下列命令封裝所有項目：

   ```
   berks package cookbooks.tar.gz
   ```

   輸出如下：

   ```
   Cookbook(s) packaged to /Users/username/tmp/berks/cookbooks.tar.gz
   ```

1.  在 中 AWS CLI，將您剛建立的套件上傳至 Amazon S3：

   ```
   aws s3 cp cookbooks.tar.gz s3://bucket-name/
   ```

   輸出如下：

   ```
   upload: ./cookbooks.tar.gz to s3://bucket-name/cookbooks.tar.gz
   ```

1.  在 OpsWorks Stacks 中，[修改堆疊](https://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-installingcustom-enable.html)以使用您上傳做為技術指南來源的套件。

## 本機封裝多個技術指南依存性
<a name="best-practices-packaging-cookbooks-locally-multiple"></a>

此範例會建立兩個技術指南，並為他們封裝依存性。

1.  在本機電腦上，執行下列 `chef` 命令以產生兩個技術指南：

   ```
   chef generate cookbook "server-app"
   chef generate cookbook "server-utils"
   ```

   在此範例中，server-app 技術指南會執行 Java 組態，因此我們需要新增 Java 的依存性。

1.  編輯 `server-app/metadata.rb` 以在社群 Java 技術指南上新增依存性：

   ```
   maintainer "The Authors"
   maintainer_email "you@example.com"
   license "all_rights"
   description "Installs/Configures server-app"
   long_description "Installs/Configures server-app"
   version "0.1.0"
   depends "java"
   ```

1.  透過編輯技術指南根目錄中的 Berksfile 檔案，告知 Berkshelf 要封裝的內容為何，如下所示：

   ```
   source "https://supermarket.chef.io"
   cookbook "server-app", path: "./server-app"
   cookbook "server-utils", path: "./server-utils"
   ```

   您的檔案結構現在看起來應該會像是這樣：

   ```
    .. 
       └── Berksfile
       ├── server-app
       └── server-utils
   ```

1.  最後，建立 zip 套件，將其上傳至 Amazon S3，並修改 Stacks OpsWorks 堆疊以使用新的技術指南來源。若要執行此作業，請遵循[本機封裝單一技術指南依存性](#best-practices-packaging-cookbooks-locally-one)中的步驟 2 到 4。

## 其他資源
<a name="w2ab1c14c49c17c17"></a>

如需封裝技術指南依存性的詳細資訊，請參閱下列項目。
+ AWS DevOps 部落格上的[如何使用 Berkshelf 本機封裝技術指南依存性](https://aws.amazon.com/blogs/devops/how-to-package-cookbook-dependencies-locally-with-berkshelf/)
+  OpsWorks 論壇上的 [Linux Chef 12 搭配 Berkshelf](https://forums.aws.amazon.com/thread.jspa?threadID=221131) 
+  OpsWorks 論壇[上 Chef 12 中的 Berkshelf](https://forums.aws.amazon.com/message.jspa?messageID=694464) 
+ 本指南中的[安裝自訂技術指南](workingcookbook-installingcustom-enable.md)
+ 本指南中的[技術指南儲存庫](workingcookbook-installingcustom-repo.md)