Definování podřízených prostředků
Je vhodné nasadit některé prostředky pouze v kontextu nadřazeného objektu. Tyto prostředky se nazývají podřízené prostředky. V Azure existuje mnoho podřízených typů prostředků. Tady je pár příkladů:
Název | Typ prostředku |
---|---|
Podsítě virtuální sítě | Microsoft.Network/virtualNetworks/subnets |
Konfigurace služby App Service | Microsoft.Web/sites/config |
Databáze SQL | Microsoft.Sql/servers/databases |
Rozšíření virtuálních počítačů | Microsoft.Compute/virtualMachines/extensions |
Kontejnery objektů blob úložiště | Microsoft.Storage/storageAccounts/blobServices/containers |
Kontejnery Azure Cosmos DB | Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers |
Představme si například kontejner objektů blob úložiště. Kontejner objektů blob musí být nasazený do účtu úložiště a nemá smysl, aby kontejner existoval mimo účet úložiště.
Podřízené typy prostředků mají delší názvy s více částmi. Kontejner objektů blob úložiště má tento plně kvalifikovaný název typu: Microsoft.Storage/storageAccounts/blobServices/containers
. ID prostředku kontejneru objektů blob obsahuje název účtu úložiště, který kontejner obsahuje, a název kontejneru.
Poznámka:
Některé podřízené prostředky můžou mít stejný název jako jiné podřízené typy prostředků z různých nadřazených objektů. Je to například containers
podřízený typ účtů úložiště i databází Azure Cosmos DB. Názvy jsou stejné, ale představují různé prostředky a jejich plně kvalifikované názvy typů se liší.
Jak jsou definované podřízené prostředky?
Pomocí Bicep můžete deklarovat podřízené prostředky několika různými způsoby. Každý způsob má své vlastní výhody a každý je vhodný pro některé situace, a ne pro jiné. Pojďme se podívat na jednotlivé přístupy.
Tip
Všechny následující přístupy vedou ke stejným aktivitám nasazení v Azure. Můžete zvolit přístup, který nejlépe vyhovuje vašim potřebám, aniž byste se museli obávat, že něco zlomíte. Šablonu můžete také aktualizovat a změnit přístup, který používáte.
Vnořené prostředky
Jedním z přístupů k definování podřízeného prostředku je vnoření podřízeného prostředku uvnitř nadřazeného prostředku. Tady je příklad šablony Bicep, která nasadí virtuální počítač a rozšíření virtuálního počítače. Rozšíření virtuálního počítače je podřízený prostředek, který poskytuje další chování virtuálního počítače. V tomto případě rozšíření po nasazení spustí na virtuálním počítači vlastní skript.
resource vm 'Microsoft.Compute/virtualMachines@2024-07-01' = {
name: vmName
location: location
properties: {
// ...
}
resource installCustomScriptExtension 'extensions' = {
name: 'InstallCustomScript'
location: location
properties: {
// ...
}
}
}
Všimněte si, že vnořený prostředek má jednodušší typ prostředku než obvykle. I když je Microsoft.Compute/virtualMachines/extensions
plně kvalifikovaný název typu , vnořený prostředek automaticky dědí typ prostředku nadřazeného objektu, takže je nutné zadat pouze podřízený typ prostředku. extensions
Všimněte si také, že pro vnořený prostředek není zadaná žádná verze rozhraní API. Bicep předpokládá, že chcete použít stejnou verzi rozhraní API jako nadřazený prostředek, i když verzi rozhraní API můžete přepsat, pokud chcete.
Pomocí operátoru ::
můžete odkazovat na vnořený prostředek. Můžete například vytvořit výstup, který vrátí úplné ID prostředku rozšíření:
output childResourceId string = vm::installCustomScriptExtension.id
Vnoření prostředků je jednoduchý způsob, jak deklarovat podřízený prostředek. Vnoření prostředků také zviditelňuje vztah nadřazený-podřízený pro každého, kdo šablonu čte. Pokud ale máte velké množství vnořených prostředků nebo více vrstev vnoření, může být čtení šablon obtížnější. Prostředky můžete také vnořit až do pěti vrstev.
Nadřazená vlastnost
Druhým přístupem je deklarovat podřízený prostředek bez vnoření. Pak pomocí parent
vlastnosti řekněte Bicep o vztahu nadřazený-podřízený:
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: {
// ...
}
}
Všimněte si, že podřízený prostředek používá parent
vlastnost odkazující na symbolický název jeho nadřazeného objektu.
Tento přístup k odkazování na nadřazený objekt je dalším snadným způsobem deklarace podřízeného prostředku. Bicep rozumí vztahu mezi nadřazenými a podřízenými prostředky, takže nemusíte zadávat plně kvalifikovaný název prostředku ani nastavovat závislost mezi prostředky. Přístup také zabraňuje příliš velkému vnoření, což může být obtížné číst. Při každém definování podřízeného prostředku pomocí parent
vlastnosti však musíte explicitně zadat úplný typ prostředku a verzi rozhraní API.
Pokud chcete odkazovat na podřízený prostředek deklarovaný s parent
vlastností, použijte jeho symbolický název jako u normálního nadřazeného prostředku:
output childResourceId string = installCustomScriptExtension.id
Vytvoření názvu prostředku
Za určitých okolností nemůžete použít vnořené prostředky ani parent
klíčové slovo. Příklady zahrnují, když deklarujete podřízené prostředky ve smyčce for
nebo když potřebujete použít komplexní výrazy k dynamickému výběru nadřazeného prostředku pro podřízenou položku. V těchto situacích můžete podřízený prostředek nasadit ručním sestavením názvu podřízeného prostředku tak, aby zahrnoval jeho nadřazený název prostředku, jak je znázorněno tady:
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: {
// ...
}
}
Všimněte si, že tento příklad používá interpolaci řetězců k připojení vlastnosti prostředku name
virtuálního počítače k názvu podřízeného prostředku. Bicep chápe, že mezi vaším dítětem a nadřazeným prostředky existuje závislost. Název podřízeného prostředku můžete deklarovat pomocí vmName
proměnné. Pokud to ale uděláte, vaše nasazení může selhat, protože Bicep nerozuměl, že nadřazený prostředek je potřeba nasadit před podřízeným prostředkem:
Pokud chcete tuto situaci vyřešit, můžete bicep ručně informovat o závislosti pomocí klíčového dependsOn
slova, jak je znázorněno tady:
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
]
//...
}
Tip
Obecně je nejlepší vyhnout se vytváření názvů prostředků, protože ztratíte spoustu výhod, které Může Bicep poskytnout, když rozumí vztahům mezi vašimi prostředky. Tuto možnost použijte pouze v případě, že nemůžete použít jeden z dalších přístupů k deklarování podřízených prostředků.
ID podřízených prostředků
Začnete vytvářet ID podřízeného prostředku tak, že zahrnete ID prostředku nadřazeného objektu a pak připojíte typ a název podřízeného prostředku. Představme si například účet služby Azure Cosmos DB s názvem toyrnd
. Poskytovatel prostředků Azure Cosmos DB zveřejňuje typ označovaný databaseAccounts
jako nadřazený prostředek, který nasadíte:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd
Tady je vizuál znázorňující stejné ID prostředku:
Pokud k tomuto účtu přidáme databázi, můžeme použít sqlDatabases
podřízený typ prostředku. Pojďme přidat databázi pojmenovanou FlightTests
do účtu služby Azure Cosmos DB a podívat se na ID podřízeného prostředku:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.DocumentDB/databaseAccounts/toyrnd/sqlDatabases/FlightTests
Tady je vizuální reprezentace:
Můžete mít více úrovní podřízených prostředků. Tady je příklad ID prostředku, které zobrazuje účet úložiště se dvěma úrovněmi podřízených položek:
/subscriptions/A123b4567c-1234-1a2b-2b1a-1234abc12345/resourceGroups/ToyDevelopment/providers/Microsoft.Storage/storageAccounts/secrettoys/blobServices/default/containers/glitterspecs
Tady je vizuální znázornění stejného ID prostředku:
Toto ID prostředku má několik komponent:
Všechno, co je
secrettoys
, je ID nadřazeného prostředku.blobServices
označuje, že prostředek je v rámci podřízeného typu prostředku volanýblobServices
.Poznámka:
Nemusíte vytvářet
blobServices
prostředky sami. PoskytovatelMicrosoft.Storage
prostředků automaticky vytvoří tento prostředek za vás při vytváření účtu úložiště. Tento typ prostředku se někdy označuje jako implicitní prostředek. Jsou poměrně neobvyklé, ale najdete je v celé Azure.default
je název podřízenéhoblobServices
prostředku.Poznámka:
Někdy je povolena pouze jedna instance podřízeného prostředku. Tento typ instance se nazývá singleton a často má název
default
.containers
označuje, že prostředek je v rámci podřízeného typu prostředku volanýcontainers
.glitterspecs
je název kontejneru objektů blob.
Když pracujete s podřízenými prostředky, můžou být ID prostředků dlouhá a složitá. Pokud ale rozdělíte ID prostředku do jeho součástí, je jednodušší pochopit, jak je prostředek strukturovaný. ID prostředku vám také může poskytnout důležité informace o chování prostředku.