Использование существующих ресурсов
Файлы 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()
вывод функции для учетной записи хранения:
Некоторые ресурсы также поддерживают другие функции. Функция IntelliSense в Visual Studio Code перечисляет функции, доступные для каждого ресурса. На следующем снимке экрана вы увидите, что учетные записи хранения предоставляют функции с именем listAccountSas()
и listServiceSas()
в дополнение к listKeys()
:
Внимание
Функция listKeys()
предоставляет доступ к конфиденциальным данным о ресурсе. Это означает, что у пользователя или субъекта-службы, выполняющей развертывание, должен быть соответствующий уровень разрешений для ресурса. Обычно это встроенная роль Участник или настраиваемая роль, которой назначено соответствующее разрешение.