Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln skapar du en Azure Functions-app som körs i en Linux-container och distribuerar den till en Azure Container Apps-miljö från ett containerregister. Genom att distribuera till Container Apps kan du integrera dina funktionsappar i molnbaserade mikrotjänster. För mer information, se Azure Container Apps-värdtjänster för Azure Functions.
Att slutföra den här snabbstarten medför en liten kostnad i ditt Azure-konto, vilket du kan minimera genom att rensa resurser när du är klar.
Välj programmeringsspråk
Först använder du Azure Functions-verktyg för att skapa din projektkod som en funktionsapp i en Docker-container med hjälp av en språkspecifik Linux-basavbildning. Se till att välja valfritt språk överst i artikeln.
Core Tools genererar automatiskt en Dockerfile för projektet som använder den senaste versionen av rätt basavbildning för funktionsspråket. Du bör regelbundet uppdatera din container från den senaste versionen av basavbildningen och distribuera den uppdaterade versionen av containern på nytt. Mer information finns i Skapa containerbaserade funktionsappar.
Förutsättningar
Innan du börjar måste du ha följande krav på plats:
Installera .NET SDK.
Installera Azure Functions Core Tools version 4.0.5198 eller senare.
- Installera Azure Functions Core Tools version 4.x.
- Installera en version av Node.js som stöds av Azure Functions.
- Installera en version av Python som stöds av Azure Functions.
- Installera .NET SDK.
Installera en version av Java Developer Kit som stöds av Azure Functions.
Installera Apache Maven version 3.0 eller senare.
- Installera Azure CLI version 2.4 eller senare.
Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.
Om du vill publicera den containerbaserade funktionsappavbildningen som du skapar i ett containerregister behöver du ett Docker-ID och Docker Desktop som körs på den lokala datorn. Om du inte har något Docker-ID kan du skapa ett Docker-konto.
Du måste också slutföra avsnittet Skapa ett containerregister i snabbstarten för containerregister. Anteckna namnet på din fullständigt kvalificerade inloggningsserver.
Skapa och aktivera en virtuell miljö
I en lämplig mapp kör du följande kommandon för att skapa och aktivera en virtuell miljö med namnet .venv. Se till att använda någon av De Python-versioner som stöds av Azure Functions.
python -m venv .venv
source .venv/bin/activate
Om Python inte installerade venv-paketet på Linux-distributionen kör du följande kommando:
sudo apt-get install python3-venv
Du kör alla efterföljande kommandon i den här aktiverade virtuella miljön.
Skapa och testa projektet med lokala funktioner
I en terminal eller kommandotolk kör du följande kommando för det valda språket för att skapa ett funktionsappsprojekt i den aktuella mappen:
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
I en tom mapp kör du följande kommando för att generera Functions-projektet från en Maven-arketyp:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker
Parametern -DjavaVersion talar om för Functions-körningen vilken version av Java som ska användas. Använd -DjavaVersion=11 om du vill att funktionerna ska köras på Java 11. När du inte anger -DjavaVersion, anger Maven som standard Java 8. Mer information finns i Java-versioner.
Viktigt!
Miljövariabeln JAVA_HOME måste anges till installationsplatsen för rätt version av JDK för att slutföra den här artikeln.
Maven ber dig om de värden som behövs för att slutföra genereringen av projektet vid distributionen. Följ anvisningarna och ange följande information:
| Omedelbar | Värde | Description |
|---|---|---|
| groupId | com.fabrikam |
Ett värde som unikt identifierar projektet i alla projekt, enligt namngivningsreglerna för paket för Java. |
| artifactId | fabrikam-functions |
Ett värde som är namnet på jar-filen, utan ett versionsnummer. |
| version | 1.0-SNAPSHOT |
Välj standardvärdet. |
| paket | com.fabrikam.functions |
Ett värde som är Java-paketet för den genererade funktionskoden. Använd standardvärdet. |
Skriv Y eller tryck på Retur för att bekräfta.
Maven skapar projektfilerna i en ny mapp med namnet artifactId, som i det här exemplet är fabrikam-functions.
Alternativet --docker genererar en Dockerfile för projektet, som definierar en lämplig container för användning med Azure Functions och den valda körningen.
Navigera till projektmappen:
cd fabrikam-functions
Använd följande kommando för att lägga till en funktion i projektet, där --name argumentet är det unika namnet på din funktion och --template argumentet anger funktionens utlösare.
func new skapar en C#-kodfil i projektet.
func new --name HttpExample --template "HTTP trigger"
Använd följande kommando för att lägga till en funktion i projektet, där --name argumentet är det unika namnet på din funktion och --template argumentet anger funktionens utlösare.
func new skapar en undermapp som matchar funktionsnamnet som innehåller en konfigurationsfil med namnet function.json.
func new --name HttpExample --template "HTTP trigger"
Om du vill testa funktionen lokalt startar du den lokala Azure Functions-runtimevärd i roten i projektmappen.
Kontrollera att auktoriseringsnivån är inställd AuthorizationLevel.Anonymouspå eller ange den om den inte redan har konfigurerats för att säkerställa att funktionen kan anropas senare när den finns i Docker.
func start
func start
npm install
npm start
mvn clean package
mvn azure-functions:run
När du ser slutpunkten skrivas till utdata, navigera till den slutpunkten. Du bör se ett välkomstmeddelande i svarsutdata.
När du ser slutpunkten HttpExample skriven till utdata går du till http://localhost:7071/api/HttpExample?name=Functions. Webbläsaren måste visa ett "hello"-meddelande som ekar tillbaka Functions, värdet som anges till name frågeparametern.
Tryck på Ctrl+C (Kommando+C på macOS) för att stoppa värden.
Skapa containeravbildningen och verifiera lokalt
(Valfritt) Granska Dockerfile i roten för projektmappen. Dockerfile beskriver den miljö som krävs för att köra funktionsappen i Linux. Den fullständiga listan över basavbildningar som stöds för Azure Functions finns på basavbildningssidan för Azure Functions.
Kör kommandot docker build i rotprojektmappen, ange ett namn som azurefunctionsimageoch tagga som v1.0.0. Ersätt <DOCKER-ID> med ditt konto-ID för Docker Hub. Det här kommandot skapar Docker-avbildningen för containern.
docker build --tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 .
När kommandot har slutförts kan du köra den nya containern lokalt.
Kontrollera bygget genom att köra avbildningen i en lokal container med kommandot docker run , ersätta <DOCKER-ID> igen med ditt Docker Hub-konto-ID och lägga till portargumentet som -p 8080:80:
docker run -p 8080:80 -it <DOCKER-ID>/azurefunctionsimage:v1.0.0
När avbildningen startar i den lokala containern bläddrar du till http://localhost:8080/api/HttpExample, som måste visa samma hälsningsmeddelande som tidigare. Eftersom den HTTP-utlösta funktion som du skapade använder anonym auktorisering kan du anropa funktionen som körs i containern utan att behöva hämta en åtkomstnyckel. Mer information finns i auktoriseringsnycklar.
När avbildningen startar i den lokala containern bläddrar du till http://localhost:8080/api/HttpExample?name=Functions, som måste visa samma "hello"-meddelande som tidigare. Eftersom den HTTP-utlösta funktion som du skapade använder anonym auktorisering kan du anropa funktionen som körs i containern utan att behöva hämta en åtkomstnyckel. Mer information finns i auktoriseringsnycklar.
När du har verifierat funktionsappen i containern trycker du på Ctrl+C (Kommando+C på macOS) för att stoppa körningen.
Publicera containeravbildningen till ett register
Om du vill göra containeravbildningen tillgänglig för distribution till en värdmiljö måste du skicka den till ett containerregister. Som bästa säkerhet bör du använda en Azure Container Registry-instans och framtvinga hanterade identitetsbaserade anslutningar. Docker Hub kräver att du autentiserar med delade hemligheter, vilket gör dina distributioner mer sårbara.
Azure Container Registry är en privat registertjänst för att skapa, lagra och hantera containeravbildningar och relaterade artefakter. Du bör använda en privat registertjänst för att publicera dina containrar till Azure-tjänster.
Använd det här kommandot för att logga in på registerinstansen med dina aktuella Azure-autentiseringsuppgifter. Ersätt
<REGISTRY-NAME>med namnet på containerregisterinstansen.az acr login --name <REGISTRY-NAME>Använd det här kommandot för att tagga avbildningen med det fullständigt kvalificerade namnet på registerinloggningsservern. Ersätt
<LOGIN-SERVER>med det fullständigt kvalificerade namnet på registerinloggningsservern och<DOCKER-ID>med ditt Docker-ID.docker tag <DOCKER-ID>/azurefunctionsimage:v1.0.0 <LOGIN-SERVER>/azurefunctionsimage:v1.0.0Använd det här kommandot för att skicka containern till registerinstansen:
docker push <LOGIN-SERVER>/azurefunctionsimage:v1.0.0
Skapa stödjande Azure-resurser för din funktion
Innan du kan distribuera din container till Azure måste du skapa tre resurser:
En resursgrupp, som är en logisk container för relaterade resurser.
Ett Azure Storage-konto som används för att underhålla tillstånd och annan information om dina funktioner.
En Azure Container Apps-miljö med en Log Analytics-arbetsyta.
En användartilldelad hanterad identitet som gör att funktionsappen kan ansluta till Azure-resurser på ett säkert sätt utan att använda delade hemligheter. Anslutningar till både Azure Storage-kontot och Till Azure Container Registry-instansen görs i stället med hjälp av Microsoft Entra-autentisering med identiteten, vilket rekommenderas för det här scenariot.
Anmärkning
Docker Hub stöder inte hanterade identiteter.
Använd dessa kommandon för att skapa nödvändiga Azure-resurser:
Om det behövs loggar du in på Azure:
Kommandot
az loginloggar in dig på ditt Azure-konto. Användaz account setnär du har fler än en prenumeration associerad med ditt konto.Kör följande kommando för att uppdatera Azure CLI till den senaste versionen:
az upgradeOm din version av Azure CLI inte är den senaste versionen påbörjas en installation. Hur uppgraderingen fungerar beror på operativsystemet. Du kan fortsätta när uppgraderingen är klar.
Kör följande kommandon som uppgraderar Azure Container Apps-tillägget och registrerar namnområden som krävs av Container Apps:
az extension add --name containerapp --upgrade -y az provider register --namespace Microsoft.Web az provider register --namespace Microsoft.App az provider register --namespace Microsoft.OperationalInsightsSkapa en resursgrupp med namnet
AzureFunctionsContainers-rg.az group create --name AzureFunctionsContainers-rg --location eastusDet här
az group createkommandot skapar en resursgrupp i regionen USA, östra. Om du i stället vill använda en region nära dig använder du en tillgänglig regionkod som returneras frånaz account list-locationskommandot. Du måste ändra efterföljande kommandon för att använda din anpassade region i stället föreastus.Skapa en Azure Container Apps-miljö.
az containerapp env create --name MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --location eastusDet kan ta några minuter att köra kommandot.
Skapa ett allmänt lagringskonto i din resursgrupp och region, utan åtkomst till delad nyckel. I kommandot ersätter du
<STORAGE-NAME>med ett namn som är lämpligt för dig och unikt i Azure Storage. Lagringsnamn måste innehålla 3 till 24 tecken och får endast bestå av siffror och små bokstäver.az storage account create --name <STORAGE-NAME> --location eastus --resource-group AzureFunctionsContainers-rg --sku Standard_LRS --allow-blob-public-access false --allow-shared-key-access falseKommandot
az storage account createskapar ett lagringskonto som endast är tillgängligt med hjälp av Microsoft Entra-autentiserade identiteter som beviljas behörighet till specifika resurser.Standard_LRSanger ett allmänt konto som stöds av Functions.Skapa en hanterad identitet och använd den returnerade
principalIdför att ge den både åtkomst till ditt lagringskonto och pull-behörigheter i registerinstansen. Ersätt<REGISTRY-NAME>,<USER-IDENTITY-NAME>och<STORAGE-NAME>med namnet på ditt befintliga containerregister, namnet på din hanterade identitet respektive lagringskontonamnet.principalId=$(az identity create --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --location eastus --query principalId -o tsv) acrId=$(az acr show --name <REGISTRY-NAME> --query id --output tsv) az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role acrpull --scope $acrId storageId=$(az storage account show --resource-group AzureFunctionsContainers-rg --name <STORAGE-NAME> --query 'id' -o tsv) az role assignment create --assignee-object-id $principalId --assignee-principal-type ServicePrincipal --role "Storage Blob Data Owner" --scope $storageIdKommandot
az identity createskapar en användartilldelad hanterad identitet ochaz role assignment createkommandona lägger till din identitet i de roller som krävs.Den hanterade identiteten är nu tillgänglig för appen för åtkomst till både lagringskontot och Azure Container Registry utan att använda delade hemligheter.
Skapa och konfigurera en funktionsapp i Azure med avbildningen
En funktionsapp i Azure hanterar körningen av dina funktioner i din Azure Container Apps-miljö. I det här avsnittet använder du Azure-resurserna från föregående avsnitt för att skapa en funktionsapp från en avbildning i ett containerregister i en Container Apps-miljö. Du konfigurerar också den nya miljön med en anslutningssträng till det Azure Storage-konto som krävs.
az containerapp create --kind=functionapp Använd kommandot för att skapa en funktionsapp i den nya hanterade miljön som backas upp av Azure Container Apps. Inom az containerapp create --kind-functionapp specificerar parametern --environment Container Apps-miljön.
Tips/Råd
Ange inte parametern i --imageför att se till att funktionsappen använder en hanterad identitetsbaserad anslutning till registerinstansenaz containerapp create --kind=functionapp. När du anger --image det fullständigt kvalificerade namnet på avbildningen på lagringsplatsen hämtas delade hemliga autentiseringsuppgifter från registret och lagras i appinställningarna.
Först måste du hämta det fullständigt kvalificerade ID-värdet för din användartilldelade hanterade identitet med pull-åtkomst till registret och sedan använda az containerapp create --kind=functionapp kommandot för att skapa en funktionsapp med hjälp av standardbilden och med den här identiteten tilldelad till den.
UAMI_RESOURCE_ID=$(az identity show --name $uami_name --resource-group $group --query id -o tsv)
az containerapp create --name <APP-NAME> --storage-account <STORAGE-NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --assign-identity $UAMI_RESOURCE_ID
I az containerapp create --kind=functionapp tilldelar --assign-identity din hanterade identitet till den nya appen. Eftersom du inte angav parametern --image i az functionapp createskapas programmet med hjälp av en platshållarbild.
I det här exemplet ersätter <APP-NAME> och <STORAGE-NAME> med ett namn för din nya funktionsapp samt namnet på ditt lagringskonto.
Slutligen, måste du uppdatera platsinställningen linuxFxVersion till det fullständigt kvalificerade namnet på bilden i lagringsplatsen. Du måste också uppdatera platsinställningarna av acrUseManagedIdentityCreds och acrUserManagedIdentityID så att hanterade identiteter används när du hämtar bilden från registret.
UAMI_RESOURCE_ID=$(az identity show --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --query id -o tsv)
az resource patch --resource-group AzureFunctionsContainers-rg --name <APP-NAME> --resource-type "Microsoft.Web/sites" --properties "{ \"siteConfig\": { \"linuxFxVersion\": \"DOCKER|<REGISTRY-NAME>.azurecr.io/azurefunctionsimage:v1.0.0\", \"acrUseManagedIdentityCreds\": true, \"acrUserManagedIdentityID\":\"$UAMI_RESOURCE_ID\", \"appSettings\": [{\"name\": \"DOCKER_REGISTRY_SERVER_URL\", \"value\": \"<REGISTRY-NAME>.azurecr.io\"}]}}"
Förutom de nödvändiga platsinställningarna az resource patch uppdaterar kommandot även appinställningen DOCKER_REGISTRY_SERVER_URL till URL:en för registerservern.
I det här exemplet ersätter <APP-NAME>du , <REGISTRY-NAME>och <USER-IDENTITY-NAME> med namnen på funktionsappen, containerregistret respektive identiteten.
När du anger --workload-profile-name "Consumption" skapas din app i en miljö med standardprofilen Consumption för arbetsbelastningen, vilket kostar samma sak som att köra i en förbrukningsplan för containerappar. När du först skapar funktionsappen hämtas den första avbildningen från registret.
Uppdatera programinställningar
Om du vill att Functions-värden ska kunna ansluta till standardlagringskontot med delade nycklar måste du ersätta inställningen för anslutningssträng AzureWebJobsStorage med en motsvarande inställning som använder den hanterade identiteten som tilldelats användaren för att ansluta till lagringskontot.
Ta bort den befintliga
AzureWebJobsStorageinställningen för anslutningssträng:az containerapp config appsettings delete --name <APP-NAME> --resource-group AzureFunctionsContainers-rg --setting-names AzureWebJobsStorageKommandot
az containerapp config appsettings deletetar bort den här inställningen från din app. Ersätt<APP-NAME>med namnet på funktionsappen.Lägg till motsvarande inställningar med ett
AzureWebJobsStorage__prefix som definierar en användartilldelad hanterad identitetsanslutning till standardlagringskontot:clientId=$(az identity show --name <USER-IDENTITY-NAME> --resource-group AzureFunctionsContainers-rg --query 'clientId' -o tsv) az containerapp config appsettings set --name <APP-NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage__accountName=<STORAGE-NAME> AzureWebJobsStorage__credential=managedidentity AzureWebJobsStorage__clientId=$clientIdI det här exemplet ersätter du
<APP-NAME>,<USER-IDENTITY-NAME>,<STORAGE-NAME>med funktionsappens namn, namnet på din identitet respektive lagringskontonamnet.
I det här läget körs dina funktioner i en Container Apps-miljö, och de nödvändiga programinställningarna har redan lagts till. När det behövs kan du lägga till andra inställningar i funktionsappen på standardsättet för Functions. Mer information finns i Arbeta med programinställningar.
Tips/Råd
När du gör efterföljande ändringar i funktionskoden måste du återskapa containern, publicera om avbildningen till registret och uppdatera funktionsappen med den nya avbildningsversionen.
Verifiera dina funktioner i Azure
När avbildningen har distribuerats till funktionsappen i Azure kan du nu anropa funktionen via HTTP-begäranden. Få detaljerad information om en specifik funktion:
az containerapp function show \
--resource-group AzureFunctionsContainers-rg \
--name <APP-NAME> \
--function-name HttpExample
Ersätt <APP-NAME> med namnet på funktionsappen. Använd url:en som du nyss hämtade för att anropa funktionsslutpunkten HttpExample och lägga till frågesträngen ?name=Functions.
Begärande-URL:en bör se ut ungefär så här:
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample
Go stöds för närvarande inte för denna funktion.
Rensa resurser
Om du vill fortsätta arbeta med Azure Function med hjälp av de resurser som du skapade i den här artikeln kan du lämna alla dessa resurser på plats.
När du är klar med distributionen av funktionsappen AzureFunctionsContainers-rg tar du bort resursgruppen för att rensa alla resurser i gruppen:
az group delete --name AzureFunctionsContainers-rg