Créer des Web Apps dans un ASE v3

Ousmane Barry
4 min readDec 14, 2022

--

Cet article est la suite de l’article : Créer des App Service Plan dans un ASE v3. Sur ce premier article, nous avons vu comment créer des ASPs dans la landing zone des équipes applicatives qui sont hébergés dans un ASE v3 qui se trouve dans la souscription Shared Services géré par l’équipe Infra Cloud.

Dans cet article, nous allons voir comment créer des Web Apps pour héberger des applications Web avec UI ou des APIs supportant multiples langages et frameworks : ASP.NET, ASP.NET Core, Java, Ruby, Node.js, PHP, or Python. Sur ce même site, nous pourrons aussi héberger des services en arrière plan (Web Jobs). C’est un service très versatile car il permet aussi d’héberger des conteneurs Docker, des Fonctions ou des Logic Apps. Nous verrons tout ça dans des articles dédiés :).

Code Bicep pour créer un Web App

Je vais essayer d’apporter certains éclaircissements par rapport à certains paramètres et lignes :

  • aspResourceGroupName : le Resource Group qui contient l’ASP. Car la Web App peut être dans un RG différent de l’ASP. Cela fait sens lorsque dans une équipe on veut mutualiser l’ASP pour plusieurs web apps contenues dans leur RG respectif
  • managedIdentityName : ce paramètre permet de définir l’identity de la Web App en utilisant un user managed identity. S’il n’est pas défini, j’active le System Assigned Identity pour la Web App
  • runFromPackage : paramètre très important à mettre à true si vous déployez votre application en utilisant un package zip via Azure DevOps par exemple.
  • module settings : ce module contient les configurations du proxy et des urls internes d’Azure qui ne doivent pas passer par le proxy. Ce module sera réutilisé par les autres modules (Containers, Functions, etc….).
  • keyVaultReferenceIdentity : c’est un paramètre très important à configurer si vous utilisez une user assigned managed identity et les Key Vault Reference pour que la Web App puisse accéder aux secrets du Key Vault
  • autres points : ftp désactivé, minimum TLS version à 1.2, httpsOnly. Il est important de rajouter des Azure Policy pour refuser la création de Web App si ces propriétés ne sont pas correctement configurées.
  • activation des logs pour les requêtes http
param aspResourceGroupName string = resourceGroup().name
param aspName string
param webAppName string
param managedIdentityName string = ''
param location string = resourceGroup().location
param tags object = {}

@description('application settings in array format: appSettings = [{name: \'settings_name\', value: \'setting_value\'}{...}]')
param appSettings array = []

param runFromPackage bool = false

var shouldUseManagedIdentity = !empty(managedIdentityName)

resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' existing = {
name: aspName
scope: resourceGroup(aspResourceGroupName)
}

module settings '../settings.bicep' = {
name: 'common-settings-${webAppName}'
}

resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' existing = if (shouldUseManagedIdentity) {
name: managedIdentityName
}

resource webApp 'Microsoft.Web/sites@2022-03-01' = {
name: webAppName
location: location
tags: tags
properties:{
serverFarmId: appServicePlan.id
siteConfig:{
alwaysOn: true
ftpsState: 'Disabled'
appSettings: runFromPackage ? concat(settings.outputs.defaultAppSettings, appSettings, [{name: 'WEBSITE_RUN_FROM_PACKAGE', value: 1}]) : concat(settings.outputs.defaultAppSettings, appSettings)
use32BitWorkerProcess: false
minTlsVersion: '1.2'
}
keyVaultReferenceIdentity: shouldUseManagedIdentity ? managedIdentity.id : 'SystemAssigned'
httpsOnly: true
}
identity: {
type: shouldUseManagedIdentity ? 'UserAssigned' : 'SystemAssigned'
userAssignedIdentities: shouldUseManagedIdentity ? {
'${managedIdentity.id}': {}
}: null
}
}

resource appLogs 'Microsoft.Web/sites/config@2022-03-01' = {
parent: webApp
name: 'logs'
properties: {
httpLogs:{
fileSystem:{
enabled: true
retentionInMb: 50
retentionInDays: 3
}
}
detailedErrorMessages:{
enabled: true
}
failedRequestsTracing:{
enabled: true
}
}
}

output webappUrl string = webApp.properties.defaultHostName
output identityId string = webApp.identity.principalId

Comme pour l’ASP, ce module doit être publié dans Azure en tant que template spec pour que ça soit réutilisable par les équipes applicatives.

$subscriptionId = '8364de18-b22e-40ea-a2ba-d3744f33df98'
az login
az account set -s $subscriptionId
az ts create --name WeAppOnASE `
--resource-group rg-templatespecs `
--description "Deploy an Web App on the ASEs" `
--template-file main.bicep `
--version 2022-12-02

Après publication, le RG rg-templatespecs contient maintenant 2 modules Bicep utilisables par les équipes applicatives pour créer un ASP et une Web App hébergée dans cet ASP.

Créer une Web App avec le module Bicep WebAppOnASE (template spec)

Dans le premier article, j’ai montré comment créé un ASP en utilisant le template spec. Je vais l’enrichir pour créer y ajouter la création d’un user assigned identity, d’une Web App et assigner l’identity à la Web App.

param aspName string = 'asp-nonprod-win-01'
param operatingSystem string = 'windows'
param appServicePlanSize string = 'I1v2'
param aseEnvironment string = 'NonProduction'

param location string = resourceGroup().location
param tags object = {}

// 2 nouveaux paramètres supplémentaires
param webAppName string = 'app-mywebapp-dev-01'
param managedIdentityName string = 'id-mywebapp-dev-01'

module appServicePlan 'ts/CoreSpecs:ASPonASE:2022-12-02' = {
name: 'deploy-appserviceplan'
params: {
aspName: aspName
aseEnvironment: aseEnvironment
operatingSystem: operatingSystem
appServicePlanSize: appServicePlanSize
location: location
tags: tags
}
}

// Création de la User Assigned Identity
resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
name: managedIdentityName
location: location
}

// Création de la Web App en utilisant le template spec
// On fournit le nom de l'ASP ci-dessus et le nom du Managed Identity
module webApp 'ts/CoreSpecs:WeAppOnASE:2022-12-02' = {
name: 'deploy-webapp'
params:{
aspName: aspName
webAppName: webAppName
managedIdentityName: managedIdentity.name
location: location
}
dependsOn: [appServicePlan]
}

Conclusion

Sur cet article, j’ai enrichi les templates specs avec un nouveau module pour créer des Web Apps et j’ai fourni le sample pour les équipes applicatives pour créer un ASP, une identity, une Web App et assigner l’identity à la Web App. Dans le prochain article, nous allons voir comment déployer tout ça via Azure DevOps.

Pour rappels voici les repos:

  • bicep-modules : repository central qui contient les modules Bicep pour toutes les équipes et qui sont publiées comme Template Specs dans Azure. Le but est d’éviter que chaque équipe recrée de son côté les mêmes modules. Ainsi, nous pouvons mutualiser et tout le monde pourra l’enrichir ou corriger des bugs via pull requests (inner sourcing :)).
  • project-startup-template : un repository template configuré pour utiliser les modules Bicep publiés dans Azure. Les équipes applicatives utiliseront ce template pour démarrer leur projet.

--

--

Ousmane Barry
Ousmane Barry

Written by Ousmane Barry

Azure Solutions Architect. Coding most of the time with .NET C#.

No responses yet