-
-
Save christopheranderson/ec6ab6b1eae152fca5321f4044b33d1d to your computer and use it in GitHub Desktop.
{ | |
"$schema": "http://schemas.management.azure.com/schemas/2015-01-01-preview/deploymentTemplate.json#", | |
"contentVersion": "1.0.0.0", | |
"parameters": { | |
"appName": { | |
"type": "string", | |
"metadata": { | |
"description": "The name of the function app that you wish to create." | |
} | |
}, | |
"storageAccountType": { | |
"type": "string", | |
"defaultValue": "Standard_LRS", | |
"allowedValues": [ | |
"Standard_LRS", | |
"Standard_GRS", | |
"Standard_ZRS", | |
"Premium_LRS" | |
], | |
"metadata": { | |
"description": "Storage Account type" | |
} | |
}, | |
"_artifactsLocation": { | |
"type": "string" | |
}, | |
"_artifactsLocationSasToken": { | |
"type": "securestring" | |
}, | |
"SampleFunctionAppPackageFolder": { | |
"type": "string", | |
"minLength": 1, | |
"defaultValue": "SampleFunctionApp", | |
"metadata": { | |
"description": "WebDeploy package location. This path is relative to the _artifactsLocation parameter" | |
} | |
}, | |
"SampleFunctionAppPackageFileName": { | |
"type": "string", | |
"minLength": 1, | |
"defaultValue": "package.zip", | |
"metadata": { | |
"description": "Name of the webdeploy package" | |
} | |
} | |
}, | |
"variables": { | |
"functionAppName": "[parameters('appName')]", | |
"hostingPlanName": "[parameters('appName')]", | |
"storageAccountName": "[concat(uniquestring(resourceGroup().id), 'azfunctions')]" | |
}, | |
"resources": [ | |
{ | |
"type": "Microsoft.Storage/storageAccounts", | |
"name": "[variables('storageAccountName')]", | |
"apiVersion": "2015-06-15", | |
"location": "[resourceGroup().location]", | |
"properties": { | |
"accountType": "[parameters('storageAccountType')]" | |
}, | |
"tags": { | |
"displayName": "Azure Functions Storage Account" | |
} | |
}, | |
{ | |
"type": "Microsoft.Web/serverfarms", | |
"apiVersion": "2015-04-01", | |
"name": "[variables('hostingPlanName')]", | |
"location": "[resourceGroup().location]", | |
"properties": { | |
"name": "[variables('hostingPlanName')]", | |
"computeMode": "Dynamic", | |
"sku": "Dynamic" | |
}, | |
"tags": { | |
"displayName": "Consumption Plan" | |
} | |
}, | |
{ | |
"apiVersion": "2015-08-01", | |
"type": "Microsoft.Web/sites", | |
"name": "[variables('functionAppName')]", | |
"tags": { | |
"displayName": "SampleFunctionApp" | |
}, | |
"location": "[resourceGroup().location]", | |
"kind": "functionapp", | |
"properties": { | |
"name": "[variables('functionAppName')]", | |
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]" | |
}, | |
"dependsOn": [ | |
"[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", | |
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" | |
], | |
"resources": [ | |
{ | |
"apiVersion": "2016-03-01", | |
"name": "appsettings", | |
"type": "config", | |
"dependsOn": [ | |
"[resourceId('Microsoft.Web/sites', variables('functionAppName'))]", | |
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]" | |
], | |
"properties": { | |
"AzureWebJobsStorage": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listkeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2015-05-01-preview').key1,';')]", | |
"AzureWebJobsDashboard": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listkeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2015-05-01-preview').key1,';')]", | |
"FUNCTIONS_EXTENSION_VERSION": "latest", | |
"command": "deploy.cmd" | |
} | |
}, | |
{ | |
"name": "MSDeploy", | |
"type": "extensions", | |
"location": "[resourceGroup().location]", | |
"apiVersion": "2015-08-01", | |
"dependsOn": [ | |
"[resourceId('Microsoft.Web/sites', variables('functionAppName'))]" | |
], | |
"tags": { | |
"displayName": "SampleFunctionAppPackage" | |
}, | |
"properties": { | |
"packageUri": "[concat(parameters('_artifactsLocation'), '/', parameters('SampleFunctionAppPackageFolder'), '/', parameters('SampleFunctionAppPackageFileName'), parameters('_artifactsLocationSasToken'))]", | |
"dbType": "None", | |
"connectionString": "", | |
"setParameters": { | |
"IIS Web Application Name": "[variables('functionAppName')]" | |
} | |
} | |
} | |
] | |
} | |
] | |
} |
Having the config change depend on MSDeploy actually erases the function app code for me :\
We can avoid race condition by making appSettings to depend on MSDeploy.
More info - https://blogs.msdn.microsoft.com/hosamshobak/2016/05/26/arm-template-msdeploy-race-condition-issue/
@christopheranderson Do you know of an equivalent of MSDeploy for Linux App Services. I am trying to use packageUri to deploy a web app from a zip folder stored in blob. I have the SAS token.
@christopheranderson Do you know of an equivalent of MSDeploy for Linux App Services. I am trying to use packageUri to deploy a web app from a zip folder stored in blob. I have the SAS token.
have you found the answer for this ?
@prgnanamprayen try reading this doc and see if that answers your question: https://docs.microsoft.com/en-us/azure/app-service/deploy-run-package
Thanks for this sample, it came pretty useful. One note though, the MSDeploy step can sometimes face a race condition with the config change due to this.
Adding
"[concat('Microsoft.Web/sites/', variables('functionAppName'), '/Extensions/MSDeploy')]",
to thedependsOn
onappSettings
seemed to solve it.