Использование существующих ресурсов

Завершено

Файлы 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-01-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-01-01' existing = {
  scope: resourceGroup('networking-rg')
  name: 'toy-design-vnet'
}

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

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

resource vnet 'Microsoft.Network/virtualNetworks@2024-01-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@2023-08-01-preview' existing = {
  name: serverName
}

resource database 'Microsoft.Sql/servers/databases@2023-08-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 можно обращаться к свойствам ресурса, указанного в ссылке.

Совет

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

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

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

resource functionApp 'Microsoft.Web/sites@2023-12-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@2023-12-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() предоставляет доступ к конфиденциальным данным о ресурсе. Это означает, что у пользователя или субъекта-службы, выполняющей развертывание, должен быть соответствующий уровень разрешений для ресурса. Обычно это встроенная роль Участник или настраиваемая роль, которой назначено соответствующее разрешение.