Creare la prima funzione di Azure in contenitori in Azure Arc (anteprima)

Questo articolo illustra come creare un'app per le funzioni in esecuzione in un contenitore Linux e distribuirla in un cluster Kubernetes abilitato per Azure Arc da un registro contenitori. Quando si crea un contenitore personalizzato, è possibile personalizzare l'ambiente di esecuzione per l'app per le funzioni. Per altre informazioni, vedere Servizio app, Funzioni e App per la logica in Azure Arc.

Nota

Il supporto per la distribuzione di un contenitore personalizzato in un cluster Kubernetes abilitato per Azure Arc è attualmente in anteprima.

È anche possibile pubblicare le funzioni in un cluster Kubernetes abilitato per Azure Arc senza prima creare un contenitore. Per altre informazioni, vedere Creare la prima funzione in Azure Arc (anteprima)

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:

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.

  1. 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.

  2. 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.

  3. Usare il comando per eseguire il push del contenitore nell'istanza del Registro di sistema:

    docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
    

Creare un ambiente Kubernetes del servizio app

Prima di iniziare, è necessario creare un ambiente Kubernetes del servizio app per un cluster Kubernetes abilitato per Azure Arc.

Nota

Quando si crea l'ambiente, assicurarsi di prendere nota sia del nome della posizione personalizzata che del nome del gruppo di risorse che contiene la posizione personalizzata. È possibile usarli per trovare l'ID percorso personalizzato, necessario quando si crea l'app per le funzioni nell'ambiente.

Se l'ambiente non è stato creato, rivolgersi all'amministratore del cluster.

Aggiungere estensioni dell'interfaccia della riga di comando di Azure

Avviare l'ambiente Bash in Azure Cloud Shell.

Poiché questi comandi dell'interfaccia della riga di comando non fanno ancora parte del set di interfaccia della riga di comando principale, aggiungerli con i comandi seguenti:

az extension add --upgrade --yes --name customlocation
az extension remove --name appservice-kube
az extension add --upgrade --yes --name appservice-kube

Creare risorse Azure

Prima di poter distribuire il contenitore nel nuovo ambiente Kubernetes del servizio app, è necessario creare altre due risorse:

  • Un account di archiviazione. Anche se questo articolo crea un account di archiviazione, in alcuni casi potrebbe non essere necessario un account di archiviazione. Per altre informazioni, vedere cluster abilitati per Azure Arc nell'articolo considerazioni sull'archiviazione.
  • Un'app per le funzioni, che fornisce il contesto per l'esecuzione del contenitore. L'app per le funzioni viene eseguita nell'ambiente Kubernetes del servizio app ed esegue il mapping al progetto di funzione locale. Un'app per le funzioni consente di raggruppare le funzioni come un'unità logica per semplificare la gestione, la distribuzione e la condivisione delle risorse.

Nota

Le app per le funzioni vengono eseguite in un ambiente Kubernetes del servizio app in un piano dedicato (servizio app). Quando si crea l'app per le funzioni senza un piano esistente, viene creato automaticamente un piano.

Creare un account di archiviazione

Creare un account di archiviazione per uso generico nel gruppo di risorse e nell'area con il comando az storage account create:

az storage account create --name <STORAGE_NAME> --location westeurope --resource-group myResourceGroup --sku Standard_LRS

Nota

In alcuni casi, potrebbe non essere necessario un account di archiviazione. Per altre informazioni, vedere cluster abilitati per Azure Arc nell'articolo considerazioni sull'archiviazione.

Nell'esempio precedente sostituire <STORAGE_NAME> con un nome appropriato e univoco in Archiviazione di Azure. I nomi devono contenere da tre a 24 caratteri costituiti esclusivamente da numeri e lettere in minuscolo. Standard_LRS specifica un account per utilizzo generico, che è supportato da Funzioni. Il valore --location è un'area di Azure standard.

Creare l'app per le funzioni

Eseguire il comando az functionapp create per creare una nuova app per le funzioni nell'ambiente.

az functionapp create --name <APP_NAME> --custom-location <CUSTOM_LOCATION_ID> --storage-account <STORAGE_NAME> --resource-group AzureFunctionsContainers-rg --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.0 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD> 

In questo esempio sostituire <CUSTOM_LOCATION_ID> con l'ID della posizione personalizzata determinata per l'ambiente Kubernetes del servizio app. Sostituire anche <STORAGE_NAME> con il nome dell'account usato nel passaggio precedente, <APP_NAME> con un nome univoco globale 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.

Impostare le impostazioni dell'app necessarie

Eseguire i comandi seguenti per creare un'impostazione dell'app per la stringa di connessione dell'account di archiviazione:

storageConnectionString=$(az storage account show-connection-string --resource-group AzureFunctionsContainers-rg --name <STORAGE_NAME> --query connectionString --output tsv)
az functionapp config appsettings set --name <app_name> --resource-group AzureFunctionsContainers-rg --settings AzureWebJobsStorage=$storageConnectionString

Questo codice deve essere eseguito in Cloud Shell o in Bash nel computer locale. Sostituire <STORAGE_NAME> con il nome dell'account di archiviazione e <APP_NAME> con il nome dell'app per le funzioni.

Richiamare la funzione in Azure

Poiché la funzione usa un trigger HTTP, è possibile richiamarla eseguendo una richiesta HTTP al relativo URL nel browser o con uno strumento come curl.

Copiare l'URL di richiamo completo visualizzato nell'output del comando publish nella barra degli indirizzi di un browser, aggiungendo il parametro di query ?name=Functions. Nel browser dovrebbe essere visualizzato un output simile a quello visualizzato quando è stata eseguita la funzione in locale.

Output della funzione eseguita in Azure in un browser

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

In questo articolo vengono rimosse solo le risorse create in questo articolo. L'ambiente Azure Arc sottostante rimane attivo.

Passaggi successivi