Работа с существующими ресурсами

Завершено

Файлы Bicep часто должны ссылаться на ресурсы, созданные в других местах. Эти ресурсы могут быть созданы вручную, возможно, коллегой с помощью портала Azure. Или они могут быть созданы в другом файле Bicep. Существует множество причин, по которым необходимо ссылаться на эти ресурсы, например:

  • Вы добавляете базу данных SQL в логический экземпляр логического сервера SQL Azure, который кто-то уже создал.
  • Вы настраиваете параметры диагностики для ресурсов, определенных в другом модуле Bicep.
  • Необходимо безопасно получить доступ к ключам учетной записи хранения, которая была вручную развернута в вашей подписке.

Bicep предоставляет ключевое слово existing для использования в этих ситуациях.

Заметка

Команды в этом блоке показаны для иллюстрации концепций. Еще не выполняйте команды. Вы будете практикуть то, что вы узнаете здесь в ближайшее время.

Ссылки на существующие ресурсы

В файле Bicep можно определить ресурс, который уже существует. Объявление выглядит примерно так же, как обычное определение ресурса, но есть несколько ключевых различий. В следующем примере существующего определения ресурсов определение относится к учетной записи хранения с именем toydesigndocs. Учетная запись хранения находится в той же группе ресурсов, в которую с помощью шаблона Bicep развертываются ресурсы.

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

Давайте внимательно рассмотрим, что состоит из этого определения:

  • Как и в обычном ресурсе, вы включаете ключевое слово resource, символическое имя и тип ресурса и версию API.

    Заметка

    Помните, что символическое имя используется только в этом файле Bicep. Если вы создаете этот ресурс с помощью одного файла Bicep и ссылаетесь на него с помощью ресурса existing в другом файле Bicep, символьные имена не должны совпадать.

  • Ключевое слово existing сообщает Bicep, что это определение ресурса является ссылкой на уже созданный ресурс и Bicep не должен пытаться развернуть его.

  • Свойство name — это имя ресурса Azure учетной записи хранения, которая была развернута ранее.

  • Вам не нужно указывать location, skuили properties, так как шаблон не развертывает ресурс. Он просто ссылается на существующий ресурс. Подумайте об этом как о временном ресурсе.

Ссылки на дочерние ресурсы

Вы также можете ссылаться на существующий дочерний ресурс. Используйте тот же синтаксис, который использовался при развертывании дочернего ресурса. В следующем примере показано, как ссылаться на существующую подсеть, которая является дочерним ресурсом виртуальной сети. В примере используется вложенный дочерний ресурс, как показано ниже.

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

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

Обратите внимание, что как к родительскому, так и к дочернему ресурсу применено ключевое слово existing.

Затем можно обратиться к подсети с помощью того же оператора ::, который используется для других вложенных дочерних ресурсов:

output managementSubnetResourceId string = vnet::managementSubnet.id

Обратитесь к ресурсам вне группы ресурсов

Часто необходимо ссылаться на ресурсы в другой группе ресурсов. Например, если у вас есть виртуальная сеть в централизованной группе ресурсов, может потребоваться развернуть виртуальную машину в этой виртуальной сети в собственной группе ресурсов. Ключевое слово scope можно использовать для ссылки на существующие ресурсы в другой группе ресурсов. В следующем примере показано, как можно ссылаться на виртуальную сеть с именем toy-design-vnet в группе ресурсов networking-rg:

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

Обратите внимание, что scope использует ключевое слово resourceGroup() для ссылки на группу ресурсов, содержащую виртуальную сеть.

Вы даже можете ссылаться на ресурсы в другой подписке Azure, если подписка находится в клиенте Microsoft Entra. Если ваша сетевая команда подготавливает виртуальную сеть в другой подписке, шаблон может ссылаться на него, как в следующем примере:

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

Обратите внимание, что scope использует ключевое слово resourceGroup() для ссылки на идентификатор подписки Azure (A123b4567c-1234-1a2b-2b1a-1234abc12345) и имя группы ресурсов, содержащей виртуальную сеть.

Теперь, когда вы понимаете, как ссылаться на существующие ресурсы, давайте рассмотрим, как использовать эту возможность в шаблонах.

Добавление дочерних и расширений ресурсов в существующий ресурс

Дочерний ресурс можно добавить в уже созданный родительский ресурс с помощью сочетания ключевого слова existing и ключевого слова parent. В следующем примере шаблона создается база данных SQL Azure на сервере, который уже существует:

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'
  }
}

Если необходимо развернуть ресурс расширения на существующем ресурсе, можно использовать ключевое слово scope. Ниже приведен шаблон, использующий ключевое слово existing и ключевое слово scope для добавления блокировки ресурсов в учетную запись хранения, которая уже существует:

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.'
  }
}

Ссылки на свойства существующего ресурса

Ресурсы часто должны ссылаться на свойства других ресурсов. Например, при развертывании приложения может потребоваться знать ключи или сведения о подключении для другого ресурса. Используя ключевое слово existing, вы получаете доступ к свойствам ресурса, к которому вы ссылаетесь.

Совет

Рекомендуется искать ключи из других ресурсов таким образом, а не передавать их через выходные данные. Вы всегда получите самые актуальные данные up-to. Кроме того, важно, что выходные данные не предназначены для обработки безопасных данных, таких как ключи.

Доступ к информации о ресурсе зависит от типа получаемой информации. Если это свойство, которое не является безопасным, обычно используется только properties ресурса. В следующем примере шаблона развертывается приложение Azure Functions и используются сведения для доступа (ключ инструментации) для экземпляра Application Insights, который уже был создан.

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
        }
      ]
    }
  }
}

Ключ инструментирования не считается конфиденциальным данными, поэтому в данном примере он доступен в properties ресурса. Если необходимо получить доступ к безопасным данным, таким как учетные данные для доступа к ресурсу, используйте функцию listKeys(), как показано в следующем коде:

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
        }
      ]
    }
  }
}

Обратите внимание, что функция listKeys возвращает массив keys. Код Bicep извлекает свойство value из первого элемента в массиве keys. Каждый тип ресурса имеет разные сведения, доступные из функции listKeys(). Расширение Bicep для Visual Studio Code подсказывает, чтобы помочь вам понять, какие данные возвращает функция listKeys() каждого ресурса. На следующем снимке экрана показаны результаты функции listKeys() для учетной записи хранения.

снимок экрана расширения Bicep для Visual Studio Code. IntelliSense отображает несколько фрагментов сведений, возвращаемых функцией listKeys для учетной записи хранения.

Некоторые ресурсы также поддерживают другие функции. IntelliSense Visual Studio Code содержит функции, доступные для каждого ресурса. На следующем снимке экрана видно, что хранилища предоставляют функции с именами listAccountSas() и listServiceSas() в дополнение к listKeys().

снимок экрана расширения Bicep для Visual Studio Code. IntelliSense отображает несколько функций, доступных для учетной записи хранилища.

Важный

Функция listKeys() предоставляет доступ к конфиденциальным данным о ресурсе. Это означает, что пользователь или субъект-служба, выполняющий развертывание, должен иметь соответствующий уровень разрешений для ресурса. Обычно это участник встроенную роль или пользовательскую роль, которая назначает соответствующее разрешение.