定義子資源
僅在資源的父系內容中部署某些資源是合理的。 這些資源稱為子資源。 Azure 中有許多子資源類型。 以下是一些範例:
名稱 | 資源類型 |
---|---|
虛擬網路子網路 | Microsoft.Network/virtualNetworks/subnets |
App Service 組態 | Microsoft.Web/sites/config |
SQL DATABASE | Microsoft.Sql/servers/databases |
虛擬機器擴充功能 | Microsoft.Compute/virtualMachines/extensions |
儲存體 Blob 容器 | Microsoft.Storage/storageAccounts/blobServices/containers |
Azure Cosmos DB 容器 | Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers |
例如,讓我們考慮儲存體 blob 容器。 Blob 容器必須部署至儲存體帳戶,且容器不會存在於儲存體帳戶外部。
子資源類型具有包含多個部分的較長名稱。 儲存體 blob 容器具有這個完整的類型名稱:Microsoft.Storage/storageAccounts/blobServices/containers
。 Blob 容器的資源識別碼具有包含容器的儲存體帳戶名稱,以及容器的名稱。
注意
某些子資源的名稱可能與不同父系的其他子資源類型名稱相同。 例如,containers
是儲存體帳戶和 Azure Cosmos DB 資料庫的子類型。 名稱相同,但代表不同的資源,而且其完整類型名稱不同。
如何定義子資源?
透過 Bicep,您可以使用數種不同的方式來宣告子資源。 每一種方法都有自己的優點,且每種方式都適用於某些情況,而不適用於其他情況。 讓我們看看每個方法。
提示
下列所有方法都會在 Azure 中產生相同的部署活動。 您可以選擇最適合您需求的方法,而不需要擔心中斷某些工作。 您可以更新您的範本,並變更您所使用的方法。
巢狀資源
定義子資源的其中一個方法,就是將子資源置於父系的巢狀結構內。 以下是部署虛擬機器和虛擬機器延伸模組的 Bicep 範本範例。 虛擬機器延伸模組是為虛擬機器提供額外行為的子資源。 在此情況下,延伸模組會在部署後於虛擬機器上執行自訂指令碼。
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
resource installCustomScriptExtension 'extensions' = {
name: 'InstallCustomScript'
location: location
properties: {
// ...
}
}
}
請注意,此巢狀結構資源的資源類型比平常更簡單。 雖然完整類型名稱是 Microsoft.Compute/virtualMachines/extensions
,但巢狀結構的資源會自動繼承父系的資源類型,因此您只需要指定子資源類型 extensions
。
另請注意,沒有針對巢狀結構資源指定的 API 版本。 Bicep 會假設您要使用與父資源相同的 API 版本,但您可以視需要覆寫 API 版本。
您可以使用 ::
運算子來參考巢狀結構資源。 例如,您可以建立會傳回延伸模組完整資源識別碼的輸出:
output childResourceId string = vm::installCustomScriptExtension.id
巢狀結構資源是宣告子資源的簡單方法。 巢狀結構資源也會讓任何讀取範本的人員都能明顯地擁有父子式關聯性。 但是,如果您有許多巢狀結構資源或多層的巢狀結構,則範本可能會變得難以閱讀。 您也可以只將資源的巢狀結構深度最多設為五層。
父屬性
第二種方法是宣告子資源,而不需要任何巢狀。 然後使用 parent
屬性,告知 Bicep 有關父子式關聯性:
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
}
resource installCustomScriptExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
parent: vm
name: 'InstallCustomScript'
location: location
properties: {
// ...
}
}
請注意,子資源會使用 parent
屬性來參考其父系的符號名稱。
這種參考父系的方法是宣告子資源的另一種簡單方式。 Bicep 瞭解父資源和子資源之間的關聯性,因此您不需要指定完整的資源名稱,或設定資源之間的相依性。 此方法也可避免包含太多的巢狀結構,這可能會變得難以閱讀。 不過,您每次使用 parent
屬性定義子資源時,都必須明確地指定完整的資源類型和 API 版本。
若要參考以 parent
屬性宣告的子資源,您可以使用其符號名稱,如同一般父資源一般:
output childResourceId string = installCustomScriptExtension.id
建立資源名稱
在某些情況下,您無法使用巢狀結構資源或 parent
關鍵字。 範例包括當您在 for
迴圈內宣告子資源,或是當您需要使用複雜運算式來動態選取子系的父資源時。 在這些情況下,您可以手動建立子資源名稱,使其包含其父資源名稱,以部署子資源,如下所示:
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
}
resource installCustomScriptExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
name: '${vm.name}/InstallCustomScript'
location: location
properties: {
// ...
}
}
請注意,此範例會使用字串內插補點將虛擬機器資源 name
屬性附加至子資源名稱。 Bicep 瞭解您的子系和父代資源之間有相依性。 您可以改為使用 vmName
變數來宣告子資源名稱。 但是,如果您這麼做,您的部署可能會失敗,因為 Bicep 不會了解父資源必須部署在子資源之前:
若要解決此問題,您可以使用關鍵字 dependsOn
,手動告知 Bicep 相依性,如下所示:
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
}
resource installCustomScriptExtension 'Microsoft.Compute/virtualMachines/extensions@2024-07-01' = {
name: '${vmName}/InstallCustomScript'
dependsOn: [
vm
]
//...
}
提示
通常最好是避免建立資源名稱,因為當 Bicep 瞭解資源之間的關聯性時,您將失去 Bicep 可提供的許多好處。 僅在您無法使用其他方法來宣告子資源時,才使用此選項。
子資源識別碼
您可以包含子資源的父系資源識別碼,然後附加子資源類型和名稱,以開始建立子資源識別碼。 例如,讓我們考慮名為 toyrnd
的 Azure Cosmos DB 帳戶。 Azure Cosmos DB 資源提供者會公開稱為 databaseAccounts
的類型,也就是您所部署的父資源:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd
以下是相同資源識別碼的視覺描繪:
如果我們將資料庫新增至此帳戶,我們可以使用 sqlDatabases
子資源類型。 讓我們將名為 FlightTests
的資料庫新增至我們的 Azure Cosmos DB 帳戶,並查看子資源識別碼:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd/sqlDatabases/FlightTests
以下是視覺標記法:
您可以有多個層級的子資源。 以下是顯示具有兩個層級儲存體帳戶的範例資源識別碼:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.Storage/storageAccounts/secrettoys/blobServices/default/containers/glitterspecs
以下是相同資源識別碼的視覺標記法:
此資源識別碼有數個元件:
所有到
secrettoys
的項目都是父資源識別碼。blobServices
表示資源在名為blobServices
的子資源類型內。注意
您不需要自行建立
blobServices
資源。 當您建立儲存體帳戶時,Microsoft.Storage
資源提供者會自動為您建立此資源。 這種類型的資源有時稱為隱含資源。 其非常罕見,但您會在 Azure 中找到。default
是blobServices
子資源的名稱。注意
有時候,只允許子資源的單一執行個體。 這種類型的執行個體稱為 singleton,通常會提供
default
的名稱。containers
表示資源在名為containers
的子資源類型內。glitterspecs
是 blob 容器的名稱。
當您使用子資源時,資源識別碼可能會變得很長,而且看起來很複雜。 但是,如果您將資源識別碼細分為其元件部分,您可更輕鬆地了解資源的結構方式。 資源識別碼也可以為您提供資源運作方式的重要線索。