使用模組將相關資源分組

已完成

您已開始針對最近推出的一些產品使用 Bicep 範本,而且這些範本很成功。 因為您已在範本檔案中宣告資源,所以可以快速部署資源來因應新推出的玩具,而不需要在 Azure 入口網站中手動設定資源。

IT 主管預見您的 Bicep 程式碼會變得更複雜,而且定義的資源也越來越多,因此詢問您是否可以讓程式碼變得更加「模組化」。 您可以針對部署的不同部分建立個別的 Bicep 檔案 (稱為模組)。 主要的 Bicep 範本可以參考這些模組。 在幕後,模組會轉換為單一 JSON 範本以供部署。

模組也可以讓 Bicep 程式碼更容易重複使用。 您可以具有許多其他 Bicep 範本使用的單一 Bicep 模組。

您通常也需要從 Bicep 模組和範本發出 輸出。 輸出可讓 Bicep 程式碼將資料傳回給部署的起始者。 讓我們先看一下輸出。

注意

本單元中的命令僅用於示範概念。 請先不要執行命令。 您很快就會在此練習所學到的內容。

輸出

人類可以手動部署 Bicep 範本,或某種自動化發行程序可以部署它們。 無論是哪一種方式,都會從範本中取得一些資料,以便傳回給範本部署的執行者。

以下是一些您可能需要從範本部署取得資訊的範例案例:

  • 您建立 Bicep 範本來部署虛擬機器,而且您需要取得公用 IP 位址,才能透過 SSH 連線到虛擬機器。
  • 您建立 Bicep 範本來接受一組參數,例如環境名稱和應用程式名稱。 此範本會使用運算式來命名其所部署之 Azure App Service 應用程式。 您需要輸出範本所部署之應用程式的名稱,以便在部署管線中用以發佈應用程式二進位檔。

您可以在這些案例中使用這些輸出。 若要在 Bicep 範本中定義輸出,請使用 output 關鍵字,如下所示:

output appServiceAppName string = appServiceAppName

輸出定義包含幾個主要部分:

  • output 關鍵字會告訴 Bicep 您要定義輸出。
  • appServiceAppName 是輸出的名稱。 有人成功部署範本時,輸出值中會包括您指定的名稱,以便其能夠存取所預期的值。
  • string 是輸出類型。 Bicep 輸出支援的類型和參數相同。
  • 必須針對每個輸出指定一個值。 和參數不同的是,輸出一律需要有值。 輸出值可以是運算式、參數或變數的參照,或是檔案內所部署資源的屬性。

提示

輸出可以使用與變數和參數相同的名稱。 如果您在變數內建構複雜的運算式以在範本的資源內使用,且您需要將變數的值透過輸出來公開,則這個慣例會很實用。

以下是另一個輸出範例。 此輸出會將其值設定為公用 IP 位址資源的完整網域名稱 (FQDN)。

output ipFqdn string = publicIPAddress.properties.dnsSettings.fqdn

提示

請嘗試使用資源屬性作為輸出,而不是假設資源的行為模式。 例如,如果您需要 App Service 應用程式的 URL 輸出,請使用該應用程式的 defaultHostName 屬性,而不要自行建立 URL 字串。 有時候這些假設在不同的環境中並不有效,或是資源的運作方式會改變,因此讓資源自己告訴您其本身的屬性會比較安全。

警告

請勿建立祕密值 (例如連接字串或金鑰) 的輸出。 能夠存取您資源群組的人,都可以讀取範本的輸出。 您可以使用其他方法來存取祕密資源屬性,稍後的課程模組會有這方面的說明。

定義模組

Bicep 模組可讓您透過建立可供組成範本的較小單元,來組織和重複使用 Bicep 程式碼。 任何 Bicep 範本都可作為另一個範本的模組。 在本學習課程模組期間,您已建立 Bicep 範本。 這表示您已經建立可作為 Bicep 模組使用的檔案!

假設您有一個 Bicep 範本,其能為「解決方案 A」部署應用程式、資料庫和網路資源。您可以將此範本分割為三個模組,讓每個模組都專注在其本身擁有的資源集。 作為額外好處,您現在也可以在範本中針對其他解決方案,重複使用模組;因此,當您在開發 解決方案 B 的範本時,由於其網路需求與 解決方案 A 類似,因此您可以重複使用該網路模組。

顯示解決方案 A 範本的圖表,其會參考三個模組:應用程式、資料庫和網路。該網路模組接著會重複用於另一個適用於解決方案 B 的範本。

當您想要讓範本包括模組檔案的參考時,請使用 module 關鍵字。 模組定義看起來很像資源宣告,但您會使用模組的檔案名稱,而不會包括資源類型和 API 版本:

module myModule 'modules/mymodule.bicep' = {
  name: 'MyModule'
  params: {
    location: location
  }
}

讓我們仔細看看此模組定義的一些重要部分:

  • module 關鍵字會告訴 Bicep 您即將使用另一個 Bicep 檔案作為模組。
  • 和資源一樣,模組也需要「符號名稱」,例如 myModule。 當您在範本的其他部分中參考模組的輸出時,就會使用符號名稱。
  • modules/mymodule.bicep 是模組檔案相對於範本檔案的路徑。 請記住,模組檔案只是一般的 Bicep 檔案。
  • 和資源一樣,name 屬性是必要的。 Azure 會使用模組的名稱,因為其會為範本檔案內的每個模組建立不同的部署。 那些部署會有可作為識別之用的名稱。
  • 您可以使用 params 關鍵字來指定模組的任何「參數」。 在設定範本內每個參數的值時,可以使用運算式、範本參數、變數、範本內所部署資源的屬性,以及其他模組的輸出。 Bicep 會自動理解資源之間的相依性。

模組和輸出

和範本一樣,Bicep 模組也可以定義輸出。 人們經常會將模組一起鏈結在範本內。 在此情況下,一個模組的輸出就可以成為另一個模組的參數。 透過一起使用模組和輸出,您可以建立功能強大且可重複使用的 Bicep 檔案。

設計模組

良好的 Bicep 模組會遵循一些重要準則:

  • 模組應該要有明確的用途。 您可以使用模組來定義所有與解決方案的特定部分有關的資源。 例如,您可以建立一個模組,其中包含用來監視應用程式的所有資源。 您也可以使用模組來定義一組互相隸屬的資源,例如您所有的資料庫伺服器和資料庫。

  • 請勿將每個資源放入其自己的模組中。 請不要為您部署的每個資源建立個別的模組。 如果您有具有許多複雜屬性的資源,將該資源放入自己的模組可能很合理,但一般而言,模組最好結合多個資源。

  • 模組應該要有清楚的參數和合理的輸出。 請考慮模組的用途。 想想模組應該要操作參數值,還是父代範本應該處理這些參數值,然後再將單一值傳遞給模組。 同樣地,請想想模組應傳回的輸出,並確定這些輸出對於將使用模組的範本是有用的。

  • 模組應盡可能獨立。 如果模組需要使用變數來定義模組的某個部分,則一般應該在模組檔案中而非父代範本中包含變數。

  • 模組不應該輸出祕密。 和範本一樣,請勿為祕密值 (例如連接字串或金鑰) 建立模組輸出。