

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

# 簡短分類：技術指南、配方和 OpsWorks Stacks 屬性
<a name="gettingstarted-db-recipes"></a>

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

您現在有應用程式和資料庫伺服器，但它們還不能使用。您仍然需要設定資料庫並設定應用程式的連線設定。 OpsWorks Stacks 不會自動處理這些任務，但支援 Chef 技術指南、配方和動態屬性。您可以實作一對配方，一個用於設定資料庫，另一個用於設定應用程式的連線設定，並讓 OpsWorks Stacks 為您執行它們。

包含必要配方的 phpapp 技術指南已實作可供使用，如果想要，您可以直接跳到[步驟 3.3：將自訂技術指南新增至 MyStack](gettingstarted-db-cookbooks.md)。如果想知道更多，本節會提供一些有關技術指南和配方的背景，說明配方的運作方式。若要查看技術指南本身，請參閱 [phpapp 技術指南](https://github.com/amazonwebservices/opsworks-example-cookbooks/tree/master/phpapp)。

**Topics**
+ [配方和屬性](#gettingstarted-db-recipes-attributes)
+ [設定資料庫](#gettingstarted-db-recipes-dbsetup)
+ [將應用程式連線到資料庫](#gettingstarted-db-recipes-appsetup)

## 配方和屬性
<a name="gettingstarted-db-recipes-attributes"></a>

Chef 配方基本上是專門在執行個體上執行任務 (例如安裝套件、建立組態檔案、執行 shell 命令等等) 的 Ruby 應用程式。相關配方的群組會組織成「技術指南」**，其也包含支援的檔案，例如建立組態檔案的範本。

OpsWorks Stacks 有一組支援內建 layer 的技術指南。您也可以使用自己的配方建立自訂技術指南，在您的執行個體上執行自訂任務。本主題提供配方的簡介，並示範如何使用它們設定資料庫以及設定應用程式的連線設定。如需技術指南和配方的詳細資訊，請參閱[技術指南和配方](workingcookbook.md)或[自訂 OpsWorks Stacks](customizing.md)。

配方通常取決於輸入資料的 Chef「屬性」**：
+ 這些屬性有部分由 Chef 定義，提供執行個體的基本資訊，例如作業系統。
+ OpsWorks Stacks 會定義一組屬性，其中包含堆疊的相關資訊，例如 layer 組態，以及已部署應用程式的相關資訊，例如應用程式儲存庫。

  您可以將[自訂 JSON](workingstacks-json.md) 指派給堆疊或部署，將自訂的屬性新增至此集合。
+ 您的技術指南也可以定義技術指南專用的屬性。

  phpapp 技術指南屬性在 `attributes/default.rb` 中定義。

如需 OpsWorks Stacks 屬性的完整清單，請參閱 [堆疊組態及部署屬性：Linux](attributes-json-linux.md)和 [內建技術指南屬性](attributes-recipes.md)。如需詳細資訊，請參閱[覆寫屬性](workingcookbook-attributes.md)。

屬性是以階層式結構組織，可以 JSON 物件表示。

您使用 Chef 節點語法將此資料併入您的應用程式，如下所示：

```
[:deploy][:simplephpapp][:database][:username]
```

`deploy` 節點有單一應用程式節點 `simplephpapp`，其包含應用程式資料庫、Git 儲存庫等等的資訊。此範例呈現資料庫使用者名稱的值，解析成 `root`。

## 設定資料庫
<a name="gettingstarted-db-recipes-dbsetup"></a>

MySQL layer 的內建設定配方會自動為名為 的應用程式建立資料庫，並使用應用程式的短名，因此在此範例中，您已有一個名為 simplephpapp 的資料庫。不過，您需要建立表格供應用程式存放其資料，以完成設定。您可以手動建立資料表，但更好的方法是實作自訂配方來處理任務，並讓 OpsWorks Stacks 為您執行。本節說明如何實作配方 `dbsetup.rb`。稍後將說明讓 OpsWorks Stacks 執行配方的程序。

若要查看儲存庫中的配方，請前往 [dbsetup.rb](https://github.com/amazonwebservices/opsworks-example-cookbooks/blob/master/phpapp/recipes/dbsetup.rb)。以下範例顯示 `dbsetup.rb` 程式碼。

`execute` 是執行指定命令的「Chef 資源」**。在此範例中，它是建立表格的 MySQL 命令。如果指定的表格已存在，`not_if` 指令會確保命令不會執行。如需 Chef 資源的詳細資訊，請參閱[關於資源和提供者](https://docs.chef.io/resource.html)。

配方使用先前討論過的節點語法，將屬性值插入命令字串。例如，以下內容會插入資料庫的使用者名稱。

```
#{deploy[:database][:username]}
```

讓我們解釋這個有點隱晦的程式碼：
+ 每次重複，`deploy` 都設為目前的應用程式節點，所以它會解析成 `[:deploy][:app_name]`。在此範例中，它解析成 `[:deploy][:simplephpapp]`。
+ 使用先前顯示的部署屬性值，整個節點會解析成 `root`。
+ 您用 \$1\$1 \$1 包裝節點，將它插入字串中。

其他大部分的節點也以類似方式解析。但 `#{node[:phpapp][:dbtable]}` 是例外，它是由自訂技術指南的屬性檔案所定義，解析成表格名稱 `urler`。因此，在 MySQL 執行個體上執行的實際命令為：

```
"/usr/bin/mysql 
    -uroot
    -pvjud1hw5v8
    simplephpapp
    -e'CREATE TABLE urler(
       id INT UNSIGNED NOT NULL AUTO_INCREMENT,
       author VARCHAR(63) NOT NULL,
       message TEXT,
       PRIMARY KEY (id))'
"
```

此命令會使用來自部署屬性的登入資料和資料庫名稱，建立有 ID、作者和訊息欄位的表格，名為 `urler`。

## 將應用程式連線到資料庫
<a name="gettingstarted-db-recipes-appsetup"></a>

第二塊拼圖是應用程式，它需要連線資訊，例如存取表格的資料庫密碼。SimplePHPApp 其實只有一個工作檔案 `app.php`，而 `index.php` 所做的只是載入 `app.php`。

`app.php` 包含處理資料庫連線的 `db-connect.php`，但此檔案不在儲存庫中。您不能事先建立 `db-connect.php`，因為它會根據特定的執行個體定義資料庫。反之，`appsetup.rb` 配方使用來自部署屬性的連線資料產生 `db-connect.php`。

若要查看儲存庫中的配方，請前往 [appsetup.rb](https://github.com/amazonwebservices/opsworks-example-cookbooks/blob/master/phpapp/recipes/appsetup.rb)。以下範例顯示 `appsetup.rb` 程式碼。

就像 一樣`dbsetup.rb`， `appsetup.rb` 會反覆運算`deploy`節點中的應用程式 - 只需再次使用 simplephpapp 即可。它會執行有 `script` 資源和 `template` 資源的程式碼區塊。

`script` 資源會安裝 [Composer](http://www.getcomposer.org)，這是 PHP 應用程式的相依性管理員。然後執行 Composer 的 `install` 命令，將範例應用程式的相依性安裝到應用程式的根目錄。

`template` 資源會產生 `db-connect.php`，並將它放在 `/srv/www/simplephpapp/current`。注意下列事項：
+ 此配方使用條件式陳述式指定檔案擁有者，這取決於執行個體的作業系統。
+ `only_if` 指令通知 Chef 只在指定目錄存在時產生範本。

`template` 資源在基本上與相關聯檔案有相同的內容和結構，但包含各種資料值的預留位置的範本上操作。`source` 參數指定範本 `db-connect.php.erb`，它在 phpapp 技術指南的 `templates/default` 目錄中，包含下列內容：

當 Chef 處理範本時，它會以範本資源中的對應變數值取代 `<%= =>` 預留位置，因此取自部署屬性。因此產生的檔案為：