Creare le prime funzioni in contenitori in App Azure Container
Questo articolo illustra come creare un'app per le funzioni in esecuzione in un contenitore Linux e distribuirla in un ambiente app contenitore di Azure da un registro contenitori. Distribuendo in App contenitore, è possibile integrare le app per le funzioni in microservizi nativi del cloud. Per altre informazioni, vedere Hosting di App contenitore di Azure di Funzioni di Azure.
Questo articolo illustra come creare funzioni in esecuzione in un contenitore Linux e distribuire il contenitore in un ambiente App contenitore.
Il completamento di questa guida introduttiva comporta un costo ridotto di pochi centesimi di USD o inferiore nell'account Azure, che è possibile ridurre al minimo pulendo le risorse al termine.
Scegliere il linguaggio di sviluppo
Prima di tutto, si usano gli strumenti di Funzioni di Azure per creare il codice del progetto come app per le funzioni in un contenitore Docker usando un'immagine di base Linux specifica del linguaggio. Assicurarsi di selezionare la lingua preferita nella parte superiore dell'articolo.
Core Tools genera automaticamente un Dockerfile per il progetto che usa la versione più aggiornata dell'immagine di base corretta per il linguaggio di funzioni. È consigliabile aggiornare regolarmente il contenitore dall'immagine di base più recente e ridistribuire dalla versione aggiornata del contenitore. Per altre informazioni, vedere Creazione di app per le funzioni in contenitori.
Prerequisiti
Prima di iniziare, è necessario disporre dei requisiti seguenti:
Installare .NET 8.0 SDK.
Installare Azure Functions Core Tools 4.0.5198 o versione successiva.
- Installare Azure Functions Core Tools versione 4.x.
- Installare una versione di Node.js supportata da Funzioni di Azure.
- Installare una versione di Python supportata da Funzioni di Azure.
- Installare .NET 6 SDK.
Installare una versione di Java Developer Kit supportata da Funzioni di Azure.
Installare Apache Maven versione 3.0 o successive.
- L’interfaccia della riga di comando di Azure versione 2.4 o successiva.
Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.
Per pubblicare l'immagine dell'app per le funzioni in contenitori creata in un registro contenitori, è necessario un ID Docker e Docker in esecuzione nel computer locale. Se non si ha un ID Docker, è possibile creare un account Docker.
È anche necessario completare la sezione Creare un registro contenitori della guida introduttiva di Registro Container per creare un'istanza del Registro Azure Container. Prendere nota del nome completo del server di accesso.
Creare e attivare un ambiente virtuale
In una cartella appropriata eseguire i comandi seguenti per creare e attivare un ambiente virtuale denominato .venv
. Assicurarsi di usare una delle versioni di Python supportate da Funzioni di Azure.
python -m venv .venv
source .venv/bin/activate
Se Python non ha installato il pacchetto venv nella distribuzione Linux, eseguire il comando seguente:
sudo apt-get install python3-venv
È possibile eseguire tutti i comandi successivi in questo ambiente virtuale attivato.
Creare e testare il progetto locale di funzioni
In un terminale o al prompt dei comandi eseguire il comando seguente per il linguaggio scelto per creare un progetto di app per le funzioni nella cartella corrente:
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
In una cartella vuota eseguire il comando seguente per generare il progetto di Funzioni da un archetipo Maven:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker
Il parametro -DjavaVersion
indica al runtime di Funzioni la versione di Java da usare. Usare -DjavaVersion=11
per eseguire le funzioni in Java 11. Quando non si specifica -DjavaVersion
, Maven usa per impostazione predefinita Java 8. Per altre informazioni, vedere Versioni di Java.
Importante
Per completare questo articolo, è necessario impostare la variabile di ambiente JAVA_HOME
sul percorso di installazione della versione corretta di JDK.
Maven chiede i valori necessari per completare la generazione del progetto nella distribuzione. Seguire le istruzioni e specificare le informazioni seguenti:
Richiesta | Valore | Descrizione |
---|---|---|
groupId | com.fabrikam |
Un valore che identifica in modo univoco il progetto tra tutti gli altri, seguendo le regole di denominazione dei pacchetti per Java. |
artifactId | fabrikam-functions |
Un valore che corrisponde al nome del jar, senza un numero di versione. |
version | 1.0-SNAPSHOT |
Selezionare il valore predefinito. |
package | com.fabrikam.functions |
Un valore che corrisponde al pacchetto Java per il codice della funzione generato. Usare quello predefinito. |
Digitare Y
o premere INVIO per confermare.
Maven crea i file di progetto in una nuova cartella denominata artifactId, che in questo esempio è fabrikam-functions
.
L'opzione --docker
genera un Dockerfile per il progetto, che definisce un contenitore adatto da usare con Funzioni di Azure e con il runtime selezionato.
Passare alla cartella del progetto:
cd fabrikam-functions
Usare il comando seguente per aggiungere una funzione al progetto, in cui l'argomento --name
è il nome univoco della funzione e l'argomento --template
specifica il trigger della funzione. func new
crea un file di codice C# nel progetto.
func new --name HttpExample --template "HTTP trigger"
Usare il comando seguente per aggiungere una funzione al progetto, in cui l'argomento --name
è il nome univoco della funzione e l'argomento --template
specifica il trigger della funzione. func new
crea una sottocartella corrispondente al nome della funzione che contiene un file di configurazione denominato function.json.
func new --name HttpExample --template "HTTP trigger"
Per testare la funzione in locale, avviare l'host di runtime locale di Funzioni di Azure nella radice della cartella del progetto.
func start
func start
npm install
npm start
mvn clean package
mvn azure-functions:run
Dopo aver visualizzato l'endpoint HttpExample
scritto nell'output, passare a tale endpoint. Nell'output della risposta dovrebbe essere visualizzato un messaggio di benvenuto.
Dopo aver visualizzato l'endpoint HttpExample
scritto nell'output, passare a http://localhost:7071/api/HttpExample?name=Functions
. Il browser deve visualizzare un messaggio "hello" che richiama Functions
, il valore fornito al parametro di query name
.
Premere CTRL+C ( comando+C in macOS) per arrestare l'host.
Compilare l'immagine del contenitore e verificare localmente
Facoltativo - Esaminare il Dockerfile nella radice della cartella del progetto. Il Dockerfile descrive l'ambiente necessario per eseguire l'app per le funzioni in Linux. L'elenco completo di immagini di base supportate per Funzioni di Azure è disponibile nella pagina delle immagini di base per Funzioni di Azure.
Nella cartella radice del progetto eseguire il comando docker build, specificare un nome come azurefunctionsimage
e un tag come v1.0.0
. Sostituire <DOCKER_ID>
con l'ID dell'account Docker Hub. Questo comando compila l'immagine Docker per il contenitore.
docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
Al termine del comando, è possibile eseguire il nuovo contenitore in locale.
Per verificare la compilazione, eseguire l'immagine in un contenitore locale usando il comando docker run, sostituire <DOCKER_ID>
di nuovo con l'ID account dell'hub Docker e aggiungere l'argomento porte come -p 8080:80
:
docker run -p 8080:80 -it <DOCKER_ID>/azurefunctionsimage:v1.0.0
Dopo l'avvio dell'immagine nel contenitore locale, passare a http://localhost:8080/api/HttpExample
, che deve visualizzare lo stesso messaggio di saluto di prima. Poiché la funzione attivata da HTTP creata usa l'autorizzazione anonima, è possibile chiamare la funzione in esecuzione nel contenitore senza dover ottenere una chiave di accesso. Per altre informazioni, vedere Chiavi di autorizzazione.
Dopo l'avvio dell'immagine nel contenitore locale, passare a http://localhost:8080/api/HttpExample?name=Functions
, che deve visualizzare lo stesso messaggio "hello" di prima. Poiché la funzione attivata da HTTP creata usa l'autorizzazione anonima, è possibile chiamare la funzione in esecuzione nel contenitore senza dover ottenere una chiave di accesso. Per altre informazioni, vedere Chiavi di autorizzazione.
Dopo aver verificato l'app per le funzioni nel contenitore, premere CTRL+C (comando+C in macOS) per arrestare l'esecuzione.
Pubblicare l'immagine del contenitore in un registro
Per rendere disponibile l'immagine del contenitore per la distribuzione in un ambiente di hosting, è necessario eseguirne il push in un registro contenitori.
Registro Azure Container è un servizio registro privato per la creazione, l'archiviazione e la gestione delle immagini di contenitori e degli artefatti correlati. È consigliabile usare un servizio registro privato per pubblicare i contenitori nei servizi di Azure.
Usare questo comando per accedere all'istanza del Registro di sistema usando le credenziali di Azure correnti:
az acr login --name <REGISTRY_NAME>
Nel comando precedente sostituire
<REGISTRY_NAME>
con il nome dell'istanza del Registro Container.Usare il comando per contrassegnare l'immagine con il nome completo del server di accesso del Registro di sistema:
docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Sostituire
<LOGIN_SERVER>
con il nome completo del server di accesso del Registro di sistema e<DOCKER_ID>
con l'ID Docker.Usare il comando per eseguire il push del contenitore nell'istanza del Registro di sistema:
docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Creare le risorse di Azure di supporto per la funzione
Prima di distribuire il contenitore in Azure, è necessario creare tre risorse:
- Un gruppo di risorse, ovvero un contenitore logico di risorse correlate.
- Un account di archiviazione, usato per mantenere lo stato e altre informazioni sulle funzioni.
- Un ambiente di App Azure Container con un'area di lavoro Log Analytics.
Usare i comandi seguenti per creare questi elementi.
Se non è già stato fatto, accedere ad Azure.
Il comando
az login
consente di accedere all'account Azure. Usareaz account set
quando si dispone di più sottoscrizioni associate all'account.Eseguire il comando seguente per aggiornare l'interfaccia della riga di comando di Azure alla versione più recente:
az upgrade
Se la versione dell'interfaccia della riga di comando di Azure non è la versione più recente, viene avviata un'installazione. Il modo di aggiornamento dipende dal sistema operativo. È possibile procedere al termine dell'aggiornamento.
Eseguire i comandi seguenti per aggiornare l'estensione App Azure Container e registrare gli spazi dei nomi richiesti dalle app contenitore:
az extension add --name containerapp --upgrade -y az provider register --namespace Microsoft.Web az provider register --namespace Microsoft.App az provider register --namespace Microsoft.OperationalInsights
Creare un gruppo di risorse denominato
AzureFunctionsContainers-rg
.az group create --name AzureFunctionsContainers-rg --location eastus
Questo comando
az group create
crea un gruppo di risorse nell'area Stati Uniti orientali. Se invece si vuole usare un'area vicina, usando un codice di area disponibile restituito dal comando az account list-locations. È necessario modificare i comandi successivi per usare l'area personalizzata anzichéeastus
.Creare l'ambiente dell'app Azure Container con i profili di carico di lavoro abilitati.
az containerapp env create --name MyContainerappEnvironment --enable-workload-profiles --resource-group AzureFunctionsContainers-rg --location eastus
Il completamento del comando può richiedere alcuni minuti.
Creare un account di archiviazione per utilizzo generico nel gruppo di risorse e nell'area.
az storage account create --name <STORAGE_NAME> --location eastus --resource-group AzureFunctionsContainers-rg --sku Standard_LRS
Il comando
az storage account create
crea l'account di archiviazione.Nell'esempio precedente sostituire
<STORAGE_NAME>
con un nome appropriato e univoco in Archiviazione di Azure. I nomi di archiviazione devono contenere da 3 a 24 caratteri costituiti esclusivamente da numeri e lettere in minuscolo.Standard_LRS
specifica un account per utilizzo generico supportato da Funzioni.
Creare e configurare un'app per le funzioni in Azure con l'immagine
Un'app per le funzioni in Azure gestisce l'esecuzione delle funzioni nell'ambiente app Azure Container. In questa sezione si usano le risorse di Azure della sezione precedente per creare un'app per le funzioni da un'immagine in un registro contenitori in un ambiente App contenitore. È anche possibile configurare il nuovo ambiente con una stringa di connessione per l'account di archiviazione di Azure necessario.
Usare il comando az functionapp create
per creare un'app per le funzioni nel nuovo ambiente gestito supportato da App Contenitore di Azure:
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime dotnet-isolated --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime node --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime java --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime powershell --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime python --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --workload-profile-name "Consumption" --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime node --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --assign-identity
Nel comando az functionapp create
, il parametro --environment
specifica l'ambiente App contenitore e il parametro --image
specifica l'immagine da usare per l'app per le funzioni. In questo esempio, sostituire <STORAGE_NAME>
con il nome usato nella sezione precedente per l'account di archiviazione. Sostituire anche <APP_NAME>
con un nome univoco globale appropriato per l'utente e <LOGIN_SERVER>
con il server del Registro Container completo.
Per usare un'identità gestita assegnata dal sistema per accedere al registro contenitori, è necessario abilitare le identità gestite nell'app e concedere all'identità gestita assegnata dal sistema l'accesso al registro contenitori. Questo esempio usa il comando az functionapp identity assign
e az role assignment create
per abilitare le identità gestite nell'app e assegnare l'identità assegnata dal sistema al ruolo ACRPull
nel registro contenitori:
FUNCTION_APP_ID=$(az functionapp identity assign --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --query principalId --output tsv)
ACR_ID=$(az acr show --name <REGISTRY_NAME> --query id --output tsv)
az role assignment create --assignee $FUNCTION_APP_ID --role AcrPull --scope $ACR_ID
In questo esempio sostituire rispettivamente <APP_NAME>
e <REGISTRY_NAME>
con il nome dell'app per le funzioni e del registro contenitori.
Se si specifica --workload-profile-name "Consumption"
, l'app viene creata in un ambiente usando il profilo di carico di lavoro Consumption
predefinito, che costa come in esecuzione in un piano a consumo di app contenitore. Quando si crea l'app per le funzioni per la prima volta, l'immagine iniziale viene estratta dal registro.
A questo punto, le funzioni vengono eseguite in un ambiente App contenitore, con le impostazioni dell'applicazione necessarie già aggiunte. Quando necessario, è possibile aggiungere altre impostazioni nell'app per le funzioni nel modo standard per Funzioni. Per altre informazioni, vedere Usare le impostazioni dell'applicazione.
Suggerimento
Quando si apportano modifiche successive al codice della funzione, è necessario ricompilare il contenitore, ripubblicare l'immagine nel Registro di sistema e aggiornare l'app per le funzioni con la nuova versione dell'immagine. Per altre informazioni, vedere Aggiornare un'immagine nel Registro di sistema.
Verificare le funzioni in Azure
Con l'immagine distribuita nell'app per le funzioni in Azure, è ora possibile richiamare la funzione tramite richieste HTTP.
Eseguire il comando
az functionapp function show
seguente per ottenere l'URL della nuova funzione:az functionapp function show --resource-group AzureFunctionsContainers-rg --name <APP_NAME> --function-name HttpExample --query invokeUrlTemplate
Sostituire
<APP_NAME>
con il nome dell'app per le funzioni.
- Usare l'URL appena ottenuto per chiamare l'endpoint della funzione
HttpExample
, aggiungendo la stringa di query?name=Functions
.
- Usare l'URL appena ottenuto per chiamare l'endpoint della funzione
HttpExample
.
Quando si passa a questo URL, il browser deve visualizzare un output simile a quello eseguito in locale.
L'URL della richiesta dovrebbe essere simile al seguente:
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample?name=functions
https://myacafunctionapp.kindtree-796af82b.eastus.azurecontainerapps.io/api/httpexample
Pulire le risorse
Se si vuole continuare a usare Funzioni di Azure usando le risorse create in questo articolo, lasciarle tutte invariate.
Al termine dell'uso di questa distribuzione dell'app per le funzioni, eliminare il gruppo di risorse AzureFunctionsContainers-rg
per pulire tutte le risorse in tale gruppo:
az group delete --name AzureFunctionsContainers-rg