Uso di contenitori e Funzioni di Azure

Questo articolo illustra il supporto fornito da Funzioni di Azure per l'uso di app per le funzioni in contenitori in esecuzione in un ambiente di App Contenitore di Azure. Per altre informazioni, vedere Hosting di App contenitore di Azure di Funzioni di Azure.

Questo articolo illustra il supporto fornito da Funzioni di Azure per l'uso di app per le funzioni in esecuzione in contenitori Linux.

Scegliere l'ambiente di hosting per l'app per le funzioni in contenitori nella parte superiore dell'articolo.

Per iniziare subito, l'articolo seguente illustra come creare la prima funzione in esecuzione in un contenitore Linux e distribuire l'immagine da un registro contenitori a un servizio di hosting di Azure supportato:

Creazione di app per le funzioni in contenitori

Funzioni semplifica la distribuzione e l'esecuzione delle app per le funzioni come contenitori Linux, creati e gestiti. Funzioni gestisce un set di immagini di base specifiche del linguaggio che è possibile usare durante la creazione di app per le funzioni in contenitori.

Importante

Quando si creano contenitori personalizzati, è necessario mantenere aggiornata l'immagine di base del contenitore all'immagine di base supportata più recente. Le immagini di base supportate per Funzioni di Azure sono specifiche del linguaggio e sono disponibili nei repository dell'immagine di base di Funzioni di Azure.

Il team di Funzioni si impegna a pubblicare aggiornamenti mensili per queste immagini di base. Gli aggiornamenti regolari includono gli aggiornamenti della versione secondaria più recenti e le correzioni di sicurezza sia per il runtime di Funzioni che per i linguaggi. È consigliabile aggiornare regolarmente il contenitore dall'immagine di base più recente e ridistribuire la versione aggiornata del contenitore.

Per un esempio completo di come creare l'app per le funzioni in contenitori locale dalla riga di comando e pubblicare l'immagine in un registro contenitori, vedere Creare un'app per le funzioni in un contenitore locale.

Generare il Dockerfile

Gli strumenti di Funzioni offrono un'opzione Docker che genera un Dockerfile con il progetto di codice delle funzioni. È possibile usare questo file con Docker per creare le funzioni in un contenitore che deriva dall'immagine di base corretta (lingua e versione).

Il modo in cui si crea un Dockerfile dipende dalla modalità di creazione del progetto.

  • Quando si crea un progetto di Funzioni usando Azure Functions Core Tools, includere l'opzione --docker quando si esegue il comando func init, come nell'esempio seguente:

    func init --docker
    
  • È anche possibile aggiungere un Dockerfile a un progetto esistente usando l'opzione --docker-only quando si esegue il comando func init in una cartella di progetto esistente, come nell'esempio seguente:

    func init --docker-only
    

Per un esempio completo, vedere Creare un'app per le funzioni in un contenitore locale.

Creare l'app per le funzioni in un contenitore

Con un Dockerfile generato da Funzioni nel progetto di codice, è possibile usare Docker per creare l'app per le funzioni in contenitori nel computer locale. Il comando docker build seguente crea un'immagine delle funzioni in contenitori dal progetto nella directory locale:

docker build --tag <DOCKER_ID>/<IMAGE_NAME>:v1.0.0 .

Per un esempio di come creare il contenitore, vedere Creare l'immagine del contenitore e verificare localmente.

Aggiornare un'immagine nel Registro di sistema

Quando si apportano modifiche al progetto di codice delle funzioni o è necessario eseguire l'aggiornamento all'immagine di base più recente, è necessario ricompilare il contenitore in locale e ripubblicare l'immagine aggiornata nel registro contenitori scelto. Il comando seguente ricompila l'immagine dalla cartella radice con un numero di versione aggiornato e lo inserisce nel registro:

az acr build --registry <REGISTRY_NAME> --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.1 .

Sostituire <REGISTRY_NAME> con l'istanza del Registro Container e <LOGIN_SERVER> con il nome del server di accesso.

A questo punto, è necessario aggiornare una distribuzione esistente per usare la nuova immagine. È possibile aggiornare l'app per le funzioni per usare la nuova immagine usando l'interfaccia della riga di comando di Azure o nel portale di Azure:

az functionapp config container set --image <IMAGE_NAME> --registry-password <SECURE_PASSWORD>--registry-username <USER_NAME> --name <APP_NAME> --resource-group <RESOURCE_GROUP>

In questo esempio, <IMAGE_NAME> è il nome completo della nuova immagine con versione. I registri privati richiedono di specificare un nome utente e una password. Archiviare queste credenziali in modo sicuro.

È anche consigliabile considerare abilitare la distribuzione continua.

Creare il portale di Azure usando i contenitori

Quando si crea un'app per le funzioni nel portale di Azure, è possibile scegliere di distribuire l'app per le funzioni da un'immagine in un registro contenitori. Per informazioni su come creare un'app per le funzioni in contenitori in un registro contenitori, vedere Crea l'app per le funzioni in un contenitore.

La procedura seguente consente di creare e distribuire un'app per le funzioni in contenitori esistente da un registro contenitori.

  1. Nel menu del portale di Azure o dalla pagina Home selezionare Crea una risorsa.

  2. Nella pagina Nuovo, selezionare Calcolo>App per le funzioni.

  3. In Selezionare un'opzione di hostingscegliere piano Premium>Selezionare.

    Viene creata un'app per le funzioni ospitata da Funzioni di Azure nel piano Premium, che supporta il ridimensionamento dinamico. È anche possibile scegliere di eseguire in un piano di servizio app, ma in questo tipo di piano dedicato è necessario gestire il ridimensionamento dell'app per le funzioni.

  4. Nella pagina Informazioni di base usare le impostazioni dell'app per le funzioni specificate nella tabella seguente:

    Impostazione Valore suggerito Descrizione
    Abbonamento Sottoscrizione in uso Sottoscrizione in cui si crea l'app per le funzioni.
    Gruppo di risorse myResourceGroup Il nome del nuovo gruppo di risorse in cui viene creata l'app per le funzioni. È consigliabile creare un gruppo di risorse perché esistono limitazioni note durante la creazione di nuove app per le funzioni in un gruppo di risorse esistente.
    Nome dell'app per le funzioni Nome univoco* Nome che identifica la nuova app per le funzioni. I caratteri validi sono a-z (senza distinzione tra maiuscole e minuscole), 0-9 e -.
    Distribuire codice o immagine del contenitore? Immagine del contenitore Distribuire un'app per le funzioni in contenitori da un registro. Per creare un'app per le funzioni nel Registro di sistema, vedere Creare un'app per le funzioni in un contenitore locale.
    Area Area preferita Selezionare un'area vicina a sé o vicina ad altri servizi a cui le funzioni possono accedere.
    Piano Linux Nuovo piano (impostazione predefinita) Crea un nuovo piano Premium per ospitare l'app. È anche possibile scegliere un piano Premium esistente.
    Piano tariffario EP1 elastico Premium EP1 è il piano più conveniente. Se necessario, è possibile scegliere un piano più ampio.
    Ridondanza della zona Disabilitata Questa funzionalità non è necessaria in un'app non di produzione.

    *Il nome dell'app deve essere univoco a livello globale tra tutte le app ospitate in Funzioni di Azure.

  5. Accettare le opzioni predefinite per la creazione di un nuovo account di archiviazione nella scheda Applicazione e una nuova istanza di Application Insight nella scheda Monitoraggio. È anche possibile scegliere di usare un account di archiviazione esistente o un'istanza di Application Insights.

  6. Selezionare Rivedi e crea per rivedere le selezioni effettuate per la configurazione dell'app.

  7. Nella pagina Rivedi e crea esaminare le impostazioni e quindi selezionare Crea per effettuare il provisioning dell'app per le funzioni usando un'immagine di base predefinita.

  8. Dopo aver creato la risorsa dell'app per le funzioni, selezionare Vai alla risorsa e nella pagina dell'app per le funzioni selezionare Centro distribuzione.

  9. Nel Centro distribuzione è possibile connettere il registro contenitori come origine dell'immagine. È anche possibile abilitare GitHub Actions o Azure Pipelines per una distribuzione continua più affidabile degli aggiornamenti nel contenitore nel registro.

Creare il portale di Azure usando i contenitori

Quando si crea un'app per le funzioni ospitata in App contenitore nel portale di Azure, è possibile scegliere di distribuire l'app per le funzioni da un'immagine in un registro contenitori. Per informazioni su come creare un'app per le funzioni in contenitori in un registro contenitori, vedere Crea l'app per le funzioni in un contenitore.

La procedura seguente consente di creare e distribuire un'app per le funzioni in contenitori esistente da un registro contenitori.

  1. Nel menu del portale di Azure o dalla pagina Home selezionare Crea una risorsa.

  2. Nella pagina Nuovo, selezionare Calcolo>App per le funzioni.

  3. In Selezionare un'opzione di hostingscegliere ambiente App contenitore>Selezionare.

  4. Nella pagina Informazioni di base usare le impostazioni dell'app per le funzioni specificate nella tabella seguente:

    Impostazione Valore suggerito Descrizione
    Abbonamento Sottoscrizione in uso Sottoscrizione in cui si crea l'app per le funzioni.
    Gruppo di risorse myResourceGroup Il nome del nuovo gruppo di risorse in cui viene creata l'app per le funzioni. È consigliabile creare un gruppo di risorse perché esistono limitazioni note durante la creazione di nuove app per le funzioni in un gruppo di risorse esistente.
    Nome dell'app per le funzioni Nome univoco* Nome che identifica la nuova app per le funzioni. I caratteri validi sono a-z (senza distinzione tra maiuscole e minuscole), 0-9 e -.
    Area Area preferita Selezionare un'area vicina a sé o vicina ad altri servizi a cui le funzioni possono accedere.

    *Il nome dell'app deve essere univoco nell'ambiente app Azure Container.

  5. Sempre nella pagina Informazioni di base, accettare il nuovo ambiente consigliato per ambiente App contenitore di Azure. Per ridurre al minimo i costi, il nuovo ambiente predefinito viene creato nel consumo + dedicato con il profilo del carico di lavoro predefinito e senza ridondanza della zona. Per altre informazioni, vedere Hosting di App contenitore di Azure di Funzioni di Azure.

    È anche possibile scegliere di usare un ambiente app contenitore esistente. Per creare un ambiente personalizzato, selezionare Crea nuovo. Nella pagina Crea ambiente app contenitore è possibile aggiungere profili di carico di lavoro non predefiniti o abilitare la ridondanza della zona. Per informazioni sugli ambienti, vedere Ambienti di App Azure Container.

  6. Selezionare la scheda Distribuzione e deselezionare Usa immagine di avvio rapido. In caso contrario, l'app per le funzioni viene distribuita dall'immagine di base per il linguaggio dell'app per le funzioni.

  7. Scegliere il tipo di immagine, pubblico o privato. Scegliere Privato se si usa Registro Azure Container o un altro registro privato. Specificare il nome dell'immagine, incluso il prefisso del Registro di sistema. Se si usa un registro privato, specificare le credenziali di autenticazione del Registro di sistema delle immagini. L'impostazione Pubblica supporta solo le immagini archiviate pubblicamente nell'hub Docker.

  8. In Allocazione risorse contenitore selezionare il numero desiderato di core CPU e memoria disponibile. Se l'ambiente include altri profili di carico di lavoro aggiunti, è possibile selezionare un profilo del carico di lavoro non predefinito. Le scelte in questa pagina influiscono sul costo dell'hosting dell'app. Per stimare i potenziali costi, vedere la pagina dei prezzi di App contenitore.

  9. Selezionare Rivedi e crea per rivedere le selezioni effettuate per la configurazione dell'app.

  10. Nella pagina Rivedi e crea esaminare le impostazioni e quindi selezionare Crea per effettuare il provisioning dell'app per le funzioni e distribuire l'immagine del contenitore dal registro.

Usare immagini in Funzioni di Azure

Quando il contenitore dell'app per le funzioni viene distribuito da un registro, Funzioni mantiene informazioni sull'immagine di origine.

Usare i comandi seguenti per ottenere dati sull'immagine o modificare l'immagine di distribuzione usata:

Profili di carico di lavoro app contenitore

I profili di carico di lavoro sono funzionalità delle app contenitore che consentono di controllare meglio le risorse di distribuzione. Funzioni di Azure in App Azure Container supporta anche i profili di carico di lavoro. Per altre informazioni, vedere Profili del carico di lavoro in App Azure Container.

È anche possibile impostare la quantità di risorse di CPU e memoria allocate all'app.

È possibile creare e gestire sia i profili di carico di lavoro che le allocazioni delle risorse usando l'interfaccia della riga di comando di Azure o nel portale di Azure.

È possibile abilitare i profili di carico di lavoro quando si crea l'ambiente dell'app contenitore. Per un esempio, vedere Creare un'app contenitore in un profilo.

È possibile aggiungere, modificare ed eliminare profili nell'ambiente. Per un esempio, vedere Aggiungere profili.

Quando si crea un'app per le funzioni in contenitori in un ambiente con profili di carico di lavoro abilitati, è necessario specificare anche il profilo in cui eseguire. Per specificare il profilo, usare il parametro --workload-profile-name del comando az functionapp create, come nell'esempio seguente:

az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime <LANGUAGE_STACK> --image <IMAGE_URI> --workload-profile-name <PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

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 impostare le risorse allocate all'app, sostituire <CPU_COUNT> con il numero desiderato di CPU virtuali, con un minimo di 0,5 fino al massimo consentito dal profilo. Per <MEMORY_SIZE>, scegliere una quantità di memoria dedicata da 1 GB fino al massimo consentito dal profilo.

È possibile usare il comando az functionapp container set per gestire le risorse allocate e il profilo del carico di lavoro usato dall'app.

az functionapp container set --name <APP_NAME> --resource-group AzureFunctionsContainers-rg --workload-profile-name  <PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

Impostazioni applicazione

Funzioni di Azure consente di usare le impostazioni dell'applicazione per le app per le funzioni in contenitori nel modo standard. Per altre informazioni, vedere Usare le impostazioni dell'applicazione.

Abilitare la distribuzione continua in Azure

Quando si ospita l'app per le funzioni in contenitori in App contenitore di Azure, esistono due modi per configurare la distribuzione continua da un repository di codice sorgente:

Attualmente non è possibile distribuire continuamente i contenitori in base alle modifiche alle immagini in un registro contenitori. È invece necessario usare queste pipeline di distribuzione continua basate sul codice sorgente.

Abilitare la distribuzione continua in Azure

Importante

La distribuzione basata su webhook non è attualmente supportata quando si esegue il contenitore in un piano Elastic Premium. Se è necessario usare il metodo di distribuzione continua descritto in questa sezione, distribuire invece il contenitore in un piano di servizio app. Quando si esegue in un piano Elastic Premium, è necessario riavviare manualmente l'app ogni volta che si apportano aggiornamenti al contenitore nel repository.

È anche possibile configurare la distribuzione continua da un repository di codice sorgente usando Azure Pipelines o GitHub Actions.

È possibile abilitare Funzioni di Azure per aggiornare automaticamente la distribuzione di un'immagine ogni volta che quest'ultima viene aggiornata nel registro.

  1. Usare il comando seguente per abilitare la distribuzione continua e ottenere l'URL del webhook:

    az functionapp deployment container config --enable-cd --query CI_CD_URL --output tsv --name <APP_NAME> --resource-group AzureFunctionsContainers-rg
    

    Il comando az functionapp deployment container config abilita la distribuzione continua e restituisce l'URL del webhook della distribuzione. È possibile recuperare questo URL in un secondo momento usando il comando az functionapp deployment container show-cd-url.

    Come in precedenza, sostituire <APP_NAME> con il nome dell'app per le funzioni.

  2. Copiare l'URL del webhook della distribuzione negli Appunti.

  3. Aprire Docker Hub, accedere e selezionare Repository sulla barra di spostamento. Individuare e selezionare l'immagine, selezionare la scheda Webhook, specificare un valore per Nome webhook, incollare l'URL in URL webhook e quindi selezionare Crea.

    Screenshot che mostra come aggiungere il webhook nella finestra dell'hub Docker.

  4. Con il webhook impostato, Funzioni di Azure ridistribuisce l'immagine ogni volta che viene aggiornata in Docker Hub.

Abilitare le connessioni SSH

SSH consente la comunicazione sicura tra un contenitore e un client. Con SSH abilitato è possibile connettersi al contenitore tramite Strumenti avanzati (Kudu) del Servizio app. Per facilitare la connessione al contenitore tramite SSH, Funzioni di Azure fornisce un'immagine di base con SSH già abilitata. È sufficiente modificare Dockerfile, quindi ricompilare e ridistribuire l'immagine. È quindi possibile connettersi al contenitore tramite Strumenti avanzati (Kudu).

  1. Nel Dockerfile aggiungere la stringa -appservice all'immagine di base nell'istruzione FROM, come nell'esempio seguente:

    FROM mcr.microsoft.com/azure-functions/node:4-node18-appservice
    

    Questo esempio usa la versione abilitata per SSH dell'immagine di base Node.js versione 18. Visitare il repository dell'immagine di base di Funzioni di Azure per verificare di usare la versione più recente dell'immagine di base abilitata per SSH.

  2. Ricompilare l'immagine usando il comando docker build, sostituire il <DOCKER_ID> con l'ID account dell'hub Docker, come nell'esempio seguente.

    docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
    
  3. Eseguire il push dell'immagine aggiornata nell'hub Docker, che dovrebbe richiedere molto meno tempo rispetto al primo push. Solo i segmenti aggiornati dell'immagine devono essere caricati ora.

    docker push <DOCKER_ID>/azurefunctionsimage:v1.0.0
    
  4. Funzioni di Azure ridistribuisce automaticamente l'immagine nell'app per le funzioni. Il processo viene completato in meno di un minuto.

  5. In un browser aprire https://<app_name>.scm.azurewebsites.net/ e sostituire <app_name> con il nome univoco. Questo URL è l'endpoint di Strumenti avanzati (Kudu) per il contenitore dell'app per le funzioni.

  6. Accedere all'account Azure e quindi selezionare SSH per stabilire una connessione con il contenitore. La connessione potrebbe richiedere alcuni istanti se Azure sta ancora aggiornando l'immagine del contenitore.

  7. Dopo aver stabilito la connessione con il contenitore, eseguire il comando top per visualizzare i processi attualmente in esecuzione.

    Screenshot che mostra il comando principale Linux in esecuzione in una sessione SSH.

Gli articoli seguenti forniscono altre informazioni sulla distribuzione e la gestione dei contenitori: