Erstellen Ihrer ersten containerisierten Azure Functions-Funktion
In diesem Artikel erstellen Sie eine Funktions-App, die in einem Linux-Container ausgeführt wird, und stellen sie in Azure Functions bereit.
Die Bereitstellung Ihres Funktionscodes in Azure Functions erfordert Hosting im Premium-Tarif oder in einem Dedizierten Tarif (App Service-Tarif). Wenn Sie diesen Artikel abschließen möchten, werden Kosten von einigen USD auf Ihrem Azure-Konto erhoben, die Sie durch Bereinigen der Ressourcen minimieren können, wenn Sie fertig sind.
Weitere Optionen zum Bereitstellen Ihres Funktions-App-Containers in Azure sind:
Azure Container Apps: Weitere Informationen finden Sie unter Bereitstellen eines Containers in Azure Container-Apps.
Azure Arc (derzeit in der Vorschauversion): Weitere Informationen finden Sie unter Bereitstellen eines Containers in Azure Arc.
Wählen der Programmiersprache
Zunächst verwenden Sie Azure Functions-Tools, um Ihren Projektcode als Funktions-App in einem Docker-Container mit einem sprachspezifischen Linux-Basisimage zu erstellen. Stellen Sie sicher, dass Sie die gewünschte Sprache oben im Artikel auswählen.
Core Tools generiert automatisch eine Dockerfile-Datei für Ihr Projekt, die die aktuellste Version des richtigen Basisimages für Ihre Funktionssprache verwendet. Sie sollten Ihren Container regelmäßig aus dem neuesten Basisimage aktualisieren und aus der aktualisierten Version Ihres Containers erneut bereitstellen. Weitere Informationen finden Sie unter Erstellen von containerisierten Funktions-Apps.
Voraussetzungen
Bevor Sie beginnen, müssen die folgenden Voraussetzungen erfüllt sein:
Installieren Sie das .NET 8.0 SDK.
Installieren Sie Azure Functions Core Tools (ab Version 4.0.5198).
- Installieren Sie Azure Functions Core Tools Version 4.x.
- Installieren Sie eine Version von Node.js, die von Azure Functions unterstützt wird.
- Installieren Sie eine Version von Python, die von Azure Functions unterstützt wird.
- Installieren Sie das .NET 6 SDK.
Installieren Sie eine Version des Java Developer Kit, die von Azure Functions unterstützt wird.
Installieren Sie Apache Maven Version 3.0 oder höher.
- Azure CLI ab Version 2.4.
Sollten Sie über kein Azure-Abonnement verfügen, können Sie zunächst ein kostenloses Azure-Konto erstellen.
Um das containerisierte Funktions-App-Image, das Sie erstellen, in einer Containerregistrierung zu veröffentlichen, benötigen Sie eine Docker-ID und Docker auf Ihrem lokalen Computer. Wenn Sie über keine Docker-ID verfügen, können Sie ein Docker-Konto erstellen.
Sie müssen auch den Abschnitt Erstellen einer Containerregistrierung des Container Registry-Schnellstarts abschließen, um eine Registrierungsinstanz zu erstellen. Notieren Sie sich den vollqualifizierten Namen Ihres Anmeldeservers.
Erstellen und Aktivieren einer virtuellen Umgebung
Führen Sie die folgenden Befehle in einem geeigneten Ordner aus, um eine virtuelle Umgebung mit dem Namen .venv
zu erstellen und zu aktivieren. Stellen Sie sicher, eine der von Azure Functions unterstützten Python-Versionen zu verwenden.
python -m venv .venv
source .venv/bin/activate
Führen Sie den folgenden Befehl aus, wenn über Python das venv-Paket auf Ihrer Linux-Distribution nicht installiert wurde:
sudo apt-get install python3-venv
Sie führen alle nachfolgenden Befehle in dieser aktivierten virtuellen Umgebung aus.
Erstellen und Testen des lokalen Funktionsprojekts
Führen Sie in einem Terminal oder an einer Eingabeaufforderung den folgenden Befehl für die gewählte Sprache aus, um ein Funktions-App-Projekt im aktuellen Ordner zu erstellen:
func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker
Führen Sie in einem leeren Ordner den folgenden Befehl aus, um das Functions-Projekt über einen Maven-Archetyp zu generieren:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker
Der -DjavaVersion
-Parameter teilt der Functions-Runtime mit, welche Version von Java verwendet werden soll. Verwenden Sie -DjavaVersion=11
, wenn Sie Ihre Funktionen in Java 11 ausführen möchten. Wenn Sie -DjavaVersion
nicht angeben, wird für Maven standardmäßig Java 8 verwendet. Weitere Informationen finden Sie unter Java-Versionen.
Wichtig
Damit Sie diesen Artikel durcharbeiten können, muss die Umgebungsvariable JAVA_HOME
auf den Installationsspeicherort der richtigen Version des JDK festgelegt sein.
Maven fordert Sie zur Eingabe von Werten auf, die erforderlich sind, um die Generierung des Projekts bei der Bereitstellung abzuschließen. Geben Sie an den Eingabeaufforderungen die folgenden Informationen an:
Prompt | Wert | BESCHREIBUNG |
---|---|---|
groupId | com.fabrikam |
Ein Wert, der Ihr Projekt projektübergreifend eindeutig identifiziert. Für den Wert müssen die Paketbenennungsregeln für Java eingehalten werden. |
artifactId | fabrikam-functions |
Der Name des Behälters (ohne Versionsnummer). |
version | 1.0-SNAPSHOT |
Wählen Sie den Standardwert aus. |
package | com.fabrikam.functions |
Das Java-Paket für den generierten Funktionscode. Verwenden Sie den Standardwert. |
Geben Sie zur Bestätigung Y
ein, oder drücken Sie die EINGABETASTE.
Maven erstellt die Projektdateien in einem neuen Ordner namens artifactId, in diesem Beispiel fabrikam-functions
.
Mit der Option --docker
wird eine Dockerfile-Datei für das Projekt generiert, in der ein geeigneter benutzerdefinierter Container zur Verwendung mit Azure Functions und der ausgewählten Runtime definiert wird.
Navigieren Sie zum Projektordner:
cd fabrikam-functions
Fügen Sie mit dem folgenden Befehl dem Projekt eine Funktion hinzu. Hierbei ist das --name
-Argument der eindeutige Name Ihrer Funktion, und mit dem --template
-Argument wird der Trigger der Funktion angegeben. func new
erstellt eine C#-Codedatei in Ihrem Projekt.
func new --name HttpExample --template "HTTP trigger"
Fügen Sie mit dem folgenden Befehl dem Projekt eine Funktion hinzu. Hierbei ist das --name
-Argument der eindeutige Name Ihrer Funktion, und mit dem --template
-Argument wird der Trigger der Funktion angegeben. Mit func new
wird ein Unterordner mit dem Funktionsnamen erstellt, der eine Konfigurationsdatei mit dem Namen func new
enthält.
func new --name HttpExample --template "HTTP trigger"
Starten Sie zum lokalen Testen der Funktion den lokalen Azure Functions-Runtimehost im Stammverzeichnis des Projektordners.
func start
func start
npm install
npm start
mvn clean package
mvn azure-functions:run
Wenn Sie sehen, dass der HttpExample
-Endpunkt in die Ausgabe geschrieben wurde, navigieren Sie zu diesem Endpunkt. In der Antwortausgabe sollte eine Willkommensnachricht angezeigt werden.
Wenn Sie sehen, dass der HttpExample
-Endpunkt in die Ausgabe geschrieben wurde, navigieren Sie zu http://localhost:7071/api/HttpExample?name=Functions
. Im Browser muss eine Begrüßungsnachricht mit Functions
(dem für den Abfrageparameter name
angegebenen Wert) angezeigt werden.
Drücken Sie STRG+C (Command+C unter macOS), um den Host zu beenden.
Erstellen und lokales Überprüfen des Containerimages
(Optional) Untersuchen Sie die Dockerfile im Stammverzeichnis des Projektordners. In der Dockerfile wird die Umgebung beschrieben, die zum Ausführen der Funktions-App unter Linux benötigt wird. Die vollständige Liste mit den unterstützten Basisimages für Azure Functions finden Sie auf der Seite mit Azure Functions-Basisimages.
Führen Sie im Stammprojektordner den Befehl docker build aus, und geben Sie einen Namen (azurefunctionsimage
) und ein Tag (v1.0.0
) an. Ersetzen Sie <DOCKER_ID>
durch Ihre Docker Hub-Konto-ID. Dieser Befehl erstellt das Docker-Image für den Container.
docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
Nachdem der Befehl abgeschlossen wurde, können Sie den neuen Container lokal ausführen.
Führen Sie das Image zum Überprüfen des Builds in einem lokalen Container aus, indem Sie den Befehl docker run verwenden, erneut <DOCKER_ID>
durch Ihre Docker Hub-Konto-ID ersetzen und das Portargument -p 8080:80
hinzufügen:
docker run -p 8080:80 -it <DOCKER_ID>/azurefunctionsimage:v1.0.0
Nachdem das Image im lokalen Container gestartet wurde, navigieren Sie zu http://localhost:8080/api/HttpExample
, das dieselbe Begrüßungsnachricht wie zuvor anzeigen muss. Da die von Ihnen erstellte von HTTP ausgelöste Funktion anonyme Autorisierung verwendet, können Sie die im Container ausgeführte Funktion aufrufen, ohne einen Zugriffsschlüssel abrufen zu müssen. Weitere Informationen finden Sie unter Autorisierungsschlüssel.
Nachdem das Image im lokalen Container gestartet wurde, navigieren Sie zu http://localhost:8080/api/HttpExample?name=Functions
, das dieselbe Begrüßungsnachricht wie zuvor anzeigen muss. Da die von Ihnen erstellte von HTTP ausgelöste Funktion anonyme Autorisierung verwendet, können Sie die im Container ausgeführte Funktion aufrufen, ohne einen Zugriffsschlüssel abrufen zu müssen. Weitere Informationen finden Sie unter Autorisierungsschlüssel.
Drücken Sie nach der Überprüfung der Funktions-App im Container STRG+C (Command+C unter macOS), um die Ausführung zu beenden.
Veröffentlichen des Containerimages in einer Registrierung
Um Ihr Containerimage für die Bereitstellung in einer Hostingumgebung verfügbar zu machen, müssen Sie es in eine Containerregistrierung pushen.
Azure Container Registry ist ein privater Registrierungsdienst zum Erstellen, Speichern und Verwalten von Containerimages und verwandten Artefakten. Sie sollten einen privaten Registrierungsdienst verwenden, um Ihre Container in Azure-Diensten zu veröffentlichen.
Verwenden Sie diesen Befehl, um sich mit Ihren aktuellen Azure-Anmeldeinformationen bei Ihrer Registrierungsinstanz anzumelden:
az acr login --name <REGISTRY_NAME>
Ersetzen Sie
<REGISTRY_NAME>
im vorherigen Befehl durch den Namen Ihres Container Registry-Instanz.Verwenden Sie diesen Befehl, um Ihr Image mit dem vollqualifizierten Namen Ihres Registrierungsanmeldeservers zu markieren:
docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Ersetzen Sie
<LOGIN_SERVER>
durch den vollqualifizierten Namen Ihres Registrierungsanmeldeservers und<DOCKER_ID>
durch Ihre Docker-ID.Verwenden Sie diesen Befehl, um den Container in Ihre Registrierungsinstanz zu pushen:
docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Erstellen von unterstützenden Azure-Ressourcen für Ihre Funktion
Zum Bereitstellen Ihres Containers in Azure müssen Sie drei Ressourcen erstellen:
- Eine Ressourcengruppe, bei der es sich um einen logischen Container für verwandte Ressourcen handelt.
- Ein Speicherkonto, das verwendet wird, um den Status und andere Informationen zu Ihren Funktionen zu verwalten.
- Eine Funktions-App, die als Umgebung zum Ausführen Ihres Funktionscodes dient. Eine Funktions-App ist Ihrem lokalen Funktionsprojekt zugeordnet und ermöglicht Ihnen das Gruppieren von Funktionen als logische Einheit, um die Verwaltung, Bereitstellung und Freigabe von Ressourcen zu vereinfachen.
Verwenden Sie die folgenden Befehle, um diese Elemente zu erstellen. Sowohl die Azure CLI als auch PowerShell werden unterstützt. Zum Erstellen Ihrer Azure-Ressourcen mit Azure PowerShell benötigen Sie auch das Az PowerShell-Modul Version 5.9.0 oder höher.
Melden Sie sich bei Azure an, falls dies noch nicht geschehen ist.
az login
Mit dem Befehl
az login
werden Sie bei Ihrem Azure-Konto angemeldet.Erstellen Sie eine Ressourcengruppe mit dem Namen
AzureFunctionsContainers-rg
in der ausgewählten Region.az group create --name AzureFunctionsContainers-rg --location <REGION>
Der Befehl
az group create
erstellt eine Ressourcengruppe. Ersetzen Sie im Befehl oben<REGION>
durch eine Region in Ihrer Nähe, indem Sie einen verfügbaren Regionscode verwenden, der mit dem Befehl<REGION>
zurückgegeben wird.Erstellen Sie in Ihrer Ressourcengruppe und Region ein universelles Speicherkonto.
az storage account create --name <STORAGE_NAME> --location <REGION> --resource-group AzureFunctionsContainers-rg --sku Standard_LRS
Der Befehl
az storage account create
erstellt ein Speicherkonto.Ersetzen Sie im vorherigen Beispiel
<STORAGE_NAME>
durch einen Namen, der für Sie geeignet und eindeutig in Azure Storage ist. Storage-Namen dürfen nur 3 bis 24 Zeichen lang sein und müssen ausschließlich Ziffern und Kleinbuchstaben enthalten. MitStandard_LRS
wird ein universelles Konto angegeben, das von Functions unterstützt wird.Verwenden Sie den Befehl, um einen Premium-Plan für Azure Functions mit dem Namen
myPremiumPlan
in der PreisstufemyPremiumPlan
(--sku EP1
) in Ihrer<REGION>
und in einem Linux-Container (--is-linux
) zu erstellen.az functionapp plan create --resource-group AzureFunctionsContainers-rg --name myPremiumPlan --location <REGION> --number-of-workers 1 --sku EP1 --is-linux
Wir verwenden hier den Premium-Plan, der je nach Bedarf skaliert werden kann. Weitere Informationen zum Hosting finden Sie unter Vergleich von Hostingplänen für Azure Functions. Weitere Informationen zum Berechnen von Kosten finden Sie auf der Seite „Azure Functions – Preise“.
Der Befehl erstellt in derselben Ressourcengruppe auch eine zugeordnete Azure Application Insights-Instanz, mit der Sie Ihre Funktions-App überwachen und Protokolle anzeigen können. Weitere Informationen finden Sie unter Überwachen von Azure Functions. Für die Instanz fallen erst Kosten an, wenn Sie sie aktivieren.
Erstellen und Konfigurieren einer Funktions-App in Azure mit dem Image
Mit einer Funktions-App in Azure wird die Ausführung der Funktionen Ihres Azure Functions-Hostingplans verwaltet. In diesem Abschnitt verwenden Sie die Azure-Ressourcen aus dem vorherigen Abschnitt, um eine Funktions-App aus einem Image in einer Containerregistrierung zu erstellen und mit einer Verbindungszeichenfolge für Azure Storage zu konfigurieren.
Erstellen Sie eine Funktions-App mit dem folgenden Befehl, abhängig von Ihrer Containerregistrierung:
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --plan myPremiumPlan --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD>
Ersetzen Sie in diesem Beispiel
<STORAGE_NAME>
durch den Namen, den Sie im vorherigen Abschnitt für das Speicherkonto verwendet haben. Ersetzen Sie außerdem<APP_NAME>
durch einen für Sie geeigneten global eindeutigen Namen und<DOCKER_ID>
oder<LOGIN_SERVER>
durch Ihre Docker Hub-Konto-ID oder den Container Registry-Server. Verwenden Sie bei der Bereitstellung aus einer benutzerdefinierten Containerregistrierung den Imagenamen, um die URL der Registrierung anzugeben.Wenn Sie die Funktions-App zum ersten Mal erstellen, zieht sie das anfängliche Image aus Ihrem Docker Hub. Sie können die kontinuierliche Bereitstellung in Azure auch über Ihre Containerregistrierung aktivieren.
Tipp
Sie können die
DisableColor
-Einstellung in der host.json-Datei verwenden, um zu verhindern, dass ANSI-Steuerzeichen in die Containerprotokolle geschrieben werden.Verwenden Sie den folgenden Befehl, um die Verbindungszeichenfolge für das von Ihnen erstellte Speicherkonto abzurufen:
az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv
Die Verbindungszeichenfolge für das Speicherkonto wird mit dem Befehl
az storage account show-connection-string
zurückgegeben.Ersetzen Sie
<STORAGE_NAME>
durch den Namen des Speicherkontos, das Sie früher erstellt haben.Verwenden Sie den folgenden Befehl, um der Funktions-App die Einstellung hinzuzufügen:
az functionapp config appsettings set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=<CONNECTION_STRING>
Der Befehl
az functionapp config appsettings set
erstellt die Einstellung.Ersetzen Sie in diesem Befehl
<APP_NAME>
durch den Namen Ihrer Funktions-App und<CONNECTION_STRING>
durch die Verbindungszeichenfolge aus dem vorherigen Schritt. Die Verbindung sollte eine lang codierte Zeichenfolge sein, die mitDefaultEndpointProtocol=
beginnt.Die Funktion kann diese Verbindungszeichenfolge jetzt verwenden, um auf das Speicherkonto zuzugreifen.
Überprüfen Ihrer Funktionen in Azure
Nachdem das Image in Ihrer Funktions-App in Azure bereitgestellt wurde, können Sie die Funktion nun über HTTP-Anforderungen aufrufen.
Führen Sie zum Abrufen der URL Ihrer neuen Funktion den folgenden Befehl
az functionapp function show
aus.az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate
Ersetzen Sie
<APP_NAME>
durch den Namen der Funktions-App.
- Verwenden Sie die soeben abgerufene URL, um den
HttpExample
-Funktionsendpunkt aufzurufen, und fügen Sie die Abfragezeichenfolge?name=Functions
an.
- Verwenden Sie die soeben abgerufene URL, um den
HttpExample
-Funktionsendpunkt aufzurufen.
Wenn Sie zu dieser URL navigieren, muss der Browser eine ähnliche Ausgabe anzeigen wie bei der lokalen Ausführung der Funktion.
Bereinigen von Ressourcen
Wenn Sie mit Azure Functions weiterarbeiten und die in diesem Artikel erstellten Ressourcen weiterhin nutzen möchten, können Sie sie alle beibehalten. Da Sie einen Premium-Plan für Azure Functions erstellt haben, fallen für Sie pro Tag ein oder zwei US-Dollar an laufenden Kosten an.
Löschen Sie zur Vermeidung laufender Kosten die Ressourcengruppe AzureFunctionsContainers-rg
, um alle Ressourcen dieser Gruppe zu bereinigen:
az group delete --name AzureFunctionsContainers-rg