Mit Azure Functions können Sie ganz einfach kleine Codestücke in der Cloud ausführen. Um dies richtig zu machen, müssen Sie eine kontinuierliche Bereitstellung der Infrastruktur und des Codes einrichten. Andernfalls haben Sie am Ende eine unkontrollierte Umgebung, in der niemand weiß, welcher Code tatsächlich ausgeführt wird. In diesem Blogbeitrag beschreibe ich, wie Sie eine Bereitstellungspipeline für Funktionen mit VSTS einrichten. Damit können Sie Funktionen als Infrastructure as Code bereitstellen.
Aus Sicht der Bereitstellung besteht eine Azure-Funktion aus zwei Teilen:
- Azure Infrastruktur
- Funktionscode
Sowohl die ARM-Vorlage als auch der Code können von VSTS aus bereitgestellt werden. Auf diese Weise können Sie die Funktionen wie jede andere Azure-Ressource verwalten.
Erstellen Sie Ihre erste Funktion:
- Laden Sie die Azure Functions CLI herunter
- Erstellen Sie eine Funktion von der Kommandozeile aus mit: func init
Erstellen Sie einen Build Mit dem Build bereiten Sie das Artefakt für die eigentlichen Veröffentlichungsschritte vor. Er kopiert die ARM-Vorlage und den Quellcode der Funktion in das richtige Verzeichnis im ArtifactStagingDirectory. Als letzten Schritt führt er eine Veröffentlichung des ArtifactStagingDirectory durch. Sie können auch Tests hinzufügen. Die Build-Pipeline sieht folgendermaßen aus:
Der Quellcode für die Funktion ist wie folgt aufgebaut:
src | - host.json | - MyTimerFunction | | - function.json | | - project.json | | - run.csx
Alle Dateien müssen in das ArtifactStagingDirectory kopiert werden.
Stellen Sie die Infrastruktur bereit Die Bereitstellung der Azure-Infrastruktur kann über eine ARM-Vorlage erfolgen. In der Bereitstellungspipeline ist der erste Schritt die Validierung der ARM-Vorlage, der zweite Schritt die Bereitstellung in einer Testumgebung und der letzte Schritt die Bereitstellung in der Produktionsumgebung. Die Infrastruktur unter der Azure-Funktion ist:
- Azure Speicher-Konto
- Hosting-Plan
- Funktion App
In VSTS kann die Vorlage mit der Aufgabe Azure Resource Group Deployment validiert und bereitgestellt werden. Eine Beispiel-ARM-Vorlage, die für die Bereitstellung der Infrastruktur verwendet werden kann:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"Parameter": {
"functionappname": {
"Typ": "string"
}
},
"Variablen": {
"serviceplanname": "[concat('funktionsserviceplan-',parameters('funktionsappname'),'-', uniqueString(resourceGroup().id))]",
"functionstoragename": "[substring(toLower(concat('st',parameters('functionappname')), uniqueString(resourceGroup().id))),0,24)]"
},
"Ressourcen": [
{
"name": "[variables('serviceplanname')]",
"Typ": "Microsoft.Web/Serverfarmen",
"Art": "functionapp",
"sku": {
"Name": "Y1",
"Stufe": "Dynamisch",
"Größe": "Y1",
"Familie": "Y",
"Kapazität": 0
},
"apiVersion": "2015-08-01",
"Standort": "[resourceGroup().location]",
"Eigenschaften": { "name": "[variables('serviceplanname')]" }
},
{
"Typ": "Microsoft.Storage/storageAccounts",
"name": "[variables('functionstoragename')]",
"apiVersion": "2016-01-01",
"sku": {"name": "Standard_LRS" },
"Standort": "[resourceGroup().location]",
"Art": "Speicherung"
},
{
"Typ": "Microsoft.Web/sites",
"Art": "functionapp",
"Name": "[parameters('functionappname')]",
"apiVersion": "2015-08-01",
"Standort": "[resourceGroup().location]",
"Eigenschaften": {
"Name": "[parameters('functionappname')]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('serviceplanname'))]",
"hostNames": [ "[concat(parameters('functionappname'),'.azurewebsites.net')]" ],
"enabledHostNames": [
"[concat(parameters('functionappname'),'.azurewebsites.net')]",
"[concat(parameters('functionappname'),'.scm.azurewebsites.net')]"
],
"siteConfig": {
"appSettings": [
{ "name": "FUNCTIONS_EXTENSION_VERSION", "Wert": "~1" },
{ "name": "AzureWebJobsDashboard", "Wert": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('functionstoragename'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('functionstoragename')), providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value)]" },
{ "name": "AzureWebJobsStorage", "Wert": "[concat('DefaultEndpointsProtocol=https;AccountName=',variables('functionstoragename'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('functionstoragename')), providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value)]" },
{ "name": "WEBSITE_NODE_DEFAULT_VERSION", "Wert": "6.5.0" }
]
}
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', variables('serviceplanname'))]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('functionstoragename'))]"
]
}
]
}
Mit dieser Vorlage wird die gesamte Infrastruktur bereitgestellt, die für die Bereitstellung der eigentlichen Funktionen erforderlich ist.
Freigeben des Codes
Als letzter Schritt der Freigabe wird der Code in der Funktionsapp bereitgestellt. Hierfür wird die Aufgabe
Jetzt sind Sie bereit, Ihre erste Funktion mit Ihrer Deployment-Pipeline einzusetzen.
Verfasst von
Peter Groenewegen
Unsere Ideen
Weitere Blogs
Contact



