Ustawianie nazwy i typu dla zasobów podrzędnych w Bicep

Zasoby podrzędne to zasoby, które istnieją tylko w kontekście innego zasobu. Na przykład rozszerzenie maszyny wirtualnej nie może istnieć bez maszyny wirtualnej. Zasób rozszerzenia jest elementem podrzędnym maszyny wirtualnej.

Każdy zasób nadrzędny akceptuje tylko niektóre typy zasobów jako zasoby podrzędne. Hierarchia typów zasobów jest dostępna w dokumentacji zasobów Bicep.

W tym artykule przedstawiono różne sposoby deklarowania zasobu podrzędnego.

Zasoby szkoleniowe

Jeśli wolisz dowiedzieć się więcej o zasobach podrzędnych za pomocą szczegółowych wskazówek, zobacz Wdrażanie zasobów podrzędnych i zasobów rozszerzeń przy użyciu Bicep.

Wzorzec nazwy i typu

W Bicep można określić zasób podrzędny w ramach zasobu nadrzędnego lub poza zasobem nadrzędnym. Wartości podane dla nazwy zasobu i typu zasobu różnią się w zależności od sposobu deklarowania zasobu podrzędnego. Jednak pełna nazwa i typ zawsze są rozpoznawane jako ten sam wzorzec.

Pełna nazwa zasobu podrzędnego używa wzorca:

{parent-resource-name}/{child-resource-name}

Jeśli masz więcej niż dwa poziomy w hierarchii, zachowaj powtarzanie nazw nadrzędnych:

{parent-resource-name}/{child-level1-resource-name}/{child-level2-resource-name}

Pełny typ zasobu podrzędnego używa wzorca:

{resource-provider-namespace}/{parent-resource-type}/{child-resource-type}

Jeśli w hierarchii znajduje się więcej niż dwa poziomy, zachowaj powtarzanie nadrzędnych typów zasobów:

{resource-provider-namespace}/{parent-resource-type}/{child-level1-resource-type}/{child-level2-resource-type}

Jeśli zliczasz segmenty między znakami / , liczba segmentów w typie jest zawsze jedną liczbą segmentów w nazwie.

W ramach zasobu nadrzędnego

W poniższym przykładzie pokazano zasób podrzędny uwzględniony we właściwości resources zasobu nadrzędnego.

resource <parent-resource-symbolic-name> '<resource-type>@<api-version>' = {
  <parent-resource-properties>

  resource <child-resource-symbolic-name> '<child-resource-type>' = {
    <child-resource-properties>
  }
}

Zagnieżdżona deklaracja zasobu musi pojawić się na najwyższym poziomie składni zasobu nadrzędnego. Deklaracje mogą być zagnieżdżone dowolnie głęboko, o ile każdy poziom jest typem podrzędnym zasobu nadrzędnego.

Po zdefiniowaniu w ramach nadrzędnego typu zasobu wartości typu i nazwy są formatowane jako pojedynczy segment bez ukośników. W poniższym przykładzie pokazano konto magazynu z zasobem podrzędnym dla usługi plików, a usługa plików ma zasób podrzędny dla udziału plików. Nazwa usługi plików jest ustawiona na default , a jej typ ma wartość fileServices. Nazwa udziału plików jest ustawiona exampleshare , a jego typ ma wartość shares.

resource storage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }

  resource service 'fileServices' = {
    name: 'default'

    resource share 'shares' = {
      name: 'exampleshare'
    }
  }
}

Pełne typy zasobów są nadal Microsoft.Storage/storageAccounts/fileServices i Microsoft.Storage/storageAccounts/fileServices/shares. Nie podajesz Microsoft.Storage/storageAccounts/ , ponieważ zakłada się, że pochodzi z nadrzędnego typu zasobu i wersji. Zagnieżdżony zasób może opcjonalnie zadeklarować wersję interfejsu API przy użyciu składni <segment>@<version>. Jeśli zagnieżdżony zasób pomija wersję interfejsu API, używana jest wersja interfejsu API zasobu nadrzędnego. Jeśli zagnieżdżony zasób określa wersję interfejsu API, używana jest określona wersja interfejsu API.

Nazwy zasobów podrzędnych są ustawione na default i exampleshare ale pełne nazwy zawierają nazwy nadrzędne. Nie podajesz examplestorage ani default dlatego, że są one zakładane z zasobu nadrzędnego.

Zagnieżdżony zasób może uzyskać dostęp do właściwości swojego zasobu nadrzędnego. Inne zasoby zadeklarowane wewnątrz treści tego samego zasobu nadrzędnego mogą odwoływać się do siebie przy użyciu nazw symbolicznych. Zasób nadrzędny może nie uzyskać dostępu do właściwości zawartych w nim zasobów. Ta próba spowoduje zależność cykliczną.

Aby odwołać się do zasobu zagnieżdżonego poza zasobem nadrzędnym, musi on być kwalifikowany przy użyciu nazwy zawierającego zasób i :: operatora. Aby na przykład wygenerować właściwość z zasobu podrzędnego:

output childAddressPrefix string = VNet1::VNet1_Subnet1.properties.addressPrefix

Zasób poza obiektem nadrzędnym

W poniższym przykładzie pokazano zasób podrzędny poza zasobem nadrzędnym. Tej metody można użyć, jeśli zasób nadrzędny nie został wdrożony w tym samym szablonie lub jeśli chcesz użyć pętli do utworzenia więcej niż jednego zasobu podrzędnego. Określ właściwość nadrzędną elementu podrzędnego z wartością ustawioną na symboliczną nazwę elementu nadrzędnego. Przy użyciu tej składni nadal trzeba zadeklarować pełny typ zasobu, ale nazwa zasobu podrzędnego jest tylko nazwą elementu podrzędnego.

resource <parent-resource-symbolic-name> '<resource-type>@<api-version>' = {
  name: 'myParent'
  <parent-resource-properties>
}

resource <child-resource-symbolic-name> '<child-resource-type>@<api-version>' = {
  parent: <parent-resource-symbolic-name>
  name: 'myChild'
  <child-resource-properties>
}

Po zdefiniowaniu poza zasobem nadrzędnym należy sformatować typ i ukośniki, aby uwzględnić typ nadrzędny i nazwę.

W poniższym przykładzie pokazano konto magazynu, usługę plików i udział plików, które są zdefiniowane na poziomie głównym.

resource storage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

resource service 'Microsoft.Storage/storageAccounts/fileServices@2022-09-01' = {
  name: 'default'
  parent: storage
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2022-09-01' = {
  name: 'exampleshare'
  parent: service
}

Odwoływanie się do nazwy symbolicznej zasobu podrzędnego działa tak samo jak odwoływanie się do elementu nadrzędnego.

Pełna nazwa zasobu poza obiektem nadrzędnym

Możesz również użyć pełnej nazwy zasobu i typu podczas deklarowania zasobu podrzędnego poza obiektem nadrzędnym. Nie ustawiasz właściwości nadrzędnej w zasobie podrzędnym. Ponieważ nie można wywnioskować zależności, należy ją jawnie ustawić.

resource storage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

resource service 'Microsoft.Storage/storageAccounts/fileServices@2022-09-01' = {
  name: 'examplestorage/default'
  dependsOn: [
    storage
  ]
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2022-09-01' = {
  name: 'examplestorage/default/exampleshare'
  dependsOn: [
    service
  ]
}

Ważne

Ustawienie pełnej nazwy i typu zasobu nie jest zalecanym podejściem. Nie jest to tak bezpieczne, jak użycie jednego z innych podejść. Aby uzyskać więcej informacji, zobacz Linter rule: use parent property (Reguła lintera: używanie właściwości nadrzędnej).

Następne kroki