Praca z istniejącymi zasobami

Ukończone

Pliki Bicep często wymagają odwoływania się do zasobów, które zostały utworzone gdzie indziej. Te zasoby mogą być tworzone ręcznie, być może przez współpracownika przy użyciu witryny Azure Portal. Można je również utworzyć w innym pliku Bicep. Istnieje wiele powodów, dla których należy odwołać się do tych zasobów, takich jak:

  • Dodasz bazę danych SQL do wystąpienia serwera logicznego usługi Azure SQL, które zostało już utworzone.
  • Konfigurujesz ustawienia diagnostyczne dla zasobów zdefiniowanych w innym module Bicep.
  • Musisz bezpiecznie uzyskać dostęp do kluczy dla konta magazynu, które zostało ręcznie wdrożone w ramach subskrypcji.

Bicep udostępnia existing słowo kluczowe do użycia w takich sytuacjach.

Uwaga

Polecenia w tej lekcji są wyświetlane w celu zilustrowania pojęć. Nie uruchamiaj jeszcze poleceń. Będziesz ćwiczyć to, czego nauczysz się tutaj wkrótce.

Zapoznaj się z istniejącymi zasobami

W pliku Bicep można zdefiniować zasób, który już istnieje. Deklaracja wygląda podobnie do normalnej definicji zasobu, ale istnieje kilka kluczowych różnic. W poniższym przykładzie istniejącej definicji zasobu definicja odwołuje się do konta magazynu o nazwie toydesigndocs. Konto magazynu znajduje się w tej samej grupie zasobów, w ramach którego szablon Bicep wdraża zasoby.

resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
  name: 'toydesigndocs'
}

Przyjrzyjmy się bliżej temu, co składa się na tę definicję:

  • Podobnie jak w przypadku normalnego zasobu, należy dołączyć resource słowo kluczowe, nazwę symboliczną oraz typ zasobu i wersję interfejsu API.

    Uwaga

    Pamiętaj, że nazwa symboliczna jest używana tylko w tym pliku Bicep. Jeśli utworzysz ten zasób przy użyciu jednego pliku Bicep i odwołujesz się do niego przy użyciu existing zasobu w innym pliku Bicep, nazwy symboliczne nie muszą być zgodne.

  • Słowo existing kluczowe wskazuje Bicep, że ta definicja zasobu jest odwołaniem do już utworzonego zasobu i że Bicep nie powinien próbować go wdrożyć.

  • Właściwość name to nazwa zasobu platformy Azure konta magazynu, które zostało wcześniej wdrożone.

  • Nie musisz określać locationelementu , skulub properties, ponieważ szablon nie wdraża zasobu. Odwołuje się on tylko do istniejącego zasobu. Pomyśl o tym jako zasób zastępczy.

Zapoznaj się z zasobami podrzędnym

Możesz również odwołać się do istniejącego zasobu podrzędnego. Użyj tego samego rodzaju składni, która została użyta podczas wdrażania zasobu podrzędnego. W poniższym przykładzie pokazano, jak można odwoływać się do istniejącej podsieci, która jest zasobem podrzędnym sieci wirtualnej. W przykładzie użyto zagnieżdżonego zasobu podrzędnego, jak pokazano poniżej:

resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' existing = {
  name: 'toy-design-vnet'

  resource managementSubnet 'subnets' existing = {
    name: 'management'
  }
}

Zwróć uwagę, że zarówno zasób nadrzędny, jak i podrzędny existing mają zastosowane słowo kluczowe.

Następnie możesz odwołać się do podsieci przy użyciu tego samego :: operatora, który jest używany dla innych zagnieżdżonych zasobów podrzędnych:

output managementSubnetResourceId string = vnet::managementSubnet.id

Zapoznaj się z zasobami spoza grupy zasobów

Często należy odwołać się do zasobów w innej grupie zasobów. Jeśli na przykład masz sieć wirtualną w scentralizowanej grupie zasobów, możesz wdrożyć maszynę wirtualną w tej sieci wirtualnej we własnej grupie zasobów. Słowo kluczowe służy scope do odwoływania się do istniejących zasobów w innej grupie zasobów. W poniższym przykładzie pokazano, jak można odwołać się do sieci wirtualnej o nazwie toy-design-vnet w networking-rg grupie zasobów:

resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' existing = {
  scope: resourceGroup('networking-rg')
  name: 'toy-design-vnet'
}

Zwróć uwagę, że scope słowo kluczowe używa słowa kluczowego resourceGroup() do odwoływania się do grupy zasobów zawierającej sieć wirtualną.

Możesz nawet odwoływać się do zasobów w ramach innej subskrypcji platformy Azure, o ile subskrypcja znajduje się w dzierżawie firmy Microsoft Entra. Jeśli zespół ds. sieci aprowizuje sieć wirtualną w innej subskrypcji, szablon może się z nim odwoływać, jak w tym przykładzie:

resource vnet 'Microsoft.Network/virtualNetworks@2020-11-01' existing = {
  scope: resourceGroup('A123b4567c-1234-1a2b-2b1a-1234abc12345', 'networking-rg')
  name: 'toy-design-vnet'
}

Zwróć uwagę, że scope słowo kluczowe używa słowa kluczowego resourceGroup() do odwoływania się do identyfikatora subskrypcji platformy Azure (A123b4567c-1234-1a2b-2b1a-1234abc12345) i nazwy grupy zasobów zawierającej sieć wirtualną.

Teraz, gdy już wiesz, jak odwoływać się do istniejących zasobów, przyjrzyjmy się sposobom korzystania z tej funkcji w szablonach.

Dodawanie zasobów podrzędnych i rozszerzeń do istniejącego zasobu

Zasób podrzędny można dodać do już utworzonego zasobu nadrzędnego przy użyciu kombinacji existing słowa kluczowego i słowa kluczowego parent . Poniższy przykładowy szablon tworzy bazę danych Azure SQL Database na serwerze, który już istnieje:

resource server 'Microsoft.Sql/servers@2020-11-01-preview' existing = {
  name: serverName
}

resource database 'Microsoft.Sql/servers/databases@2020-11-01-preview' = {
  parent: server
  name: databaseName
  location: location
  sku: {
    name: 'Standard'
    tier: 'Standard'
  }
}

Jeśli musisz wdrożyć zasób rozszerzenia w istniejącym zasobie, możesz użyć słowa kluczowego scope . Oto szablon, który używa słowa kluczowego existing i scope słowa kluczowego, aby dodać blokadę zasobu do konta magazynu, które już istnieje:

resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
  name: 'toydesigndocs'
}

resource lockResource 'Microsoft.Authorization/locks@2016-09-01' = {
  scope: storageAccount
  name: 'DontDelete'
  properties: {
    level: 'CanNotDelete'
    notes: 'Prevents deletion of the toy design documents storage account.'
  }
}

Zapoznaj się z właściwościami istniejącego zasobu

Zasoby często muszą odwoływać się do właściwości innych zasobów. Jeśli na przykład wdrożysz aplikację, może być konieczne zapoznanie się z kluczami lub informacjami o połączeniu dla innego zasobu. Używając słowa kluczowego existing , uzyskujesz dostęp do właściwości zasobu, do którego się odwołujesz.

Napiwek

Najlepszym rozwiązaniem jest wyszukanie kluczy z innych zasobów w ten sposób zamiast przekazywania ich przez dane wyjściowe. Zawsze będziesz otrzymywać najbardziej aktualne dane. Ponadto dane wyjściowe nie są przeznaczone do obsługi bezpiecznych danych, takich jak klucze.

Sposób uzyskiwania dostępu do informacji o zasobie zależy od typu uzyskiwanych informacji. Jeśli jest to właściwość, która nie jest bezpieczna, zwykle używasz tylko properties zasobu. Poniższy przykładowy szablon wdraża aplikację usługi Azure Functions i używa szczegółów dostępu (klucza instrumentacji) dla wystąpienia usługi Application Szczegółowe informacje, które zostało już utworzone:

resource applicationInsights 'Microsoft.Insights/components@2018-05-01-preview' existing = {
  name: applicationInsightsName
}

resource functionApp 'Microsoft.Web/sites@2020-06-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    siteConfig: {
      appSettings: [
        // ...
        {
          name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
          value: applicationInsights.properties.InstrumentationKey
        }
      ]
    }
  }
}

W tym przykładzie, ponieważ klucz instrumentacji nie jest traktowany jako dane poufne, jest dostępny w properties zasobie. Jeśli musisz uzyskać dostęp do bezpiecznych danych, takich jak poświadczenia używane do uzyskiwania dostępu do zasobu, użyj listKeys() funkcji, jak pokazano w poniższym kodzie:

resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
  name: storageAccountName
}

resource functionApp 'Microsoft.Web/sites@2020-06-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    siteConfig: {
      appSettings: [
        // ...
        {
          name: 'StorageAccountKey'
          value: storageAccount.listKeys().keys[0].value
        }
      ]
    }
  }
}

Zwróć uwagę, że listKeys funkcja zwraca tablicę keys . Kod Bicep pobiera value właściwość z pierwszego elementu w tablicy keys . Każdy typ zasobu ma inne informacje dostępne w listKeys() funkcji. Rozszerzenie Bicep dla programu Visual Studio Code zawiera wskazówki ułatwiające zrozumienie danych zwracanych przez funkcję każdego zasobu listKeys() . Poniższy zrzut ekranu przedstawia listKeys() dane wyjściowe funkcji dla konta magazynu:

Zrzut ekranu przedstawiający rozszerzenie Bicep dla programu Visual Studio Code. Funkcja IntelliSense wyświetla kilka informacji zwróconych przez funkcję listKeys dla konta magazynu.

Niektóre zasoby obsługują też inne funkcje. Funkcja IntelliSense programu Visual Studio Code zawiera listę funkcji dostępnych dla każdego zasobu. Na poniższym zrzucie ekranu widać, że konta magazynu udostępniają funkcje o nazwie listAccountSas() i listServiceSas() oprócz listKeys():

Zrzut ekranu przedstawiający rozszerzenie Bicep dla programu Visual Studio Code. Funkcja IntelliSense wyświetla kilka funkcji dostępnych dla konta magazynu.

Ważne

Funkcja listKeys() zapewnia dostęp do poufnych danych dotyczących zasobu. Oznacza to, że użytkownik lub jednostka usługi, która uruchamia wdrożenie, musi mieć odpowiedni poziom uprawnień dla zasobu. Zazwyczaj jest to wbudowana rola Współautor lub rola niestandardowa, która przypisuje odpowiednie uprawnienia.