Teilen über


Hosting einer Durable Functions-App in Azure Container Apps (.NET isoliert)

Azure Functions bietet integrierte Unterstützung für die Entwicklung, Bereitstellung und Verwaltung von containerisierten Funktions-Apps in Azure-Container-Apps. Verwenden Sie Azure Container-Apps für Ihre Funktionen-Apps, wenn Sie in derselben Umgebung wie andere Microservices, APIs, Websites, Workflows oder in container gehosteten Programmen ausgeführt werden müssen. Erfahren Sie mehr über das Ausführen von Azure-Funktionen in Container-Apps.

Hinweis

Während Durable Functions mehrere Speicheranbieter oder Back-Ends unterstützt, ist die automatische Skalierung von Apps, die in Azure Container Apps gehostet werden, nur mit dem Microsoft SQL (MSSQL)-Back-End verfügbar. Wenn ein anderes Back-End verwendet wird, müssen Sie die Mindestreplikatanzahl auf größer als 0 festlegen.

In diesem Artikel erfahren Sie, wie Sie:

  • Erstellen Sie ein Docker-Image aus einem lokalen Projekt für dauerhafte Funktionen.
  • Erstellen Sie eine Azure-Container-App und zugehörige Ressourcen.
  • Stellen Sie das Image in der Azure-Container-App bereit, und richten Sie die Authentifizierung ein.

Voraussetzungen

Lokales Projekt für Durable Functions erstellen

Erstellen Sie in Visual Studio Code ein .NET-Projekt für isolierte dauerhafte Funktionen, das für die Verwendung des MSSQL-Back-End konfiguriert ist.

Testen Sie die App lokal , und kehren Sie zu diesem Artikel zurück.

Erstellen Sie eine Dockerfile-Datei im Projektstamm, die die mindest erforderliche Umgebung zum Ausführen der Funktions-App in einem Container beschreibt.

  1. Erstellen Sie im Projektstammverzeichnis eine neue Datei mit dem Namen Dockerfile.

  2. Kopieren/einfügen Sie den folgenden Inhalt in die Dockerfile-Datei.

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS installer-env
    
    COPY . /src/dotnet-function-app
    RUN cd /src/dotnet-function-app && \
    mkdir -p /home/site/wwwroot && \
    dotnet publish *.csproj --output /home/site/wwwroot
    
    # To enable ssh & remote debugging on app service change the base image to the one below
    # FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0-appservice
    FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0
    ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
        AzureFunctionsJobHost__Logging__Console__IsEnabled=true
    
    COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
    
  3. Speichern Sie die Datei.

  4. Fügen Sie eine Dockerignore-Datei mit dem folgenden Inhalt hinzu:

    local.settings.json
    
  5. Speichern Sie die Dockerignore-Datei .

Erstellen des Containerimages

Erstellen Sie das Docker-Image. Finden Sie die vollständige Liste der unterstützten Basisimages für Azure Functions in der Azure Functions Base von Microsoft | Docker Hub

  1. Starten Sie den Docker-Daemon.

  2. Melden Sie sich mit dem docker login Befehl bei Docker an.

  3. Wenn Sie dazu aufgefordert werden, melden Sie sich mit Ihrem Benutzernamen und Kennwort an. Eine Meldung "Anmeldung erfolgreich" bestätigt, dass Sie angemeldet sind.

  4. Navigieren Sie zu Ihrem Projektstammverzeichnis.

  5. Führen Sie den folgenden Befehl aus, um das Image zu erstellen und durch Ihre Docker Hub-Konto-ID zu ersetzen <DOCKER_ID> :

    dockerId=<DOCKER_ID>
    imageName=IMAGE_NAME>
    imageVersion=v1.0.0
    
    docker build --tag $dockerId/$imageName:$imageVersion .
    

    Hinweis

    Wenn Sie einen Mac der M-Serie verwenden, verwenden Sie stattdessen --platform linux/amd64.

  6. Übertragen Sie das Image an Docker:

    docker push $dockerId/$imageName:$imageVersion
    

    Je nach Netzwerkgeschwindigkeit kann der anfängliche Bild-Push einige Minuten dauern. Während Sie warten, fahren Sie mit dem nächsten Abschnitt fort.

Erstellen von Azure-Ressourcen

Erstellen Sie die Azure-Ressourcen, die zum Ausführen dauerhafter Funktionen in einer Container-App erforderlich sind.

  • Azure-Ressourcengruppe: Ressourcengruppe mit allen erstellten Ressourcen.
  • Azure Container App-Umgebung: Umgebung, in der die Container-App gehostet wird.
  • Azure-Container-App: Image, das die App „Durable Functions“ enthält, wird in dieser App bereitgestellt.
  • Azure Storage-Konto: Erforderlich von der Funktions-App zum Speichern von App-bezogenen Daten, z. B. Anwendungscode.

Anfängliche Einrichtung

  1. Melden Sie sich in einem neuen Terminal bei Ihrem Azure-Abonnement an:

    az login  
    
    az account set -s <subscription_name>
    
  2. Führen Sie die erforderlichen Befehle aus, um die Azure Container Apps CLI-Erweiterung einzurichten:

    az upgrade
    
    az extension add --name containerapp --upgrade
    
    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

Ein Workloadprofil bestimmt die Menge an Compute- und Arbeitsspeicherressourcen, die für die in einer Umgebung bereitgestellten Container-Apps verfügbar sind. Erstellen Sie ein Verbrauchsworkloadprofil für Unterstützung der Skalierung auf Null und nutzungsbasierte Bezahlung.

  1. Festlegen der Umgebungsvariablen.

    location=<REGION>
    resourceGroup=<RESOURCE_GROUP_NAME>
    storage=<STORAGE_NAME>
    containerAppEnv=<CONTAINER_APP_ENVIRONMNET_NAME>
    functionApp=<APP_NAME>
    vnet=<VNET_NAME>
    
  2. Erstellen Sie eine Ressourcengruppe.

    az group create --name $resourceGroup --location $location
    
  3. Erstellen Sie die Container-App-Umgebung.

    az containerapp env create \
      --enable-workload-profiles \
      --resource-group $resourceGroup \
      --name $containerAppEnv \
      --location $location \
    
  4. Erstellen Sie eine Container-App basierend auf dem Image "Dauerhafte Funktionen".

    az containerapp create --resource-group $resourceGroup \
    --name $functionApp \
    --environment $containerAppEnv \
    --image $dockerId/$imageName:$imageVersion \
    --ingress external \
    --kind functionapp \
    --query properties.outputs.fqdn
    
  5. Notieren Sie sich die App-URL, die ähnlich aussehen soll.https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io

Erstellen von Datenbanken

  1. Erstellen Sie ein Azure Storage-Konto, das von der Funktions-App benötigt wird.

    az storage account create --name $storage --location $location --resource-group $resourceGroup --sku Standard_LRS
    
  2. Erstellen Sie im Azure-Portal eine Azure SQL-Datenbank , um Statusinformationen beizubehalten. Während der Erstellung:

    • Aktivieren von Azure-Diensten und -Ressourcen für den Zugriff auf diesen Server (unter Netzwerk)
    • Legen Sie den Wert für die Datenbanksortierung (unter zusätzlichen Einstellungen) auf Latin1_General_100_BIN2_UTF8.

Hinweis

Verzichten Sie darauf, die Einstellung Zulassen, dass Azure-Dienste und -Ressourcen auf diesen Server zugreifen für produktive Szenarien zu aktivieren. Produktionsanwendungen sollten sicherere Ansätze implementieren, z. B. stärkere Firewalleinschränkungen oder konfigurationen virtueller Netzwerke.

Konfigurieren der identitätsbasierten Authentifizierung

Verwaltete Identitäten machen Ihre App sicherer, indem geheime Schlüssel aus Ihrer App entfernt werden, z. B. Anmeldeinformationen in den Verbindungszeichenfolgen. Sie können zwar zwischen der vom System zugewiesenen und der vom Benutzer zugewiesenen verwalteten Identität wählen, die vom Benutzer zugewiesene verwaltete Identität wird jedoch empfohlen, da sie nicht an den App-Lebenszyklus gebunden ist.

In diesem Abschnitt richten Sie die vom Benutzer zugewiesene verwaltete Identität für Azure Storage ein.

  1. Festlegen der Umgebungsvariablen.

    subscription=<SUBSCRIPTION_ID>
    identity=<IDENTITY_NAME>
    
  2. Erstellen Sie eine verwaltete Identitätsressource.

    echo "Creating $identity"
    az identity create -g $resourceGroup -n $identity --location "$location"
    
  3. Weisen Sie der Container-App die Benutzeridentität zu.

    echo "Assigning $identity to app"
    az containerapp identity assign --resource-group $resourceGroup --name $functionApp --user-assigned $identity
    
  4. Legen Sie den Bereich der rollenbasierten Zugriffssteuerungsberechtigungen (RBAC) fest.

    scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"
    
  5. Rufen Sie clientId der Benutzeridentität ab.

    # Get the identity's ClientId 
    clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)
    
  6. Weisen Sie die Rolle " Storage Blob Data Owner " für den Zugriff auf das Speicherkonto zu.

    echo "Assign Storage Blob Data Owner role to identity"
    az role assignment create --assignee "$clientId" --role "Storage Blob Data Owner" --scope "$scope"
    

Einrichten von App-Einstellungen

Hinweis

Die Authentifizierung bei der MSSQL-Datenbank mit verwalteter Identität wird beim Hosten einer App für dauerhafte Funktionen in Azure Container-Apps nicht unterstützt. Derzeit erfolgt die Authentifizierung in dieser Anleitung mithilfe von Verbindungszeichenfolgen.

  1. Navigieren Sie von der SQL-Datenbankressource im Azure-Portal zu Einstellungen>Verbindungszeichenfolgen, um die Verbindungszeichenfolge zu finden.

    Screenshot mit Datenbank-Verbindungszeichenfolge.

    Die Verbindungszeichenfolge sollte ein ähnliches Format aufweisen wie:

    dbserver=<SQL_SERVER_NAME>
    sqlDB=<SQL_DB_NAME>
    username=<DB_USER_LOGIN>
    password=<DB_USER_PASSWORD>
    
    connStr="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$sqlDB;Persist Security Info=False;User ID=$username;Password=$password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
    

    Wenn Sie das Kennwort aus dem vorherigen Datenbankerstellungsschritt vergessen haben, können Sie es auf der SQL Server-Ressource zurücksetzen.

    Screenshot der Schaltfläche

  2. Speichern Sie die Verbindungszeichenfolge der SQL-Datenbank als geheimer Schlüssel namens "sqldbconnection " in der Container-App.

    az containerapp secret set \
    --resource-group $resourceGroup \
    --name $functionApp \
    --secrets sqldbconnection=$connStr
    
  3. Fügen Sie der App die folgenden Einstellungen hinzu:

    az containerapp update \
    -n $functionApp \
    -g $resourceGroup \
    --set-env-vars SQLDB_Connection=secretref:sqldbconnection \
    AzureWebJobsStorage__accountName=$storage \
    AzureWebJobsStorage__clientId=$clientId \
    AzureWebJobsStorage__credential=managedidentity \
    FUNCTIONS_WORKER_RUNTIME=dotnet-isolated
    

Lokales Testen

  1. Verwenden Sie ein HTTP-Testtool, um eine POST Anforderung an den HTTP-Triggerendpunkt zu senden, was ähnlich sein sollte:

    https://<APP NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io/api/DurableFunctionsOrchestrationCSharp1_HttpStart
    

    Die Antwort ist das anfängliche Ergebnis der HTTP-Funktion, das Sie darüber informiert, dass die Permanent Functions-Orchestrierung erfolgreich gestartet wurde. Während die Antwort einige nützliche URLs enthält, wird das Endergebnis der Orchestrierung noch nicht angezeigt.

  2. Kopieren Sie den URL-Wert für statusQueryGetUri und fügen Sie ihn in die Adressleiste Ihres Browsers ein und drücken Sie die Eingabetaste. Alternativ können Sie weiterhin das HTTP-Testtool verwenden, um die GET Anforderung ausstellen zu können.

    Die Anforderung fragt die Orchestrierungsinstanz der Status ab. Ihnen sollten die Information, dass die Instanz fertiggestellt wurde, sowie die Ausgaben oder Ergebnisse der Durable Functions-App angezeigt werden.

    {
        "name":"HelloCities",
        "instanceId":"7f99f9474a6641438e5c7169b7ecb3f2",
        "runtimeStatus":"Completed",
        "input":null,
        "customStatus":null,
        "output":"Hello, Tokyo! Hello, London! Hello, Seattle!",
        "createdTime":"2023-01-31T18:48:49Z",
        "lastUpdatedTime":"2023-01-31T18:48:56Z"
    }
    

Nächste Schritte

Weitere Informationen zu: