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:

  • Dodajesz bazę danych SQL do wystąpienia serwera logicznego usługi Azure SQL, które ktoś już utworzył.
  • 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 słowo kluczowe existing do użycia w tych sytuacjach.

Notatka

Polecenia w tej jednostce 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@2023-05-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ć słowo kluczowe resource, nazwę symboliczną oraz typ zasobu i wersję interfejsu API.

    Notatka

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

  • Słowo kluczowe existing 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 konta magazynu na platformie Azure, które zostało wcześniej wdrożone.

  • Nie musisz określać location, skuani 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ędnymi

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@2024-05-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 mają zastosowane słowo kluczowe existing.

Następnie możesz odwołać się do podsieci, używając tego samego operatora ::, co dla innych 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. Możesz użyć słowa kluczowego scope, aby odwoływać 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 grupie zasobów networking-rg:

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

Zwróć uwagę, że scope 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ół sieciowy skonfiguruje wirtualną sieć w innej subskrypcji, szablon może się do niej odwoływać, jak w tym przykładzie:

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

Zwróć uwagę, że scope 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, używając kombinacji słów kluczowych existing i parent. Poniższy przykładowy szablon tworzy bazę danych Azure SQL Database na serwerze, który już istnieje:

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

resource database 'Microsoft.Sql/servers/databases@2024-05-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 słowa kluczowego scope, aby dodać blokadę zasobu do konta magazynowego, które już istnieje.

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

resource lockResource 'Microsoft.Authorization/locks@2020-05-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

Najlepiej praktykować wyszukiwanie kluczy w innych zasobach w ten sposób, zamiast przekazywania ich za pomocą danych wyjściowych. Zawsze będziesz otrzymywać najbardziej up-to-date data. 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ę funkcji Azure i używa danych dostępu (klucz instrumentacji) dla wystąpienia usługi Application Insights, które zostało już utworzone.

resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
  name: applicationInsightsName
}

resource functionApp 'Microsoft.Web/sites@2024-04-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 uważany za dane poufne, jest dostępny w properties zasobu. Jeśli musisz uzyskać dostęp do bezpiecznych danych, takich jak poświadczenia używane do uzyskiwania dostępu do zasobu, użyj funkcji listKeys(), jak pokazano w poniższym kodzie:

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

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

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

Zrzut ekranu rozszerzenia Bicep do programu Visual Studio Code. IntelliSense wyświetla różne informacje zwracane przez funkcję listKeys dla konta magazynowego.

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 przechowywania udostępniają funkcje o nazwie listAccountSas() i listServiceSas() oprócz listKeys().

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

Ważny

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 rola wbudowana Współautor lub rola niestandardowa, która przypisuje odpowiednie uprawnienia.