Dela via


Vara värd för en Durable Functions-app i Azure Container Apps (.NET isolerad)

Azure Functions ger integrerat stöd för att utveckla, distribuera och hantera containerbaserade funktionsappar i Azure Container Apps. Använd Azure Container Apps för dina Functions-appar när du behöver köra i samma miljö som andra mikrotjänster, API:er, webbplatser, arbetsflöden eller andra värdbaserade containerprogram. Läs mer om att köra Azure Functions i Container Apps.

Anmärkning

Durable Functions har stöd för flera lagringsproviders eller serverdelar, men automatisk skalning av appar som finns i Azure Container Apps är endast tillgängligt med Microsoft SQL-serverdelen (MSSQL). Om en annan backend används måste du sätta det minsta antalet repliker till större än noll.

I den här artikeln lär du dig att:

  • Skapa en Docker-avbildning från ett lokalt Durable Functions-projekt.
  • Skapa en Azure Container App och relaterade resurser.
  • Distribuera avbildningen till Azure Container App och konfigurera autentisering.

Förutsättningar

Skapa ett lokalt Durable Functions-projekt

I Visual Studio Code skapar du ett .NET-isolerat Durable Functions-projekt som konfigurerats för att använda MSSQL-serverdelen.

Testa appen lokalt och gå tillbaka till den här artikeln.

Skapa en Dockerfile i projektroten som beskriver den minsta miljö som krävs för att köra funktionsappen i en container.

  1. Skapa en ny fil med namnet Dockerfile i projektrotkatalogen.

  2. Kopiera/klistra in följande innehåll i 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. Spara filen.

  4. Lägg till en .dockerignore-fil med följande innehåll:

    local.settings.json
    
  5. Spara .dockerignorefilen.

Bygga containeravbildningen

Skapa Docker-avbildningen. Hitta den fullständiga listan över basavbildningar som stöds för Azure Functions i Azure Functions Base av Microsoft | Docker Hub

  1. Starta Docker-daemonen.

  2. Logga in på Docker med docker login kommandot .

  3. Logga in med ditt användarnamn och lösenord när du uppmanas att göra det. Ett meddelande om att inloggningen lyckades bekräftar att du är inloggad.

  4. Gå till projektets rotkatalog.

  5. Kör följande kommando för att skapa avbildningen och ersätt <DOCKER_ID> med ditt Docker Hub-konto-ID:

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

    Anmärkning

    Om du kör på en Mac i M-serien använder du --platform linux/amd64 i stället.

  6. Skicka avbildningen till Docker:

    docker push $dockerId/$imageName:$imageVersion
    

    Beroende på nätverkets hastighet kan den första avbildnings push-överföringen ta några minuter. Fortsätt till nästa avsnitt medan du väntar.

Skapa Azure-resurser

Skapa de Azure-resurser som krävs för att köra Durable Functions i en containerapp.

  • Azure-resursgrupp: Resursgrupp som innehåller alla skapade resurser.
  • Azure Container App-miljö: Miljö som är värd för containerappen.
  • Azure Container App: Avbildning som innehåller Durable Functions-appen distribueras till den här appen.
  • Azure Storage-konto: Krävs av funktionsappen för att lagra apprelaterade data, till exempel programkod.

Inledande konfiguration

  1. Logga in på din Azure-prenumeration i en ny terminal:

    az login  
    
    az account set -s <subscription_name>
    
  2. Kör de kommandon som krävs för att konfigurera Azure Container Apps CLI-tillägget:

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

En arbetsbelastningsprofil avgör mängden beräknings- och minnesresurser som är tillgängliga för de containerappar som distribueras i en miljö. Skapa en förbrukningsarbetslägesprofil för stöd för skalning till noll och betalning per användning.

  1. Ange miljövariablerna.

    location=<REGION>
    resourceGroup=<RESOURCE_GROUP_NAME>
    storage=<STORAGE_NAME>
    containerAppEnv=<CONTAINER_APP_ENVIRONMNET_NAME>
    functionApp=<APP_NAME>
    vnet=<VNET_NAME>
    
  2. Skapa en resursgrupp.

    az group create --name $resourceGroup --location $location
    
  3. Skapa containerappmiljön.

    az containerapp env create \
      --enable-workload-profiles \
      --resource-group $resourceGroup \
      --name $containerAppEnv \
      --location $location \
    
  4. Skapa en containerapp baserat på Durable Functions-avbildningen.

    az containerapp create --resource-group $resourceGroup \
    --name $functionApp \
    --environment $containerAppEnv \
    --image $dockerId/$imageName:$imageVersion \
    --ingress external \
    --kind functionapp \
    --query properties.outputs.fqdn
    
  5. Anteckna appens URL, som ungefär ser ut som https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io.

Skapa databaser

  1. Skapa ett Azure Storage-konto som krävs av funktionsappen.

    az storage account create --name $storage --location $location --resource-group $resourceGroup --sku Standard_LRS
    
  2. I Azure-portalen skapar du en Azure SQL-databas för att spara tillståndsinformation. När du skapar:

    • Aktivera Azure-tjänster och -resurser för åtkomst till den här servern (under Nätverk)
    • Ange värdet för Databassortering (under Ytterligare inställningar) till Latin1_General_100_BIN2_UTF8.

Anmärkning

Avstå från att aktivera inställningen Tillåt Azure-tjänster och resurser att komma åt den här serverinställningen för produktionsscenarier. Produktionsprogram bör implementera säkrare metoder, till exempel starkare brandväggsbegränsningar eller konfigurationer av virtuella nätverk.

Konfigurera identitetsbaserad autentisering

Hanterade identiteter gör din app säkrare genom att eliminera hemligheter från din app, till exempel autentiseringsuppgifter i anslutningssträngarna. Du kan välja mellan systemtilldelad och användartilldelad hanterad identitet, men användartilldelad hanterad identitet rekommenderas eftersom den inte är kopplad till appens livscykel.

I det här avsnittet konfigurerar du användartilldelad hanterad identitet för Azure Storage.

  1. Ange miljövariablerna.

    subscription=<SUBSCRIPTION_ID>
    identity=<IDENTITY_NAME>
    
  2. Skapa en hanterad identitetsresurs.

    echo "Creating $identity"
    az identity create -g $resourceGroup -n $identity --location "$location"
    
  3. Tilldela användaridentiteten till containerappen.

    echo "Assigning $identity to app"
    az containerapp identity assign --resource-group $resourceGroup --name $functionApp --user-assigned $identity
    
  4. Ange omfånget för behörigheterna för rollbaserad åtkomstkontroll (RBAC).

    scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"
    
  5. Hämta användaridentitetens clientId.

    # Get the identity's ClientId 
    clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)
    
  6. Tilldela rollen Lagringsblobdataägare för åtkomst till lagringskontot.

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

Konfigurera appinställningar

Anmärkning

Autentisering till MSSQL-databasen med hanterad identitet stöds inte när du är värd för en Durable Functions-app i Azure Container Apps. För tillfället autentiseras denna guide med hjälp av anslutningssträngar.

  1. Från SQL-databasresursen i Azure-portalen går du till Inställningar>Anslutningssträngar för att hitta anslutningssträngen.

    Skärmbild som visar databasanslutningssträngen.

    Anslutningssträngen bör ha ett format som liknar:

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

    Om du glömmer lösenordet från föregående steg för att skapa databasen kan du återställa det på SQL Server-resursen.

    Skärmbild som visar knappen Återställ lösenord.

  2. Lagra SQL-databasens anslutningssträng som en hemlighet med namnet sqldbconnection i containerappen.

    az containerapp secret set \
    --resource-group $resourceGroup \
    --name $functionApp \
    --secrets sqldbconnection=$connStr
    
  3. Lägg till följande inställningar i appen:

    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
    

Testa lokalt

  1. Använd ett HTTP-testverktyg för att skicka en POST begäran till HTTP-utlösarslutpunkten, som bör likna:

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

    Svaret är HTTP-funktionens inledande resultat som meddelar dig att Durable Functions-orkestreringen har startats framgångsrikt. Även om svaret innehåller några användbara URL:er visas inte orkestreringens slutresultat ännu.

  2. Kopiera/klistra in URL-värdet för statusQueryGetUri i webbläsarens adressfält och kör. Du kan också fortsätta att använda HTTP-testverktyget för att utfärda GET begäran.

    Begäran frågar orkestreringsinstansen om statusen. Du bör se att instansen är klar och utdata eller resultat från Durable Functions-appen.

    {
        "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ästa steg

Läs mer om: