Erstellen Ihrer ersten Azure Functions-Container in Azure Arc (Vorschau)

In diesem Artikel erstellen Sie eine Funktions-App, die in einem Linux-Container ausgeführt wird, und stellen sie in einem Kubernetes-Cluster mit Azure Arc-Unterstützung aus einer Containerregistrierung bereit. Wenn Sie einen eigenen Container erstellen, können Sie die Ausführungsumgebung für Ihre Funktions-App anpassen. Weitere Informationen finden Sie unter App Service, Funktionen und Logic Apps in Azure Arc.

Hinweis

Die Unterstützung für die Bereitstellung eines benutzerdefinierten Containers in einem Kubernetes-Cluster mit Azure Arc-Unterstützung befindet sich derzeit in der Vorschauphase.

Sie können Ihre Funktionen auch in einem Kubernetes-Cluster mit Azure Arc-Unterstützung veröffentlichen, ohne zuvor einen Container zu erstellen. Weitere Informationen finden Sie unter Erstellen Ihrer ersten Funktion auf Azure Arc (Vorschau).

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:

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.

  1. 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.

  2. 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.

  3. Verwenden Sie diesen Befehl, um den Container in Ihre Registrierungsinstanz zu pushen:

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    

Erstellen der App Service Kubernetes-Umgebung

Bevor Sie beginnen, müssen Sie eine App Service Kubernetes-Umgebung für einen Azure Arc Kubernetes-Cluster erstellen.

Hinweis

Notieren Sie sich beim Erstellen der Umgebung sowohl den benutzerdefinierten Standortnamen als auch den Namen der Ressourcengruppe, die den benutzerdefinierten Speicherort enthält. Sie können diese Namen verwenden, um die benutzerdefinierte Standort-ID zu finden, die Sie beim Erstellen Ihrer Funktions-App in der Umgebung benötigen.

Wenn Sie die Umgebung nicht erstellt haben, wenden Sie sich an Ihren Cluster-Administrator.

Hinzufügen von Azure CLI-Erweiterungen

Starten Sie die Bash-Umgebung in Azure Cloud Shell.

Da diese CLI-Befehle noch nicht Teil des CLI-Kernsets sind, fügen Sie sie mit den folgenden Befehlen hinzu:

az extension add --upgrade --yes --name customlocation
az extension remove --name appservice-kube
az extension add --upgrade --yes --name appservice-kube

Erstellen von Azure-Ressourcen

Bevor Sie Ihren Container in Ihrer neuen App Service Kubernetes-Umgebung einsetzen können, müssen Sie zwei weitere Ressourcen erstellen:

  • Ein Speicherkonto. Während für diesen Artikel ein Speicherkonto erstellt wird, ist in einigen anderen Fällen möglicherweise kein Speicherkonto erforderlich. Weitere Informationen finden Sie im Artikel zu Speicherüberlegungen unter Azure Arc-aktivierte Cluster.
  • Eine Funktions-App, die den Kontext für die Ausführung Ihres Containers bereitstellt. Die Funktions-App wird in der App Service Kubernetes-Umgebung ausgeführt und Ihrem lokalen Funktionsprojekt zugeordnet. Mit einer Funktions-App können Sie Funktionen in logischen Einheiten gruppieren. Dies erleichtert die Verwaltung, Bereitstellung und Freigabe von Ressourcen.

Hinweis

Funktions-Apps werden in einer App Service Kubernetes-Umgebung mit einem dedizierten Plan (App Service) ausgeführt. Wenn Sie Ihre Funktions-App ohne vorhandenen Plan erstellen, wird der korrekte Plan für Sie erstellt.

Speicherkonto erstellen

Verwenden Sie den Befehl az storage account create, um ein Allzweck-Speicherkonto in Ihrer Ressourcengruppe und Region zu erstellen:

az storage account create --name <STORAGE_NAME> --location westeurope --resource-group myResourceGroup --sku Standard_LRS

Hinweis

In einigen Fällen ist möglicherweise kein Speicherkonto erforderlich. Weitere Informationen finden Sie im Artikel zu Speicherüberlegungen unter Azure Arc-aktivierte Cluster.

Ersetzen Sie im vorherigen Beispiel <STORAGE_NAME> durch einen Namen, der für Sie geeignet und eindeutig in Azure Storage ist. Namen dürfen nur 3 bis 24 Zeichen und ausschließlich Kleinbuchstaben enthalten. Mit Standard_LRS wird ein universelles Konto angegeben, das von Functions unterstützt wird. Der --location-Wert ist eine Azure-Standardregion.

Erstellen der Funktionen-App

Führen Sie den Befehl az functionapp create aus, um eine neue Funktions-App in der Umgebung zu erstellen.

az functionapp create --name <APP_NAME> --custom-location <CUSTOM_LOCATION_ID> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD> 

Ersetzen Sie in diesem Beispiel <CUSTOM_LOCATION_ID> durch die ID des benutzerdefinierten Speicherorts, den Sie für die App Service Kubernetes-Umgebung definiert haben. Ersetzen Sie außerdem <STORAGE_NAME> mit dem Namen des Kontos, das Sie im vorherigen Schritt verwendet haben, <APP_NAME> durch einen global eindeutigen Namen und <DOCKER_ID> oder <LOGIN_SERVER> durch Ihre Docker Hub-Konto-ID bzw. Ihren 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.

Festlegen der erforderlichen App-Einstellungen

Führen Sie die folgenden Befehle aus, um eine App-Einstellung für die Verbindungszeichenfolge des Speicherkontos zu erstellen:

storageConnectionString=$(az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv)
az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=$storageConnectionString

Dieser Code muss entweder in der Cloud Shell oder in Bash auf Ihrem lokalen Computer ausgeführt werden. Ersetzen <STORAGE_NAME> Sie mit dem Namen des Speicherkontos und <APP_NAME> mit dem Namen der Funktions-App.

Aufrufen der Funktion in Azure

Da für Ihre Funktion ein HTTP-Trigger verwendet wird, führen Sie das Aufrufen durch, indem Sie per Browser eine HTTP-Anforderung an die entsprechende URL senden oder ein Tool wie curl verwenden.

Kopieren Sie die vollständige Aufruf-URL, die in der Ausgabe des Befehls zum Veröffentlichen (publish) angezeigt wird, in eine Browseradressleiste, und fügen Sie den Abfrageparameter ?name=Functions an. Im Browser sollte eine ähnliche Ausgabe wie bei der lokalen Ausführung der Funktion angezeigt werden.

Ausgabe der in Azure ausgeführten Funktion in einem Browser

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.

Wenn Sie mit dieser Funktions-App-Bereitstellung fertig sind, löschen Sie die Ressourcengruppe AzureFunctionsContainers-rg, um alle Ressourcen in dieser Gruppe zu bereinigen:

az group delete --name AzureFunctionsContainers-rg

Dadurch werden nur die in diesem Artikel erstellten Ressourcen entfernt. Die zugrunde liegende Azure Arc-Umgebung bleibt vorhanden.

Nächste Schritte