Blog
Bereitstellen einer Python Azure-Funktion als .zip

Bereitstellen einer Python Azure-Funktionsanwendung als .zip mit Remote Building
Bei der Arbeit an einer Python Azure-Funktionsanwendung hatte ich Probleme mit der Bereitstellung von Ressourcen über Terraform und der anschließenden Bereitstellung des Projekts selbst als .zip mit Remote-Build über die Azure CLI. In diesem Beitrag zeige ich anhand eines relativ kleinen Beispiels, wie ich es geschafft habe, und auf welche zwei Fallstricke ich gestoßen bin.
Sie können meine Beispiellösung in diesem Github Repo sehen. Lesen Sie die README, um das Beispiel selbst einzusetzen.
Warum als .zip bereitstellen?
Der Grund, warum Sie die Funktion als .zip-Datei verpacken und bereitstellen möchten, ist ein dreifacher.
- Dieser Ansatz ist ähnlich, erfordert aber ein Tool weniger als die Verwendung von
func azure functionapp publish. - Das Projekt war ein wenig gewachsen und es war mühsam geworden, die Datei
.funcignorezu aktualisieren. Daher war es einfacher, die Dateien und Ordner auszuwählen, die mit der Funktionsanwendung zusammenhängen, und diese zu verpacken. - Ich finde es gut, dass ein Remote-Build verhindert, dass die Macken des lokalen Systems, das ich verwende, nach außen dringen.
Wenn Sie daran interessiert sind, die Funktionsanwendung lokal zu erstellen und diese direkt mit Terraform zu implementieren, sollten Sie sich diesen Beitrag von Niels ansehen.
Azure Portal vs. Terraform
Bei diesem Projekt begann ich mit der manuellen Bereitstellung von Ressourcen über die Azure-Portal-Website. Als das Basissystem dann aber betriebsbereit war, stieß ich auf den ersten Fallstrick, als ich begann, die Ressourcen über Terraform bereitzustellen. Es gibt einen subtilen, aber entscheidenden Unterschied zwischen der Konfiguration von Funktionsanwendungen über das Azure-Portal und Terraform (azurerm_function_app).
Der Unterschied besteht darin, dass das Azure-Portal automatisch FUNCTIONS_WORKER_RUNTIME = "python" für Python-Funktions-Apps einstellt, während Terraform dies nicht tut. Ein Teil des Problems besteht darin, dass diese Einstellung nicht in der JSON-Definition der Funktions-App auftaucht. Die Ressourcendefinitionen sehen zwar gleich aus, sind es aber im Grunde nicht.
Wenn Sie einen Remote-Build auslösen, prüft Azure CLI außerdem, ob SCM_DO_BUILD_DURING_DEPLOYMENT = true vorhanden ist, und wenn nicht, wird dieser Wert gesetzt. Aber diese Logik gilt nicht für FUNCTIONS_WORKER_RUNTIME.
Nachfolgend finden Sie den relevanten Abschnitt, wie ich meine Funktions-App-Ressource letztendlich konfiguriert habe. Die vollständige Terraform-Konfiguration und die Variablen finden Sie im Repo.
resource "azurerm_function_app" "function_app" {
...
site_config {
linux_fx_version = "Python|3.9"
}
app_settings = {
SCM_DO_BUILD_DURING_DEPLOYMENT = true
FUNCTIONS_WORKER_RUNTIME = "python"
}
}
.zip-Inhalt
Das zweite Problem, auf das ich gestoßen bin, ist, dass ich dachte, dass der Remote-Build-Prozess aufgrund eines Problems mit dem Inhalt der .zip-Datei fehlschlägt und ich keine gute Übersicht über den Mindestinhalt einer solchen .zip-Datei finden konnte. Ich hoffe also, dass eine schriftliche Liste anderen helfen wird, und glücklicherweise stellt sich heraus, dass es ziemlich einfach ist.
Die Anforderungen sind:
- die Funktion app
host.jsonDatei - alle Funktionsordner, die
function.jsonund die Python-Datei enthalten, auf die sie sich alsscriptFile - alle Dateien und Ordner mit Geschäftslogik, die für die Funktionen benötigt werden
- die Datei
requirements.txt.
Der Kommandozeilen-Zip-Befehl, den ich für das Beispiel-Repos verwende (generiert von der Terraform-Ressource deploy_azure_function ), lautet:
zip -r build/function_app.zip
app/ function/ host.json requirements.txt
-x '*__pycache__*'
Beachten Sie, dass Niels in seinem Blogbeitrag auch gezeigt hat, wie man ein Zip mit Terraform erstellt. Dieses Beispiel müsste jedoch für das Projekt, an dem ich arbeite, erweitert/geändert werden, da die erforderlichen Dateien und Ordner nicht alle in einem einzigen Ordner zusammengefasst sind.
Auslösen von Remote Build & Deployment
Nachdem ich die .zip-Datei erstellt habe, stelle ich die Beispielfunktions-App wie folgt mit der Azure CLI bereit:
az functionapp deployment source config-zip
--resource-group devzipdeploy
--name dev-zipdeploy-functions
--src build/function_app.zip
--build-remote true
--verbose
Ich füge gerne die Flagge --verbose hinzu, damit ich die einzelnen Phasen des Bauprozesses sehen kann, während sie passieren.
Einpacken
Und schon können wir Ressourcen in Azure aufsetzen und unsere Python-Funktions-App von Azure erstellen und bereitstellen lassen. Ich hoffe, dass dieser Beitrag und das Github-Beispiel dazu beitragen, den Prozess etwas einfacher zu gestalten und die Fallstricke zu vermeiden, auf die ich gestoßen bin.
Namensnennung: zip-Symbol erstellt von Freepik - Flaticon
Verfasst von
Jelle Jan Bankert
Unsere Ideen
Weitere Blogs
Contact



