Condividi tramite


Esercitazione: Distribuire un'applicazione multi-container in Azure Container Apps

È possibile distribuire un'app multi-contenitore in App Contenitore di Azure usando Visual Studio. In genere, si distribuisce ogni contenitore in un'istanza separata dell'app contenitore, ma si includono tutti i contenitori dell'app nello stesso ambiente dell'app contenitore per consentire loro di comunicare in modo semplice e sicuro tra loro. È possibile configurare ogni app contenitore per accettare le richieste dall'interno dell'ambiente contenitore o consentire il traffico esterno. App Azure Container è altamente flessibile e configurabile, consentendo molti possibili scenari di microservizi e un set completo di strumenti di monitoraggio avanzati. Se si usa Docker Compose per gestire le app contenitore locali, è possibile provare a convertirla in un ambiente dell'app contenitore in Azure.

Il processo prevede alcuni passaggi usando Visual Studio e il portale di Azure. È anche possibile usare l'interfaccia della riga di comando di Azure per eseguire queste azioni, ma non rientra nell'ambito di questa esercitazione. Prima di tutto, utilizziamo l'app che hai costruito usando Creare un'app multi-contenitore e la distribuiamo usando il processo Pubblica. Visual Studio illustra i passaggi per creare la prima app contenitore, un ambiente dell'app contenitore e creare un registro contenitori per archiviare le immagini del contenitore. Si esegue quindi di nuovo il processo Di pubblicazione con l'altra app contenitore. In particolare, è necessario scegliere lo stesso ambiente dell'app contenitore nel processo di pubblicazione. Infine, è necessario configurare la cache Redis per l'uso con il servizio Cache Redis di Azure. Modificare il codice di configurazione della cache e ripubblicare l'API Web. Configurare quindi le autorizzazioni per concedere all'identità gestita assegnata dal sistema dell'app l'accesso alla cache.

Prerequisiti

  • Una sottoscrizione di Azure. Iscriversi per ottenere una versione di valutazione gratuita.
  • Visual Studio con i carichi di lavoro sviluppo e sviluppo Web di Azure e ASP.NET installati.
  • Il progetto MulticontainerSample si trova in https://github.com/MicrosoftDocs/vs-tutorial-samples nella cartella docker. La soluzione di esempio contiene due progetti, il back-end dell'API Web e il front-end Razor ASP.NET, come creato in un'altra esercitazione. È anche possibile creare i due progetti da zero, poiché sono modifiche molto semplici dei modelli predefiniti, seguendo questa esercitazione. È possibile ignorare i passaggi di Docker Compose.

Prerequisiti

  • Una sottoscrizione di Azure. Iscriversi per ottenere una versione di valutazione gratuita.
  • Visual Studio o versione successiva con i carichi di lavoro di sviluppo Azure e sviluppo ASP.NET e Web installati.
  • Il progetto MulticontainerSample si trova in https://github.com/MicrosoftDocs/vs-tutorial-samples nella cartella docker. La soluzione di esempio contiene due progetti, il back-end dell'API Web e il front-end Razor ASP.NET, come creato in un'altra esercitazione. È anche possibile creare i due progetti da zero, poiché sono modifiche molto semplici dei modelli predefiniti, seguendo questa esercitazione. È possibile ignorare i passaggi di Docker Compose.

Distribuire il back-end dell'API Web

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto API Web e scegliere Pubblica.

  2. Scegliere la destinazione Azure e quindi selezionare Azure Container Apps.

  3. Se non è già stato eseguito l'accesso con un account associato a una sottoscrizione di Azure, è possibile accedere ora o modificare il tenant, se necessario.

  4. Nella schermata in cui si specifica un'app contenitore selezionare Crea nuovo per creare una nuova app contenitore.

    Screenshot che mostra la schermata del processo di pubblicazione in cui si specifica un'app contenitore esistente o si sceglie di crearne una nuova per il servizio API Web.

  5. Nella pagina Crea app Azure Container immettere i dettagli, ad esempio il gruppo di risorse. Per questo passaggio si crea un nuovo gruppo di risorse, un nuovo ambiente contenitore e un nuovo registro contenitori.

    Screenshot che mostra la schermata del processo di pubblicazione in cui si crea una nuova app contenitore.

    La creazione delle risorse potrebbe richiedere un po' di tempo. Al termine, fare clic su Avanti per passare al passaggio successivo.

  6. Nel passaggio successivo si crea un registro contenitori. Se si crea un nuovo registro contenitori, vengono richiesti alcuni dettagli. È possibile scegliere la stessa area e lo stesso gruppo di risorse dell'app contenitore.

  7. Il passaggio successivo chiede di scegliere il tipo di build del container. Scegli .NET SDK se non hai un Dockerfile, oppure Docker Desktop se ce l'hai.

    Screenshot che mostra la scelta del tipo di compilazione del contenitore con Docker Desktop selezionato.

  8. Per il tipo di distribuzione, scegliere Pubblica (genera file pubxml) per creare un profilo di pubblicazione.

    Screenshot che mostra la scelta del tipo di distribuzione, con l'opzione per pubblicare in un file pubxml selezionato.

  9. Selezionare Fine per completare il processo di pubblicazione e creare un profilo di pubblicazione. Se viene visualizzata una richiesta di configurazione aggiuntiva per accedere al contenitore pubblicato, scegliere .

    Richiesta di chiedere se concedere l'accesso dell'utente amministratore.

    Viene visualizzata una pagina che mostra l'attività in Azure e, quando la si chiude, la schermata Pubblica include ora le informazioni dell'app contenitore, ad esempio l'URL per l'ingresso all'API Web.

    Screenshot che mostra la schermata Pubblica dopo aver completato il processo di pubblicazione.

    Fare clic sul pulsante Pubblica per pubblicare nell'app contenitore di Azure. Visual Studio richiede la creazione delle risorse di Azure e avvia il processo di pubblicazione per l'app contenitore WebAPI.

    Visual Studio potrebbe provare a caricare la pagina per la nuova app contenitore, ma non dovrebbe funzionare in questa fase.

Dopo aver pubblicato una volta, è stato creato un profilo di pubblicazione (.pubxml file), quindi non è necessario ripetere questi passaggi alla successiva pubblicazione. Fare clic sul pulsante Pubblica in questa schermata, a meno che non si voglia ricominciare o modificare una delle risorse di Azure specificate.

Successivamente si userà il portale di Azure per apportare altre modifiche di configurazione per il traffico in ingresso e per supportare Cache Redis di Azure, ma prima di tutto, nella sezione successiva si pubblica il front-end Web.

Distribuire il front-end

  1. Modificare il file di codice front-end in Index.cshtml.cs per fare riferimento al nuovo URL per l'app contenitore api Web. Questo è il nome visualizzato sotto Nome risorsa nella schermata di pubblicazione API Web. Per la comunicazione da contenitore a contenitore, è possibile usare direttamente HTTP con il nome dell'app contenitore, senza specificare un nome di dominio completo (FQDN) e un numero di porta. Nel metodo OnGet, sostituisci la riga esistente che imposta RequestUri per fare riferimento al nome dell'app contenitore dell'API Web, come nel codice seguente.

     request.RequestUri = new Uri("http://<mywebapi-container-app-name>/Counter");
    
    
  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nodo del progetto Webfrontend e scegliere Pubblica. Nella schermata successiva selezionare Crea nuovo per creare una nuova app contenitore.

  3. Nella schermata Crea nuova app contenitore di Azure scegliere lo stesso gruppo di risorse e lo stesso ambiente contenitore creato al momento della pubblicazione del progetto API Web.

    Screenshot che mostra la schermata del processo di pubblicazione in cui si specifica un contenitore esistente o crearne uno nuovo per Webfrontend.

  4. Importante. Selezionare lo stesso registro contenitori creato in precedenza.

    Screenshot che mostra la schermata del processo di pubblicazione in cui si crea l'app contenitore Webfrontend, assicurandosi di selezionare lo stesso registro contenitori creato in precedenza.

  5. Scegliere le stesse opzioni dell'API Web per gli altri passaggi. Il tipo di compilazione del contenitore è Docker Desktop e il tipo di distribuzione è Publish (genera il file pubxml).

  6. Selezionare Fine per completare il processo di pubblicazione e creare un profilo di pubblicazione. Viene visualizzata una pagina che mostra l'attività in Azure e, quando la si chiude, la schermata Pubblica include ora le informazioni dell'app contenitore, ad esempio l'URL per l'ingresso all'app Webfrontend.

Visualizzare e configurare le app contenitore nel portale di Azure

  1. Accedere al portale di Azure.
  2. Cerca le app contenitore e individua quelle che hai appena creato.
  3. Scegliere Ingresso e configurare le opzioni seguenti:
    1. Nella schermata Ingresso, impostare Traffico in ingresso su Limitato all'ambiente delle applicazioni contenitore. Ciò significa che solo Webfrontend può inviare richieste. Anche Visual Studio non sarà in grado di accedere a questo servizio, ad esempio quando si completa il processo di pubblicazione e Visual Studio tenta di caricare la pagina, viene visualizzato un errore nel browser anziché accedere al servizio. Questo è previsto.

    2. Controllare la porta di ingresso (deve essere 8080). Si usa HTTP per la chiamata API Web ed è possibile fare riferimento direttamente all'app contenitore in base al nome nell'URI della richiesta. Il nome di dominio completo (FQDN) generato dalle app di Azure Container usa un URL HTTPS (come visualizzato in Visual Studio nella schermata Pubblica ), ma il traffico interno può ignorare tale nome.

    3. Per l'Ingress del Webfrontend, è possibile accettare le impostazioni predefinite. La porta di destinazione è 8080, perché Ingress gestisce tutte le richieste in modo sicuro utilizzando il FQDN e HTTPS (o tramite il reindirizzamento da HTTP a HTTPS) e le inoltra a un web frontend utilizzando HTTP sulla porta contenitore 8080.

Creare cache Redis di Azure

Seguire questa procedura per creare una Cache Redis di Azure nello stesso gruppo di risorse delle app contenitore.

  1. Nel portale di Azure aprire l'app contenitore api Web creata in precedenza. Aprire la schermata Service Connector e selezionare Crea. Verrà visualizzata la sezione Crea connessione .

  2. Nella schermata Crea connessione immettere Il tipo di servizio come Cache Redis e scegliere Crea nuovo per creare una nuova cache Redis.

    Screenshot che mostra la schermata Service Connector nell'app contenitore API Web.

  3. Scegliere una cache oppure seguire il collegamento Crea nuovo per creare una cache. Se si crea una nuova cache, potrebbe essere necessario tornare all'app contenitore e a Service Connector e ripetere i passaggi precedenti per creare la connessione.

  4. Per il database scegliere "0" per creare il primo database numerato per questa cache.

  5. Passare alla scheda Autenticazione . Scegliere Identità gestita assegnata dal sistema. Accettare tutte le altre impostazioni predefinite e selezionare Crea. Verrà creata la connessione alla cache.

  6. Tornare nella sezione Service Connector dell'app contenitore Web API, aggiornare per vedere la cache appena connessa (se non la vedi già) e selezionare il checkbox accanto alla cache. Selezionare Convalida per controllare lo stato della connessione. È possibile espandere il nodo della cache per visualizzare i valori per le variabili di ambiente per tale cache di Azure. Ai fini di questa esercitazione, è necessario solo AZURE_REDIS_HOST, ma è possibile usare gli altri nel codice reale o per una configurazione più completa. Usare i valori qui per impostare le variabili di ambiente nel Dockerfile, come descritto nella sezione successiva, in modo che l'API Web possa connettersi alla cache.

Per altre informazioni, vedere Avvio rapido: Creare una connessione al servizio per le app di Azure Container dal portale di Azure.

Configurare i ruoli per l'identità gestita

Nel portale di Azure si usa Il controllo di accesso (IAM) nella Cache Redis di Azure per concedere l'accesso collaboratore all'identità gestita assegnata dal sistema dell'app contenitore.

  1. Nel portale di Azure aprire la pagina per Cache Redis di Azure e selezionare Controllo di accesso (IAM).
  2. Seleziona Aggiungi>Aggiungi assegnazione ruolo. Verrà visualizzata la pagina Aggiungi assegnazione di ruolo.
  3. Selezionare la scheda Membri e scegliere Identità gestita.
  4. Seleziona membri. Verrà visualizzata la pagina Seleziona membri e si seleziona Identità gestita assegnata dal sistema.
  5. Selezionare App contenitore e scegliere l'applicazione contenitore API Web.
  6. Nella scheda Ruolo scegliere Collaboratore cache Redis.
  7. Selezionare Rivedi e assegna. Il sistema elabora la richiesta.
  8. Aprire Assegnazioni di ruolo per visualizzare l'identità gestita assegnata dal sistema nel ruolo Collaboratore cache Redis .

Il passaggio successivo consiste nel modificare la configurazione della cache nel client API Web per usare DefaultAzureCredential, che è il modo consigliato per l'autenticazione quando si usa l'identità gestita assegnata dal sistema. Chiunque acceda all'applicazione esternamente non deve avere assegnazioni di ruolo specifiche a livello di utente per accedere alle risorse tramite questa forma di gestione delle identità. Per altre informazioni, vedere Integrare Cache Redis di Azure - Identità gestita assegnata dal sistema.

Modificare il progetto API Web per fare riferimento al servizio Cache Redis di Azure

Prima di pubblicare il progetto API Web da eseguire in Azure, aggiornarlo per fare riferimento a Cache Redis di Azure e usare un'identità gestita per accedervi in modo sicuro. A tale scopo, è possibile modificare il codice di configurazione della cache in Program.cs.

Per Cache Redis di Azure, impostare una variabile AZURE_REDIS_HOST di ambiente con le informazioni di connessione e quindi leggerla nel codice di avvio per connettersi a Cache Redis di Azure e configurare la cache.

Si usa Azure.Identity per ottenere DefaultAzureCredential che gestisce l'autenticazione sicura con l'identità gestita.

  1. Nel progetto API Web di Visual Studio aggiungere un riferimento ai pacchetti Azure Identity NuGet e Microsoft.Azure.StackExchange.Redis.

  2. Aggiungere direttive "using" per i pacchetti appena aggiunti.

    using Azure.Identity;
    using Microsoft.Azure.StackExchange.Redis;
    
  3. Aggiornare il codice di configurazione per cache Redis. Eliminare il codice precedente e sostituirlo con il codice seguente. È possibile esaminare i commenti in un secondo momento e rimuovere il commento da qualsiasi codice facoltativo per adattarlo ai tuoi scenari più avanzati.

     // Check the environment variable for the Redis cache host name
     var cacheHostName = Environment.GetEnvironmentVariable("AZURE_REDIS_HOST");
     if (string.IsNullOrEmpty(cacheHostName))
     {
         throw new InvalidOperationException("The environment variable 'AZURE_REDIS_HOST' is not set.");
     }
    
     var configurationOptions = ConfigurationOptions.Parse($"{cacheHostName}:6380");
    
     // For system-assigned identity.
     // In the Azure portal, we need to set up Redis service to grant Contributor access to the system-assigned identity
     // for the container app that hosts this Web API service.
     await configurationOptions.ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential());
    
     var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions);
    
     builder.Services.AddStackExchangeRedisCache(options =>
     {
         options.ConfigurationOptions = configurationOptions;
         options.InstanceName = "SampleInstance";
     });
    
     // Uncomment the following line if you need to use the ConnectionMultiplexer directly
     // (for example, for advanced Redis operations like Pub/Sub or working with Redis data structures).
     // builder.Services.AddSingleton<IConnectionMultiplexer>(sp =>
     //     ConnectionMultiplexer.Connect(configurationOptions));
    
    

    Il metodo di autenticazione impostato in precedenza quando è stata creata la connessione alla cache è un'identità gestita assegnata dal sistema, quindi il codice qui è coerente con tale scelta. Se si vuole usare anche altri metodi di autenticazione, è necessario apportare modifiche al codice qui. Vedere Integrare Cache Redis di Azure - Identità gestita assegnata dal sistema.

    Compilare il progetto API Web per verificare che non siano presenti errori.

  4. Se si dispone di un Dockerfile, aggiornare la fase di base del Dockerfile per definire la variabile AZURE_REDIS_HOSTdi ambiente . L'host viene ottenuto dal portale di Azure, quando si crea cache Redis di Azure o dalla sezione Connettore di servizi della pagina dell'app contenitore api Web nel portale (vedere la sezione precedente).

    ENV AZURE_REDIS_HOST mycache.redis.cache.windows.net
    

    (Facoltativo) È possibile definire altre opzioni di configurazione nelle variabili di ambiente, ad esempio, AZURE_REDIS_PORT che in genere è 6380. Per semplicità, questo valore è hardcoded anziché usare una variabile di ambiente. Potresti anche voler impostare ASPNETCORE_ENVIRONMENT su Sviluppo.

    Se si usa il tipo di compilazione del contenitore .NET SDK (senza un Dockerfile), è possibile impostare la variabile di ambiente in launchSettings.json in profiles > http.

     "http": {
       "commandName": "Project",
       "dotnetRunMessages": true,
       "launchBrowser": true,
       "launchUrl": "swagger",
       "applicationUrl": "http://localhost:5107",
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development",
         "AZURE_REDIS_HOST": "cache11.redis.cache.windows.net"
       }
     }
    
  5. Sei pronto per pubblicare e verificare queste modifiche. Selezionare il pulsante Pubblica nella schermata Pubblica . Visual Studio tenterà di caricare la pagina, ma questo fallisce perché l'app contenitore API Web non è accessibile alle richieste provenienti dall'esterno dell'ambiente dell'app contenitore.

Prima di poter eseguire l'applicazione con Cache Redis di Azure, è necessario configurare l'identità gestita con le autorizzazioni appropriate per accedere alla cache.

Testare l'applicazione

Tornare alla schermata Pubblica nel progetto Webfrontend e fare clic sul collegamento nell'URL di Webfrontend. Dovresti vedere l'app Webfrontend apparire con il contatore che si aggiorna quando ricarichi la pagina.

Suggerimento

Azure Container Apps mira a massimizzare il tempo di attività dei tuoi servizi. In caso di problemi con uno dei servizi, in modo che non superi una sonda di controllo integrità, le Azure Container Apps non la imposta come revisione attiva e non la usano per gestire le richieste. Di conseguenza, durante il processo di sviluppo e test, si potrebbe occasionalmente scoprire che le modifiche più recenti apportate non vengono riflesse nel sito live. Nel portale di Azure selezionare Revisioni e repliche per visualizzare lo stato della revisione pubblicata più recente. Da qui è possibile aprire i log per risolvere il problema.

Congratulazioni! Avete pubblicato con successo un'app multicontenitore su Azure Container Apps e verificato la comunicazione tra i contenitori e l'uso di Azure Redis Cache all'interno dell'app.

Pulire le risorse

Per pulire le risorse create durante questa esercitazione, passare al portale di Azure ed eliminare il gruppo di risorse che contiene le app contenitore, la cache e il registro contenitori.

Passaggi successivi

  • Altre informazioni sulle app di Azure Container.
  • Informazioni su .NET Aspire, una tecnologia che consente di sviluppare più facilmente app e servizi in contenitori complessi che si integrano con risorse diverse in Azure. .NET Aspire supporta l'orchestrazione dell'ora di sviluppo, l'integrazione standardizzata con una serie di servizi, nonché il supporto degli strumenti con i modelli di progetto di Visual Studio.
  • È anche possibile usare l'interfaccia della riga di comando di Azure con le app contenitore. Installare Azure CLI e iniziare a lavorare con Azure Container Apps utilizzando i comandi di Azure CLI seguendo il comando Deploy Azure Container Apps con il comando az containerapp up.