I'm using ARM templates to deploy our infrastructure which includes Azure Web Apps. As part of the deployment I would like to make sure backups are enabled for them instead of having to do this manually post deployment. Is this possible? If not, what would be a good alternative instead of manually enabling the backups?
I can't find any docs or samples about config azure app service backups in ARM templates, but you can use Azure PowerShell to create your app service and config backup for it automatically.
Try the powershell below :
$name = '<name of your solution>'
$location = '<location of your solution>'
$ResourceGroupName = $name
$sites_appwithbackup_name = $name
$serverfarms_webappwithbackup_name = $name
$components_appwithbackup_name = $name
$storageAccounts_webappbk_name = $name
try {
New-AzResourceGroup -Name $ResourceGroupName -Location $location
Start-Sleep -Seconds 5
New-AzResourceGroupDeployment -ResourceGroupName $ResourceGroupName -TemplateFile "<path of template file>" -sites_appwithbackup_name $sites_appwithbackup_name -serverfarms_webappwithbackup_name $serverfarms_webappwithbackup_name -components_appwithbackup_name $components_appwithbackup_name -storageAccounts_webappbk_name $storageAccounts_webappbk_name -location $location
$webapp = Get-AzWebApp -Name $sites_appwithbackup_name -ResourceGroupName $ResourceGroupName
$storage = Get-AzStorageAccount -Name $storageAccounts_webappbk_name -ResourceGroupName $ResourceGroupName
$storageContainerSAS = New-AzStorageContainerSASToken -Context $storage.Context -Name "backup" -Permission "rwdl" -ExpiryTime (Get-Date -Year 2300)
$storageContainerURL = $storage.Context.BlobEndPoint + "backup" + $storageContainerSAS
Edit-AzWebAppBackupConfiguration -FrequencyInterval 30 -FrequencyUnit Day -RetentionPeriodInDays 30 -WebApp $webapp -StorageAccountUrl $storageContainerURL
}
catch {
Remove-AzResourceGroup -Name $ResourceGroupName
}
This is my template in this case :
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"sites_appwithbackup_name": {
"type": "String"
},
"serverfarms_webappwithbackup_name": {
"type": "String"
},
"components_appwithbackup_name": {
"type": "String"
},
"storageAccounts_webappbk_name": {
"type": "String"
},
"location": {
"type": "String"
}
},
"variables": {},
"resources": [
{
"type": "microsoft.insights/components",
"apiVersion": "2015-05-01",
"name": "[parameters('components_appwithbackup_name')]",
"location": "[parameters('location')]",
"kind": "web",
"properties": {
"Application_Type": "web",
"Request_Source": "IbizaWebAppExtensionCreate"
}
},
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2019-04-01",
"name": "[parameters('storageAccounts_webappbk_name')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_RAGRS",
"tier": "Standard"
},
"kind": "StorageV2",
"properties": {
"networkAcls": {
"bypass": "AzureServices",
"virtualNetworkRules": [],
"ipRules": [],
"defaultAction": "Allow"
},
"supportsHttpsTrafficOnly": true,
"encryption": {
"services": {
"file": {
"enabled": true
},
"blob": {
"enabled": true
}
},
"keySource": "Microsoft.Storage"
},
"accessTier": "Hot"
}
},
{
"type": "Microsoft.Web/serverfarms",
"apiVersion": "2016-09-01",
"name": "[parameters('serverfarms_webappwithbackup_name')]",
"location": "[parameters('location')]",
"sku": {
"name": "S1",
"tier": "Standard",
"size": "S1",
"family": "S",
"capacity": 1
},
"kind": "app",
"properties": {
"name": "[parameters('serverfarms_webappwithbackup_name')]",
"perSiteScaling": false,
"reserved": false,
"targetWorkerCount": 0,
"targetWorkerSizeId": 0
}
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices",
"apiVersion": "2019-04-01",
"name": "[concat(parameters('storageAccounts_webappbk_name'), '/default')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_webappbk_name'))]"
],
"properties": {
"cors": {
"corsRules": []
},
"deleteRetentionPolicy": {
"enabled": false
}
}
},
{
"type": "Microsoft.Web/sites",
"apiVersion": "2016-08-01",
"name": "[parameters('sites_appwithbackup_name')]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', parameters('serverfarms_webappwithbackup_name'))]"
],
"kind": "app",
"properties": {
"enabled": true,
"hostNameSslStates": [
{
"name": "[concat(parameters('sites_appwithbackup_name'), '.azurewebsites.net')]",
"sslState": "Disabled",
"hostType": "Standard"
},
{
"name": "[concat(parameters('sites_appwithbackup_name'), '.scm.azurewebsites.net')]",
"sslState": "Disabled",
"hostType": "Repository"
}
],
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('serverfarms_webappwithbackup_name'))]",
"reserved": false,
"scmSiteAlsoStopped": false,
"clientAffinityEnabled": true,
"clientCertEnabled": false,
"hostNamesDisabled": false,
"containerSize": 0,
"dailyMemoryTimeQuota": 0,
"httpsOnly": false
}
},
{
"type": "Microsoft.Web/sites/config",
"apiVersion": "2016-08-01",
"name": "[concat(parameters('sites_appwithbackup_name'), '/web')]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.Web/sites', parameters('sites_appwithbackup_name'))]"
],
"properties": {
"numberOfWorkers": 1,
"defaultDocuments": [
"Default.htm",
"Default.html",
"Default.asp",
"index.htm",
"index.html",
"iisstart.htm",
"default.aspx",
"index.php",
"hostingstart.html"
],
"netFrameworkVersion": "v4.0",
"phpVersion": "5.6",
"pythonVersion": "",
"nodeVersion": "",
"linuxFxVersion": "",
"requestTracingEnabled": false,
"remoteDebuggingEnabled": false,
"httpLoggingEnabled": false,
"logsDirectorySizeLimit": 35,
"detailedErrorLoggingEnabled": false,
"publishingUsername": "$appwithbackup",
"scmType": "None",
"use32BitWorkerProcess": true,
"webSocketsEnabled": false,
"alwaysOn": true,
"appCommandLine": "",
"managedPipelineMode": "Integrated",
"virtualApplications": [
{
"virtualPath": "/",
"physicalPath": "site\\wwwroot",
"preloadEnabled": true,
"virtualDirectories": null
}
],
"winAuthAdminState": 0,
"winAuthTenantState": 0,
"customAppPoolIdentityAdminState": false,
"customAppPoolIdentityTenantState": false,
"loadBalancing": "LeastRequests",
"routingRules": [],
"experiments": {
"rampUpRules": []
},
"autoHealEnabled": false,
"vnetName": "",
"siteAuthEnabled": false,
"siteAuthSettings": {
"enabled": null,
"unauthenticatedClientAction": null,
"tokenStoreEnabled": null,
"allowedExternalRedirectUrls": null,
"defaultProvider": null,
"clientId": null,
"clientSecret": null,
"clientSecretCertificateThumbprint": null,
"issuer": null,
"allowedAudiences": null,
"additionalLoginParams": null,
"isAadAutoProvisioned": false,
"googleClientId": null,
"googleClientSecret": null,
"googleOAuthScopes": null,
"facebookAppId": null,
"facebookAppSecret": null,
"facebookOAuthScopes": null,
"twitterConsumerKey": null,
"twitterConsumerSecret": null,
"microsoftAccountClientId": null,
"microsoftAccountClientSecret": null,
"microsoftAccountOAuthScopes": null
},
"localMySqlEnabled": false,
"http20Enabled": false,
"minTlsVersion": "1.2",
"ftpsState": "AllAllowed",
"reservedInstanceCount": 0,
"fileChangeAuditEnabled": false
}
},
{
"type": "Microsoft.Web/sites/hostNameBindings",
"apiVersion": "2016-08-01",
"name": "[concat(parameters('sites_appwithbackup_name'), '/', parameters('sites_appwithbackup_name'), '.azurewebsites.net')]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('Microsoft.Web/sites', parameters('sites_appwithbackup_name'))]"
],
"properties": {
"siteName": "appwithbackup",
"hostNameType": "Verified"
}
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices/containers",
"apiVersion": "2019-04-01",
"name": "[concat(parameters('storageAccounts_webappbk_name'), '/default/backup')]",
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccounts_webappbk_name'), 'default')]",
"[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccounts_webappbk_name'))]"
],
"properties": {
"publicAccess": "None"
}
}
]
}
Result on my side :
As you can see all required resources has been created and backup has been configed.
Hope it helps .