Warunkowe wdrażanie zasobów
Możesz użyć warunków w kodzie Bicep, aby wdrożyć zasoby tylko wtedy, gdy obowiązują określone ograniczenia.
Na przykład w firmie z toy musisz wdrożyć zasoby w różnych środowiskach. Podczas wdrażania ich w środowisku produkcyjnym należy upewnić się, że inspekcja jest włączona dla serwerów logicznych usługi Azure SQL. Jednak podczas wdrażania zasobów w środowiskach deweloperskich nie chcesz włączać inspekcji. Chcesz użyć jednego szablonu do wdrożenia zasobów we wszystkich środowiskach.
W tej lekcji dowiesz się, jak warunkowo wdrażać zasoby.
Korzystanie z podstawowych warunków
Podczas wdrażania zasobu w aplikacji Bicep można podać if
słowo kluczowe, a następnie warunek. Warunek powinien zostać rozpoznany jako wartość logiczna (prawda lub fałsz). Jeśli wartość ma wartość true, zasób zostanie wdrożony. Jeśli wartość ma wartość false, zasób nie jest wdrożony.
Często tworzy się warunki na podstawie podanych wartości parametrów. Na przykład następujący kod wdraża konto magazynu tylko wtedy, gdy deployStorageAccount
parametr ma wartość true
:
param deployStorageAccount bool
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (deployStorageAccount) {
name: 'teddybearstorage'
location: resourceGroup().location
kind: 'StorageV2'
// ...
}
Zwróć uwagę, że if
słowo kluczowe znajduje się w tym samym wierszu co definicja zasobu.
Używanie wyrażeń jako warunków
Poprzedni przykład był dość podstawowy. Parametr deployStorageAccount
był typu bool
, więc jest jasne, czy ma wartość true
, czy false
.
W Bicep warunki mogą również zawierać wyrażenia. W poniższym przykładzie kod wdraża zasób inspekcji SQL tylko wtedy, gdy wartość parametru environmentName
jest równa Production
:
@allowed([
'Development'
'Production'
])
param environmentName string
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (environmentName == 'Production') {
parent: server
name: 'default'
properties: {
}
}
Zazwyczaj dobrym pomysłem jest utworzenie zmiennej dla wyrażenia, którego używasz jako warunku. Dzięki temu szablon jest łatwiejszy do zrozumienia i odczytania. Oto przykład:
@allowed([
'Development'
'Production'
])
param environmentName string
var auditingEnabled = environmentName == 'Production'
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
}
}
Zależy od zasobów wdrożonych warunkowo
Podczas warunkowego wdrażania zasobów czasami trzeba wiedzieć, w jaki sposób Bicep ocenia zależności między nimi.
Kontynuujmy pisanie kodu Bicep w celu wdrożenia ustawień inspekcji SQL. Plik Bicep musi również zadeklarować zasób konta magazynu, jak pokazano poniżej:
@allowed([
'Development'
'Production'
])
param environmentName string
param location string = resourceGroup().location
param auditStorageAccountName string = 'bearaudit${uniqueString(resourceGroup().id)}'
var auditingEnabled = environmentName == 'Production'
var storageAccountSkuName = 'Standard_LRS'
resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
name: auditStorageAccountName
location: location
sku: {
name: storageAccountSkuName
}
kind: 'StorageV2'
}
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
}
}
Zwróć uwagę, że konto magazynu również ma warunek. Oznacza to, że nie zostanie wdrożona w środowiskach nieprodukcyjnych. Zasób ustawień inspekcji SQL może teraz odwoływać się do szczegółów konta magazynu:
resource auditingSettings 'Microsoft.Sql/servers/auditingSettings@2024-05-01-preview' = if (auditingEnabled) {
parent: server
name: 'default'
properties: {
state: 'Enabled'
storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
}
}
Zwróć uwagę, że ten kod Bicep używa operatora znaku zapytania (?
) w obrębie storageEndpoint
właściwości i storageAccountAccessKey
. Po wdrożeniu kodu Bicep w środowisku produkcyjnym wyrażenia są oceniane na podstawie szczegółów z konta magazynu. Po wdrożeniu kodu w środowisku nieprodukcyjnym wyrażenia są obliczane na pusty ciąg (''
).
Możesz się zastanawiać, dlaczego ten kod jest niezbędny, ponieważ auditingSettings
oba auditStorageAccount
te elementy mają ten sam warunek, dlatego nigdy nie trzeba wdrażać zasobu ustawień inspekcji SQL bez konta magazynu. Mimo że jest to prawdą, usługa Azure Resource Manager ocenia wyrażenia właściwości przed warunkowymi zasobami. Oznacza to, że jeśli kod Bicep nie ma tego wyrażenia, wdrożenie zakończy się niepowodzeniem z powodu błędu ResourceNotFound
.
Uwaga
Nie można zdefiniować dwóch zasobów o tej samej nazwie w tym samym pliku Bicep, a następnie warunkowo wdrożyć tylko jeden z nich. Wdrożenie zakończy się niepowodzeniem, ponieważ usługa Resource Manager wyświetla to jako konflikt.
Jeśli masz kilka zasobów, wszystkie z tym samym warunkiem wdrożenia, rozważ użycie modułów Bicep. Możesz utworzyć moduł, który wdraża wszystkie zasoby, a następnie umieścić warunek w deklaracji modułu w głównym pliku Bicep.