Delen via


Een Durable Functions-app hosten in Azure Container Apps (.NET geïsoleerd)

Azure Functions biedt geïntegreerde ondersteuning voor het ontwikkelen, implementeren en beheren van containerfunctie-apps in Azure Container Apps. Gebruik Azure Container Apps voor uw Functions-apps wanneer u moet draaien in dezelfde omgeving als andere microservices, API's, websites, werkstromen, of container-gehoste programma's. Meer informatie over het uitvoeren van Azure Functions in Container Apps.

Opmerking

Hoewel Durable Functions ondersteuning biedt voor verschillende opslagproviders of back-ends, is het automatisch schalen van apps die worden gehost in Azure Container Apps alleen beschikbaar met de Microsoft SQL-back-end (MSSQL). Als een andere back-end wordt gebruikt, moet u het minimumaantal replica's instellen op groter dan nul.

In dit artikel leert u het volgende:

  • Maak een Docker-image van een lokaal Durable Functions-project.
  • Maak een Azure Container App en gerelateerde resources.
  • Implementeer de image naar de Azure-containerapp en stel verificatie in.

Vereiste voorwaarden

Een lokaal Durable Functions-project maken

Maak in Visual Studio Code een .NET geïsoleerd Durable Functions-project dat is geconfigureerd voor het gebruik van de MSSQL-back-end.

Test de app lokaal en ga terug naar dit artikel.

Maak een Dockerfile in de hoofdmap van het project waarin de minimaal vereiste omgeving wordt beschreven voor het uitvoeren van de functie-app in een container.

  1. Maak in de hoofdmap van het project een nieuw bestand met de naam Dockerfile.

  2. Kopieer/plak de volgende inhoud in het Dockerfile.

    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. Sla het bestand op.

  4. Voeg een .dockerignore-bestand toe met de volgende inhoud:

    local.settings.json
    
  5. Sla het .dockerignore-bestand op.

De containerafbeelding bouwen

Bouw de Docker-installatiekopie. De volledige lijst met ondersteunde basisinstallatiekopieën voor Azure Functions zoeken in de Azure Functions-basis van Microsoft | Docker Hub

  1. Start de Docker-daemon.

  2. Meld u aan bij Docker met de docker login opdracht.

  3. Meld u aan met uw gebruikersnaam en wachtwoord wanneer u hierom wordt gevraagd. Een bericht 'Aanmelden geslaagd' bevestigt dat u bent aangemeld.

  4. Navigeer naar de hoofdmap van uw project.

  5. Voer de volgende opdracht uit om de image te bouwen, waarbij u <DOCKER_ID> vervangt door uw Docker Hub-account-ID:

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

    Opmerking

    Als u een Mac uit de M-serie gebruikt, gebruik in plaats daarvan --platform linux/amd64.

  6. Push de image naar Docker:

    docker push $dockerId/$imageName:$imageVersion
    

    Afhankelijk van de netwerksnelheid kan het uploaden van de eerste afbeelding enkele minuten duren. Terwijl u wacht, gaat u verder met de volgende sectie.

Azure-resources maken

Maak de Azure-resources die nodig zijn voor het uitvoeren van Durable Functions in een container-app.

  • Azure-resourcegroep: Resourcegroep met alle gemaakte resources.
  • Azure Container App-omgeving: Omgeving die als host fungeert voor de container-app.
  • Azure Container App: Afbeelding met de Durable Functions-app wordt ingezet in deze app.
  • Azure Storage-account: Vereist voor de functie-app voor het opslaan van app-gerelateerde gegevens, zoals toepassingscode.

Initiële installatie

  1. Meld u in een nieuwe terminal aan bij uw Azure-abonnement:

    az login  
    
    az account set -s <subscription_name>
    
  2. Voer de vereiste opdrachten uit om de AZURE Container Apps CLI-extensie in te stellen:

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

Een workloadprofiel bepaalt de hoeveelheid reken- en geheugenresources die beschikbaar zijn voor de container-apps die in een omgeving zijn geïmplementeerd. Maak een verbruiksworkloadprofiel voor scale-to-zero-ondersteuning en betalen per gebruik.

  1. Stel de omgevingsvariabelen in.

    location=<REGION>
    resourceGroup=<RESOURCE_GROUP_NAME>
    storage=<STORAGE_NAME>
    containerAppEnv=<CONTAINER_APP_ENVIRONMNET_NAME>
    functionApp=<APP_NAME>
    vnet=<VNET_NAME>
    
  2. Maak een resourcegroep.

    az group create --name $resourceGroup --location $location
    
  3. Maak de container-app-omgeving.

    az containerapp env create \
      --enable-workload-profiles \
      --resource-group $resourceGroup \
      --name $containerAppEnv \
      --location $location \
    
  4. Maak een container-app op basis van de Durable Functions-image.

    az containerapp create --resource-group $resourceGroup \
    --name $functionApp \
    --environment $containerAppEnv \
    --image $dockerId/$imageName:$imageVersion \
    --ingress external \
    --kind functionapp \
    --query properties.outputs.fqdn
    
  5. Noteer de URL van de app, die er ongeveer als https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.iovolgt uit moet zien.

Databases maken

  1. Maak een Azure Storage-account dat vereist is voor de functie-app.

    az storage account create --name $storage --location $location --resource-group $resourceGroup --sku Standard_LRS
    
  2. Maak in Azure Portal een Azure SQL-database om statusgegevens vast te houden. Tijdens het maken:

    • Azure-services en -resources toegang geven tot deze server (onder Netwerken)
    • Stel de waarde voor databasesortering (onder Aanvullende instellingen) in op Latin1_General_100_BIN2_UTF8.

Opmerking

Zorg ervoor dat u de instelling Azure-services en -resources toestaan om toegang te krijgen tot deze server niet inschakelt voor productiescenario's. Productietoepassingen moeten veiligere benaderingen implementeren, zoals sterkere firewallbeperkingen of configuraties van virtuele netwerken.

Verificatie op basis van identiteit configureren

Beheerde identiteiten maken uw app veiliger door geheimen uit uw app te elimineren, zoals referenties in de verbindingsreeksen. Hoewel u kunt kiezen tussen door het systeem toegewezen en door de gebruiker toegewezen beheerde identiteit, wordt door de gebruiker toegewezen beheerde identiteit aanbevolen, omdat deze niet is gekoppeld aan de levenscyclus van de app.

In deze sectie stelt u door de gebruiker toegewezen beheerde identiteit in voor Azure Storage.

  1. Stel de omgevingsvariabelen in.

    subscription=<SUBSCRIPTION_ID>
    identity=<IDENTITY_NAME>
    
  2. Een beheerde identiteitsresource maken.

    echo "Creating $identity"
    az identity create -g $resourceGroup -n $identity --location "$location"
    
  3. Wijs de gebruikersidentiteit toe aan de container-app.

    echo "Assigning $identity to app"
    az containerapp identity assign --resource-group $resourceGroup --name $functionApp --user-assigned $identity
    
  4. Stel het bereik van de RBAC-machtigingen (op rollen gebaseerd toegangsbeheer) in.

    scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"
    
  5. Verkrijg de gebruikersidentiteit clientId.

    # Get the identity's ClientId 
    clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)
    
  6. Wijs de rol Eigenaar van opslagblobgegevens toe voor toegang tot het opslagaccount.

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

App-instellingen instellen

Opmerking

Verificatie bij de MSSQL-database met beheerde identiteit wordt niet ondersteund bij het hosten van een Durable Functions-app in Azure Container Apps. Deze handleiding authenticeert voorlopig met behulp van connectiestrengen.

  1. Navigeer vanuit de SQL-databaseresource in Azure Portal naarVerbindingsreeksen> om de verbindingsreeks te vinden.

    Schermopname van de databaseverbindingstekenreeks.

    De verbindingsreeks moet een indeling hebben die vergelijkbaar is met:

    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;"
    

    Als u het wachtwoord uit de vorige stap voor het maken van de database vergeet, kunt u het opnieuw instellen op de SQL Server-resource.

    Schermopname van de knop Wachtwoord opnieuw instellen.

  2. Sla de verbindingsreeks van de SQL-database op als een geheim met de naam sqldbconnection in de container-app.

    az containerapp secret set \
    --resource-group $resourceGroup \
    --name $functionApp \
    --secrets sqldbconnection=$connStr
    
  3. Voeg de volgende instellingen toe aan de app:

    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
    

Lokaal testen

  1. Gebruik een HTTP-testprogramma om een POST aanvraag naar het HTTP-triggereindpunt te verzenden, wat vergelijkbaar moet zijn met:

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

    Het antwoord is het eerste resultaat van de HTTP-functie, om aan te geven dat de Durable Functions-orkestratie succesvol is gestart. Hoewel het antwoord enkele nuttige URL's bevat, wordt het eindresultaat van de orkestratie nog niet weergegeven.

  2. Kopieer/plak de URL-waarde voor statusQueryGetUri in de adresbalk van uw browser en voer deze uit. U kunt ook het HTTP-testhulpprogramma blijven gebruiken om de GET aanvraag uit te voeren.

    De aanvraag voert een query uit op het indelingsexemplaar voor de status. U kunt zien dat de instantie is voltooid en de uitvoer of resultaten van de Durable Functions-app.

    {
        "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"
    }
    

Volgende stappen

Meer informatie over: