本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
簡式解釋:技術指南、配方和 AWS OpsWorks 堆疊屬性
重要
AWS OpsWorks Stacks 服務已於 2024 年 5 月 26 日終止,並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問,請透過 AWS re:Post
您現在有應用程式和資料庫伺服器,但它們還不能使用。您仍然需要設定資料庫並設定應用程式的連線設定。 AWS OpsWorks Stacks 不會自動處理這些任務,但支援 Chef 技術指南、配方和動態屬性。您可以實作一組配方,一個用於設定資料庫,另一個用於設定應用程式的連線設定,並讓 AWS OpsWorks Stacks 為您執行這些配方。
包含必要配方的 phpapp 技術指南已實作可供使用,如果想要,您可以直接跳到步驟 3.3:將自訂技術指南新增至 MyStack。如果想知道更多,本節會提供一些有關技術指南和配方的背景,說明配方的運作方式。若要查看技術指南本身,請參閱 phpapp 技術指南
配方和屬性
Chef 配方基本上是專門在執行個體上執行任務 (例如安裝套件、建立組態檔案、執行 shell 命令等等) 的 Ruby 應用程式。相關配方的群組會組織成「技術指南」,其也包含支援的檔案,例如建立組態檔案的範本。
AWS OpsWorks Stacks 有一組支援內建 layer 的技術指南。您也可以使用自己的配方建立自訂技術指南,在您的執行個體上執行自訂任務。本主題提供配方的簡介,並示範如何使用它們設定資料庫以及設定應用程式的連線設定。如需技術指南和配方的詳細資訊,請參閱技術指南和配方或自訂 AWS OpsWorks Stacks。
配方通常取決於輸入資料的 Chef「屬性」:
-
這些屬性有部分由 Chef 定義,提供執行個體的基本資訊,例如作業系統。
-
AWS OpsWorks Stacks 會定義一組屬性,其中包含堆疊的相關資訊,例如 layer 組態,以及部署的應用程式,例如應用程式儲存庫。
您可以將自訂 JSON 指派給堆疊或部署,將自訂的屬性新增至此集合。
-
您的技術指南也可以定義技術指南專用的屬性。
phpapp 技術指南屬性在
attributes/default.rb
中定義。
如需 AWS OpsWorks Stacks 屬性的完整清單,請參閱 堆疊組態及部署屬性:Linux和 內建技術指南屬性。如需詳細資訊,請參閱覆寫屬性。
屬性是以階層式結構組織,可以 JSON 物件表示。
您使用 Chef 節點語法將此資料併入您的應用程式,如下所示:
[:deploy][:simplephpapp][:database][:username]
deploy
節點有單一應用程式節點 simplephpapp
,其包含應用程式資料庫、Git 儲存庫等等的資訊。此範例呈現資料庫使用者名稱的值,解析成 root
。
設定資料庫
MySQL layer 的內建設定配方會自動為名為 的應用程式建立資料庫,並使用應用程式的短名,因此在此範例中,您已有一個名為 Simplephpapp 的資料庫。不過,您需要建立表格供應用程式存放其資料,以完成設定。您可以手動建立資料表,但更好的方法是實作自訂配方來處理任務,並讓 AWS OpsWorks Stacks 為您執行。本節說明如何實作配方 dbsetup.rb
。稍後將說明讓 AWS OpsWorks Stacks 執行配方的程序。
若要查看儲存庫中的配方,請前往 dbsetup.rbdbsetup.rb
程式碼。
execute
是執行指定命令的「Chef 資源」。在此範例中,它是建立表格的 MySQL 命令。如果指定的表格已存在,not_if
指令會確保命令不會執行。如需 Chef 資源的詳細資訊,請參閱關於資源和提供者
配方使用先前討論過的節點語法,將屬性值插入命令字串。例如,以下內容會插入資料庫的使用者名稱。
#{deploy[:database][:username]}
讓我們解釋這個有點隱晦的程式碼:
-
每次重複,
deploy
都設為目前的應用程式節點,所以它會解析成[:deploy][:
。在此範例中,它解析成app_name
][:deploy][:simplephpapp]
。 -
使用先前顯示的部署屬性值,整個節點會解析成
root
。 -
您用 #{ } 包裝節點,將它插入字串中。
其他大部分的節點也以類似方式解析。但 #{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
。
將應用程式連線到資料庫
第二塊拼圖是應用程式,它需要連線資訊,例如存取表格的資料庫密碼。SimplePHPApp 其實只有一個工作檔案 app.php
,而 index.php
所做的只是載入 app.php
。
app.php
包含處理資料庫連線的 db-connect.php
,但此檔案不在儲存庫中。您不能事先建立 db-connect.php
,因為它會根據特定的執行個體定義資料庫。反之,appsetup.rb
配方使用來自部署屬性的連線資料產生 db-connect.php
。
若要查看儲存庫中的配方,請前往 appsetup.rbappsetup.rb
程式碼。
如同 dbsetup.rb
,appsetup.rb
反覆運算deploy
節點中的應用程式 - 只需再簡單一遍 -。它會執行有 script
資源和 template
資源的程式碼區塊。
script
資源會安裝 Composerinstall
命令,將範例應用程式的相依性安裝到應用程式的根目錄。
template
資源會產生 db-connect.php
,並將它放在 /srv/www/simplephpapp/current
。注意下列事項:
-
此配方使用條件式陳述式指定檔案擁有者,這取決於執行個體的作業系統。
-
only_if
指令通知 Chef 只在指定目錄存在時產生範本。
template
資源在基本上與相關聯檔案有相同的內容和結構,但包含各種資料值的預留位置的範本上操作。source
參數指定範本 db-connect.php.erb
,它在 phpapp 技術指南的 templates/default
目錄中,包含下列內容:
當 Chef 處理範本時,它會以範本資源中的對應變數值取代 <%= =>
預留位置,因此取自部署屬性。因此產生的檔案為: