Creare la prima funzione di Azure in contenitori
Questo articolo illustra come creare un'app per le funzioni in esecuzione in un contenitore Linux e distribuirla in Funzioni di Azure.
La distribuzione del codice della funzione in Funzioni di Azure in un contenitore richiede l’hosting con un piano Premium o un piano dedicato (servizio app). Il completamento di questo articolo comporta l'addebito di alcuni euro sull'account Azure, ma per ridurre i costi pulire le risorse al termine dell'esercitazione.
Altre opzioni per la distribuzione del contenitore dell'app per le funzioni in Azure includono:
App Azure Container: per altre informazioni, vedere Distribuire un contenitore nelle app di Azure Container.
Azure Arc (attualmente in anteprima): per altre informazioni, vedere Distribuire un contenitore in Azure Arc.
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'app per le funzioni, che fornisce l'ambiente per l'esecuzione del codice della funzione. Un'app per le funzioni si collega al progetto di funzione locale e consente di raggruppare le funzioni come un'unità logica per semplificare la gestione, la distribuzione e la condivisione di risorse.
Usare i comandi seguenti per creare questi elementi. Sono supportati sia l'interfaccia della riga di comando di Azure che PowerShell. Per creare le risorse di Azure con Azure PowerShell, è necessario anche il modulo Az PowerShell versione 5.9.0 o successiva.
Se non è già stato fatto, accedere ad Azure.
az login
Il comando
az login
consente di accedere all'account Azure.Creare un gruppo di risorse denominato
AzureFunctionsContainers-rg
nell'area scelta.az group create --name AzureFunctionsContainers-rg --location <REGION>
Il comando
az group create
crea un gruppo di risorse. Nel comando precedente sostituire<REGION>
con un'area vicina usando un codice di area disponibile restituito dal comando az account list-locations.Creare un account di archiviazione per utilizzo generico nel gruppo di risorse e nell'area.
az storage account create --name <STORAGE_NAME> --location <REGION> --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.Usare il comando per creare un piano Premium per Funzioni di Azure denominato
myPremiumPlan
nel piano tariffario Elastic Premium 1 (--sku EP1
), in<REGION>
e in un contenitore Linux (--is-linux
).az functionapp plan create --resource-group AzureFunctionsContainers-rg --name myPremiumPlan --location <REGION> --number-of-workers 1 --sku EP1 --is-linux
In questo caso viene usato il piano Premium, che è scalabile secondo necessità. Per altre informazioni sull’hosting, vedere Confronto di piani di hosting per Funzioni di Azure. Per altre informazioni su come calcolare i costi, vedere la pagina dei prezzi di Funzioni.
Il comando crea anche un'istanza di Azure Application Insights associata nello stesso gruppo di risorse, con cui è possibile monitorare l'app per le funzioni e visualizzare i log. Per altre informazioni, vedere Monitorare Funzioni di Azure. L'istanza non comporta costi finché non viene attivata.
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 nel piano di hosting di Funzioni di Azure. In questa sezione, usare le risorse di Azure della sezione precedente per creare un'app per le funzioni da un'immagine in un registro contenitori e configurarla con una stringa di connessione ad Archiviazione di Azure.
Creare un'app per le funzioni usando il comando seguente, a seconda del registro contenitori:
az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --plan myPremiumPlan --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD>
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<DOCKER_ID>
o<LOGIN_SERVER>
rispettivamente con l'ID account dell'hub Docker o il server registro contenitori. Quando si esegue la distribuzione da un registro contenitori personalizzato, il nome dell'immagine indica l'URL del Registro di sistema.Quando si crea l'app per le funzioni per la prima volta, l'immagine iniziale viene estratta dall'hub Docker. È anche possibile Abilitare la distribuzione continua in Azure dal registro contenitori.
Suggerimento
È possibile usare l'impostazione
DisableColor
nel file host.json per impedire che i caratteri di controllo ANSI vengano scritti nei log del contenitore.Usare il comando seguente per ottenere la stringa di connessione per l'account di archiviazione creato:
az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv
La stringa di connessione per l'account di archiviazione viene restituita usando il comando
az storage account show-connection-string
.Sostituire
<STORAGE_NAME>
con il nome dell'account di archiviazione creato in precedenza.Usare il comando seguente per aggiungere l'impostazione all'app per le funzioni:
az functionapp config appsettings set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=<CONNECTION_STRING>
Il comando
az functionapp config appsettings set
crea l'impostazione.In questo comando sostituire
<APP_NAME>
con il nome dell'app per le funzioni e<CONNECTION_STRING>
con la stringa di connessione del passaggio precedente. La connessione deve essere una stringa con codifica lunga che inizia conDefaultEndpointProtocol=
.La funzione può ora usare questa stringa di connessione per accedere all'account di archiviazione.
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.
Pulire le risorse
Se si vuole continuare a usare Funzioni di Azure usando le risorse create in questo articolo, lasciarle tutte invariate. Poiché è stato creato un piano Premium per Funzioni di Azure, verranno addebitati uno o due dollari USA al giorno in costi ricorrenti.
Per evitare i costi ricorrenti, eliminare il gruppo di risorse AzureFunctionsContainers-rg
per pulire tutte le risorse nel gruppo:
az group delete --name AzureFunctionsContainers-rg