Exercice – Examiner votre modèle Bicep existant
Dans notre scénario, vous passez en revue votre modèle avec vos collègues du contrôle qualité.
Alors que vous parcourez ensemble le modèle, vos collègues commencent à vous poser une série de questions sur la structure et les composants du fichier. Ils ont l’air un peu perdus. Votre modèle gagnerait-il peut-être à recevoir certaines améliorations pour le rendre plus lisible et plus facile à comprendre ?
Jetez un coup d’œil au modèle suivant, que vous voyez pour la première fois. Comprenez-vous le rôle de toutes les composantes de ce modèle ? Combien de problèmes repérez-vous ? Que pourriez-vous faire pour améliorer le modèle ?
param location string = resourceGroup().location
@allowed([
'F1'
'D1'
'B1'
'B2'
'B3'
'S1'
'S2'
'S3'
'P1'
'P2'
'P3'
'P4'
])
param skuName string = 'F1'
@minValue(1)
param skuCapacity int = 1
param sqlAdministratorLogin string
@secure()
param sqlAdministratorLoginPassword string
param managedIdentityName string
param roleDefinitionId string = 'b24988ac-6180-42a0-ab88-20f7382dd24c'
param webSiteName string = 'webSite${uniqueString(resourceGroup().id)}'
param container1Name string = 'productspecs'
param productmanualsName string = 'productmanuals'
var hostingPlanName = 'hostingplan${uniqueString(resourceGroup().id)}'
var sqlserverName = 'toywebsite${uniqueString(resourceGroup().id)}'
var storageAccountName = 'toywebsite${uniqueString(resourceGroup().id)}'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
name: storageAccountName
location: 'eastus'
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
properties: {
accessTier: 'Hot'
}
resource blobServices 'blobServices' existing = {
name: 'default'
}
}
resource container1 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-05-01' = {
parent: storageAccount::blobServices
name: container1Name
}
resource sqlserver 'Microsoft.Sql/servers@2023-08-01-preview' = {
name: sqlserverName
location: location
properties: {
administratorLogin: sqlAdministratorLogin
administratorLoginPassword: sqlAdministratorLoginPassword
version: '12.0'
}
}
var databaseName = 'ToyCompanyWebsite'
resource sqlserverName_databaseName 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
name: '${sqlserver.name}/${databaseName}'
location: location
sku: {
name: 'Basic'
}
properties: {
collation: 'SQL_Latin1_General_CP1_CI_AS'
maxSizeBytes: 1073741824
}
}
resource sqlserverName_AllowAllAzureIPs 'Microsoft.Sql/servers/firewallRules@2023-08-01-preview' = {
name: '${sqlserver.name}/AllowAllAzureIPs'
properties: {
endIpAddress: '0.0.0.0'
startIpAddress: '0.0.0.0'
}
dependsOn: [
sqlserver
]
}
resource productmanuals 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-05-01' = {
name: '${storageAccount.name}/default/${productmanualsName}'
}
resource hostingPlan 'Microsoft.Web/serverfarms@2023-12-01' = {
name: hostingPlanName
location: location
sku: {
name: skuName
capacity: skuCapacity
}
}
resource webSite 'Microsoft.Web/sites@2023-12-01' = {
name: webSiteName
location: location
properties: {
serverFarmId: hostingPlan.id
siteConfig: {
appSettings: [
{
name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
value: AppInsights_webSiteName.properties.InstrumentationKey
}
{
name: 'StorageAccountConnectionString'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${listKeys(storageAccount.id, storageAccount.apiVersion).keys[0].value}'
}
]
}
}
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${msi.id}': {}
}
}
}
// We don't need this anymore. We use a managed identity to access the database instead.
//resource webSiteConnectionStrings 'Microsoft.Web/sites/config@2020-06-01' = {
// name: '${webSite.name}/connectionstrings'
// properties: {
// DefaultConnection: {
// value: 'Data Source=tcp:${sqlserver.properties.fullyQualifiedDomainName},1433;Initial Catalog=${databaseName};User Id=${sqlAdministratorLogin}@${sqlserver.properties.fullyQualifiedDomainName};Password=${sqlAdministratorLoginPassword};'
// type: 'SQLAzure'
// }
// }
//}
resource msi 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = {
name: managedIdentityName
location: location
}
resource roleassignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(roleDefinitionId, resourceGroup().id)
properties: {
principalType: 'ServicePrincipal'
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
principalId: msi.properties.principalId
}
}
resource AppInsights_webSiteName 'Microsoft.Insights/components@2020-02-02' = {
name: 'AppInsights'
location: location
kind: 'web'
properties: {
Application_Type: 'web'
}
}
Créer et enregistrer le modèle Bicep
Tout au long de ce module, vous allez apporter des modifications qui améliorent le modèle. Vous suivrez les meilleures pratiques pour en faciliter la lecture et la compréhension et permettre à vos collègues de l’utiliser plus facilement.
Dans un premier temps, vous devez créer le fichier Bicep et l’enregistrer localement pour pouvoir y travailler dessus.
Ouvrez Visual Studio Code.
Créez un fichier nommé main.bicep.
Copiez le modèle Bicep précédent, puis collez-le dans le fichier.
Enregistrez les modifications du fichier.
Important
Le processus qui consiste à améliorer du code en le réorganisant et en le renommant s’appelle refactorisation. Quand vous refactorisez du code, il est judicieux d’utiliser un système de contrôle de version tel que Git. La gestion de version vous permet d’apporter des modifications à votre code, d’annuler ces modifications ou de revenir à une version précédente.
Dans ce module, vous n’êtes pas tenu d’utiliser Git pour assurer le suivi de votre fichier. Cependant, vous avez tout intérêt à envisager cette option extrêmement utile.