Utiliser des ressources existantes
Les fichiers Bicep doivent souvent faire référence aux ressources qui ont été créées ailleurs. Ces ressources peuvent être créées manuellement, peut-être par un collègue à l’aide du portail Azure. Ils peuvent également être créés dans un autre fichier Bicep. Il existe de nombreuses raisons pour lesquelles vous devez faire référence à ces ressources, par exemple :
- Vous ajoutez une base de données SQL à une instance de serveur logique Azure SQL que quelqu’un a déjà créé.
- Vous configurez les paramètres de diagnostic pour des ressources qui sont définies dans un autre module Bicep.
- Vous devez accéder en toute sécurité aux clés d’un compte de stockage qui a été déployé manuellement dans votre abonnement.
Bicep fournit le mot clé existing
à utiliser dans ces situations.
Notes
Les commandes de cette unité sont présentées pour illustrer les concepts. N’exécutez pas encore les commandes. Vous allez bientôt mettre en pratique ce que vous apprenez ici.
Faire référence à des ressources existantes
Dans un fichier Bicep, vous pouvez définir une ressource qui existe déjà. La déclaration ressemble à une définition de ressource normale, mais il existe quelques différences importantes. Dans l’exemple suivant d’une définition de ressource existante, la définition fait référence à un compte de stockage nommé toydesigndocs
. Le compte de stockage se trouve dans le même groupe de ressources que celui sur lequel votre modèle Bicep déploie des ressources.
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' existing = {
name: 'toydesigndocs'
}
Examinons en détail ce qui compose cette définition :
Comme pour une ressource normale, vous incluez le mot clé
resource
, un nom symbolique, le type de ressource et la version d’API.Notes
N’oubliez pas que le nom symbolique est utilisé uniquement dans ce fichier Bicep. Si vous créez cette ressource à partir d’un fichier Bicep et la référencer avec la ressource
existing
dans un autre fichier Bicep, les noms symboliques n’ont pas besoin de correspondre.Le mot clé
existing
indique à Bicep que cette définition de ressource est une référence à une ressource déjà créée et que Bicep ne doit pas essayer de la déployer.La propriété
name
est le nom de la ressource Azure du compte de stockage qui a été précédemment déployé.Vous n’avez pas besoin de spécifier
location
,sku
, niproperties
car le modèle ne déploie pas la ressource. Il fait simplement référence à une ressource existante. Considérez cette ressource comme une ressource d’espace réservé.
Faire référence aux ressources enfants
Vous pouvez également faire référence à une ressource enfant existante. Utilisez le même type de syntaxe que celui que vous avez utilisé lors du déploiement d’une ressource enfant. L’exemple suivant montre comment vous pouvez faire référence à un sous-réseau existant, qui est une ressource enfant d’un réseau virtuel. L’exemple utilise une ressource enfant imbriquée, comme illustré ici :
resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' existing = {
name: 'toy-design-vnet'
resource managementSubnet 'subnets' existing = {
name: 'management'
}
}
Notez que le mot clé existing
est appliqué aux ressources parent et enfant.
Vous pouvez ensuite faire référence au sous-réseau à l’aide du même opérateur ::
que celui utilisé pour d’autres ressources enfants imbriquées :
output managementSubnetResourceId string = vnet::managementSubnet.id
Faire référence à des ressources en dehors du groupe de ressources
Souvent, vous devez faire référence à des ressources dans un autre groupe de ressources. Par exemple, si vous avez un réseau virtuel dans un groupe de ressources centralisé, vous souhaitez peut-être déployer une machine virtuelle dans ce réseau virtuel dans son propre groupe de ressources. Vous pouvez utiliser le mot clé scope
pour faire référence à des ressources existantes dans un groupe de ressources différent. L’exemple suivant montre comment faire référence à un réseau virtuel appelé toy-design-vnet
au sein du groupe de ressources networking-rg
:
resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' existing = {
scope: resourceGroup('networking-rg')
name: 'toy-design-vnet'
}
Notez que scope
utilise le mot clé resourceGroup()
pour faire référence au groupe de ressources qui contient le réseau virtuel.
Vous pouvez même faire référence à des ressources dans un autre abonnement Azure, à condition que l’abonnement se trouve dans votre locataire Microsoft Entra. Si votre équipe réseau provisionne le réseau virtuel dans un autre abonnement, le modèle peut y faire référence, comme dans cet exemple :
resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' existing = {
scope: resourceGroup('A123b4567c-1234-1a2b-2b1a-1234abc12345', 'networking-rg')
name: 'toy-design-vnet'
}
Notez que scope
utilise le mot clé resourceGroup()
pour désigner l’ID d’abonnement Azure (A123b4567c-1234-1a2b-2b1a-1234abc12345
) et le nom du groupe de ressources qui contient le réseau virtuel.
Maintenant que vous savez faire référence à des ressources existantes, voyons comment vous pouvez utiliser cette fonctionnalité dans vos modèles.
Ajouter des ressources d’extension et enfants à une ressource existante
Vous pouvez ajouter une ressource enfant à une ressource parent déjà créée à l’aide d’une combinaison du mot clé existing
et du mot clé parent
. L’exemple de modèle suivant crée une base de données Azure SQL dans un serveur qui existe déjà :
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'
}
}
Si vous devez déployer une ressource d’extension sur une ressource existante, vous pouvez utiliser le mot clé scope
. Voici un modèle qui utilise le mot clé existing
et le mot clé scope
pour ajouter un verrou de ressource à un compte de stockage qui existe déjà :
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.'
}
}
Faire référence aux propriétés d’une ressource existante
Les ressources doivent souvent faire référence aux propriétés d’autres ressources. Par exemple, si vous déployez une application, il peut être nécessaire de connaître les clés ou les informations de connexion d’une autre ressource. En utilisant le mot clé existing
, vous accédez aux propriétés de la ressource à laquelle vous faites référence.
Conseil
Une meilleure pratique consiste à rechercher des clés à partir d’autres ressources de cette manière plutôt que de les transmettre via des sorties. Vous obtiendrez toujours les données les plus actuelles. En outre, les sorties ne sont pas conçues pour gérer des données sécurisées telles que des clés.
La façon dont vous accédez aux informations sur une ressource dépend du type d’informations que vous obtenez. S’il s’agit d’une propriété qui n’est pas sécurisée, vous utilisez généralement uniquement la properties
de la ressource. L’exemple de modèle suivant déploie une application Azure Functions et utilise les détails d’accès (clé d’instrumentation) pour une instance Application Insights déjà créée :
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
}
]
}
}
}
Dans cet exemple, étant donné que la clé d’instrumentation n’est pas considérée comme une donnée sensible, elle est disponible dans les properties
de la ressource. Quand vous avez besoin d’accéder à des données sécurisées, telles que les informations d’identification à utiliser pour accéder à une ressource, utilisez la fonction listKeys()
, comme indiqué dans le code suivant :
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
}
]
}
}
}
Notez que la fonction listKeys
retourne un tableau keys
. Le code Bicep récupère la propriété value
à partir du premier élément du tableau keys
. Chaque type de ressources a des informations différentes disponibles à partir de la fonction listKeys()
. L’extension Bicep pour Visual Studio Code vous donne des conseils pour vous aider à comprendre les données retournées par la fonction listKeys()
de chaque ressource. La capture d’écran suivante montre la sortie de la fonction listKeys()
pour un compte de stockage :
Certaines ressources prennent également en charge d’autres fonctions. IntelliSense de Visual Studio Code répertorie les fonctions disponibles pour chaque ressource. Dans la capture d’écran suivante, vous pouvez voir que les comptes de stockage fournissent des fonctions nommées listAccountSas()
et listServiceSas()
en plus de listKeys()
:
Important
La fonction listKeys()
fournit l’accès aux données sensibles sur la ressource. Cela signifie que l’utilisateur ou le principal du service qui exécute le déploiement doit disposer du niveau d’autorisation approprié sur la ressource. Il s’agit généralement du rôle intégré Contributeur ou d’un rôle personnalisé qui attribue l’autorisation appropriée.