Creare una funzione in Linux tramite un'immagine personalizzataCreate a function on Linux using a custom image

Funzioni di Azure consente di ospitare le funzioni in Linux in un contenitore personalizzato.Azure Functions lets you host your functions on Linux in your own custom container. È anche possibile ospitare in un contenitore di Servizio app di Azure predefinito.You can also host on a default Azure App Service container. Questa funzionalità richiede il runtime di Funzioni 2.x.This functionality requires the Functions 2.x runtime.

In questa esercitazione si vedrà come distribuire funzioni in Azure come un'immagine personalizzata di Docker.In this tutorial, you learn how to deploy your functions to Azure as a custom Docker image. Questo modello è utile quando è necessario personalizzare l'immagine del contenitore predefinita.This pattern is useful when you need to customize the built-in container image. È possibile che l'utente desideri usare un'immagine personalizzata quando le funzioni hanno bisogno di una versione di linguaggio specifica o richiedono una configurazione o una dipendenza specifica non indicata all'interno dell'immagine predefinita.You may want to use a custom image when your functions need a specific language version or require a specific dependency or configuration that isn't provided within the built-in image. Le immagini di base supportate per Funzioni di Azure sono disponibili nel repository di immagini di base per Funzioni di Azure.Supported base images for Azure Functions are found in the Azure Functions base images repo.

Questa esercitazione illustra come usare Azure Functions Core Tools per creare una funzione in un'immagine Linux personalizzata.This tutorial walks you through how to use Azure Functions Core Tools to create a function in a custom Linux image. L'immagine viene pubblicata in Azure, in un'app per le funzioni creata tramite l'interfaccia della riga di comando di Azure.You publish this image to a function app in Azure, which was created using the Azure CLI. Successivamente, si aggiorna la funzione per connettersi all'archiviazione code di Azure.Later, you update your function to connect to Azure Queue storage. Si abilita inoltre la distribuzione continua.You also enable.

In questa esercitazione si apprenderà come:In this tutorial, you learn how to:

  • Creare un'app per le funzioni e un Dockerfile usando Core Tools.Create a function app and Dockerfile using Core Tools.
  • Creare un'immagine personalizzata tramite Docker.Build a custom image using Docker.
  • Pubblicare un'immagine personalizzata in un registro contenitori.Publish a custom image to a container registry.
  • Creare un account di archiviazione di Azure.Create an Azure Storage account.
  • Creare un piano di hosting Premium.Create a Premium hosting plan.
  • Distribuire un'app per le funzioni dall'hub Docker.Deploy a function app from Docker Hub.
  • Aggiungere le impostazioni applicazione all'app per le funzioni.Add application settings to the function app.
  • Abilitare la distribuzione continua.Enable continuous deployment.
  • Abilitare le connessioni SSH al contenitore.Enable SSH connections to the container.
  • Aggiungere un'associazione di output dell'archiviazione code.Add a Queue storage output binding.
  • Aggiungere il monitoraggio di Application Insights.Add Application Insights monitoring.

I passaggi seguenti sono supportati in computer Mac, Windows o Linux.The following steps are supported on a Mac, Windows, or Linux computer.

PrerequisitiPrerequisites

Prima di eseguire questo esempio, è necessario disporre di quanto segue:Before running this sample, you must have the following:

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.If you don't have an Azure subscription, create a free account before you begin.

Nota

I comandi dell'interfaccia della riga di comando di Azure descritti in questo articolo funzionano in Bash e sono stati verificati per l'esecuzione in Azure Cloud Shell.Azure CLI commands in this article work in Bash and are verified to run in Azure Cloud Shell. Per l'esecuzione da un prompt dei comandi locale di Windows, è necessario modificarli.You must modify them to run in a local Windows command prompt.

Creare il progetto localeCreate the local project

Eseguire il comando seguente dalla riga di comando per creare un progetto di app della funzione nella cartella MyFunctionProj della directory locale corrente.Run the following command from the command line to create a function app project in the MyFunctionProj folder of the current local directory. Per un progetto Python, è necessario usare un ambiente virtuale.For a Python project, you must be running in a virtual environment.

func init MyFunctionProj --docker

Quando si include l'opzione --docker, viene generato un Dockerfile per il progetto.When you include the --docker option, a dockerfile is generated for the project. Questo file viene usato per creare un contenitore personalizzato in cui eseguire il progetto.This file is used to create a custom container in which to run the project. L'immagine di base usata dipende dal linguaggio del runtime del ruolo di lavoro scelto.The base image used depends on the worker runtime language chosen.

Quando richiesto, scegliere un runtime del ruolo di lavoro tra i linguaggi seguenti:When prompted, choose a worker runtime from the following languages:

  • dotnet: crea un progetto libreria di classi .NET (.csproj).dotnet: creates a .NET Core class library project (.csproj).
  • node: crea un progetto JavaScript.node: creates a JavaScript project.
  • python: crea un progetto Python.python: creates a Python project.

Usare il comando seguente per passare alla nuova cartella del progetto MyFunctionProj.Use the following command to navigate to the new MyFunctionProj project folder.

cd MyFunctionProj

Creare una funzioneCreate a function

Il comando seguente crea una funzione attivata tramite HTTP e denominata MyHttpTrigger.The following command creates an HTTP-triggered function named MyHttpTrigger.

func new --name MyHttpTrigger --template "HttpTrigger"

Quando viene eseguito il comando, viene visualizzato qualcosa di simile a quanto segue:When the command executes, you see something like the following output:

The function "MyHttpTrigger" was created successfully from the "HttpTrigger" template.

Eseguire la funzione in localeRun the function locally

Il comando seguente avvia l'app della funzione.The following command starts the function app. L'app viene eseguita tramite lo stesso runtime di funzioni di Azure presente in Azure.The app runs using the same Azure Functions runtime that is in Azure. Il comando di avvio varia a seconda del linguaggio del progetto.The start command varies, depending on your project language.

C#C#

func start --build

JavaScriptJavaScript

func start

TypeScriptTypeScript

npm install
npm start     

All'avvio, l'host di Funzioni visualizza un output simile al seguente, che è stato troncato per migliorarne la leggibilità:When the Functions host starts, it writes something like the following output, which has been truncated for readability:


                  %%%%%%
                 %%%%%%
            @   %%%%%%    @
          @@   %%%%%%      @@
       @@@    %%%%%%%%%%%    @@@
     @@      %%%%%%%%%%        @@
       @@         %%%%       @@
         @@      %%%       @@
           @@    %%      @@
                %%
                %

...

Content root path: C:\functions\MyFunctionProj
Now listening on: http://0.0.0.0:7071
Application started. Press Ctrl+C to shut down.

...

Http Functions:

        HttpTrigger: http://localhost:7071/api/MyHttpTrigger

[8/27/2018 10:38:27 PM] Host started (29486ms)
[8/27/2018 10:38:27 PM] Job host started

Copiare l'URL della funzione HttpTrigger dall'output del runtime e incollarlo nella barra degli indirizzi del browser.Copy the URL of your HttpTrigger function from the runtime output and paste it into your browser's address bar. Aggiungere la stringa di query ?name=<yourname> all'URL ed eseguire la richiesta.Append the query string ?name=<yourname> to this URL and execute the request. Di seguito è illustrata la risposta nel browser alla richiesta GET restituita dalla funzione locale:The following shows the response in the browser to the GET request returned by the local function:

Testare in locale nel browser

Ora che è stata eseguita la funzione in locale, è possibile creare l'app della funzione e altre risorse necessarie in Azure.Now that you have run your function locally, you can create the function app and other required resources in Azure.

Creare dal file DockerBuild from the Docker file

Esaminiamo il Dockerfile nella cartella radice del progetto.Take a look at the Dockerfile in the root folder of the project. Il file descrive l'ambiente necessario per eseguire l'app per le funzioni su Linux.This file describes the environment that is required to run the function app on Linux. L'esempio seguente mostra un Dockerfile che crea un contenitore che esegue un'app per le funzioni nel runtime del ruolo di lavoro JavaScript (Node.js):The following example is a Dockerfile that creates a container that runs a function app on the JavaScript (Node.js) worker runtime:

FROM mcr.microsoft.com/azure-functions/node:2.0

ENV AzureWebJobsScriptRoot=/home/site/wwwroot
COPY . /home/site/wwwroot

Nota

L'elenco completo di immagini di base supportate per Funzioni di Azure è disponibile nella pagina delle immagini di base per Funzioni di Azure.The complete list of supported base images for Azure Functions can be found in the Azure Functions base image page.

Eseguire il comando buildRun the build command

Nella cartella radice eseguire il comando docker build e specificare il nome mydockerimage e il tag v1.0.0.In the root folder, run the docker build command, and provide a name, mydockerimage, and tag, v1.0.0. Sostituire <docker-id> con l'ID dell'account Docker Hub.Replace <docker-id> with your Docker Hub account ID. Questo comando compila l'immagine Docker per il contenitore.This command builds the Docker image for the container.

docker build --tag <docker-id>/mydockerimage:v1.0.0 .

Al termine del comando, è possibile eseguire il nuovo contenitore in locale.When the command completes, you can run the new container locally.

Creare l'immagine in localeRun the image locally

Verificare che l'immagine creata funzioni eseguendo l'immagine Docker in un contenitore locale.Verify that the image you built works by running the Docker image in a local container. Eseguire il comando docker run e passargli il nome e il tag dell'immagine.Issue the docker run command and pass the name and tag of the image to it. Accertarsi di specificare la porta usando l'argomento -p.Be sure to specify the port using the -p argument.

docker run -p 8080:80 -it <docker-ID>/mydockerimage:v1.0.0

Quando l'immagine personalizzata è in esecuzione in un contenitore Docker locale, verificare che l'app per le funzioni e il contenitore funzionino correttamente passando a http://localhost:8080.With the custom image running in a local Docker container, verify the function app and container are functioning correctly by browsing to http://localhost:8080.

Eseguire l'app per le funzioni in locale.

Nota

A questo punto, quando si tenta di chiamare la funzione HTTP specifica, si ottiene un errore HTTP 401 come risposta.At this point, when you try to call your specific HTTP function, you get an HTTP 401 error response. Questo accade perché la funzione viene eseguita nel contenitore locale come avverrebbe in Azure, il che significa che è necessario il tasto funzione.This is because your function runs in the local container as it would in Azure, which means that the function key is required. Poiché il contenitore non è stato ancora pubblicato in un'app per le funzioni, non è disponibile alcun tasto funzione.Because the container hasn't yet been published to a function app, there is no function key available. In un secondo momento, quando si ricorrerà a Core Tools per pubblicare il contenitore, i tasti funzione verranno visualizzati.You'll see later that when you use Core Tools to publish your container, the function keys are shown to you. Se si vuole testare la funzione in esecuzione nel contenitore locale, è possibile impostare la chiave di autorizzazione su anonymous.If you want to test your function running in the local container, you can change the authorization key to anonymous.

Dopo aver verificato l'app per le funzioni nel contenitore, arrestare l'esecuzione.After you have verified the function app in the container, stop the execution. A questo punto, è possibile propagare l'immagine personalizzata nel proprio account dell'hub Docker.Now, you can push the custom image to your Docker Hub account.

Eseguire il push in Docker HubPush to Docker Hub

Un registro è un'applicazione che ospita le immagini e fornisce l'immagine dei servizi e i servizi contenitore.A registry is an application that hosts images and provides services image and container services. Per condividere l'immagine, è necessario eseguirne il push in un registro.To share your image, you must push it to a registry. Docker Hub è un registro per le immagini Docker che consente di ospitare i propri repository, pubblici o privati.Docker Hub is a registry for Docker images that allows you to host your own repositories, either public or private.

Prima di eseguire il push di un'immagine, è necessario accedere ad hub Docker usando il comando docker login.Before you can push an image, you must sign in to Docker Hub using the docker login command. Sostituire <docker-id> con il nome dell'account e digitare la password nella console quando richiesto.Replace <docker-id> with your account name and type in your password into the console at the prompt. Per altre opzioni relative alla password di hub Docker, vedere la documentazione relativa al comando docker login.For other Docker Hub password options, see the docker login command documentation.

docker login --username <docker-id>

Un messaggio di accesso riuscito conferma che l'accesso è stato eseguito.A "login succeeded" message confirms that you're logged in. Dopo avere effettuato l'accesso, eseguire il push dell'immagine nell'hub Docker usando il comando docker push.After you have signed in, you push the image to Docker Hub by using the docker push command.

docker push <docker-id>/mydockerimage:v1.0.0

Al termine del push è possibile usare questa immagine come origine di distribuzione per una nuova app per le funzioni in Azure.After the push succeeds, you can use the image as the deployment source for a new function app in Azure.

Creare un gruppo di risorseCreate a resource group

Creare un gruppo di risorse con il comando az group create.Create a resource group with the az group create command. Un gruppo di risorse di Azure è un contenitore logico in cui vengono distribuite e gestite risorse di Azure come app per le funzioni, database e account di archiviazione.An Azure resource group is a logical container into which Azure resources like function apps, databases, and storage accounts are deployed and managed.

Nell'esempio seguente viene creato il gruppo di risorse denominato myResourceGroup.The following example creates a resource group named myResourceGroup.
Se non si usa Cloud Shell, eseguire prima l'accesso usando az login.If you aren't using Cloud Shell, sign in first using az login.

az group create --name myResourceGroup --location westeurope

In genere, il gruppo di risorse e le risorse vengono creati in un'area vicina alla località dell'utente.You generally create your resource group and the resources in a region near you.

Creare un account di Archiviazione di AzureCreate an Azure Storage account

Funzioni usa un account di uso generico di Archiviazione di Azure per gestire lo stato e altre informazioni sulle funzioni.Functions uses a general-purpose account in Azure Storage to maintain state and other information about your functions. Creare un account di archiviazione di uso generico nel gruppo di risorse creato usando il comando az storage account create.Create a general-purpose storage account in the resource group you created by using the az storage account create command.

Nel comando seguente sostituire il segnaposto <storage_name> con il nome globalmente univoco dell'account di archiviazione.In the following command, substitute a globally unique storage account name where you see the <storage_name> placeholder. I nomi degli account di archiviazione devono avere una lunghezza compresa tra 3 e 24 caratteri e possono contenere solo numeri e lettere minuscole.Storage account names must be between 3 and 24 characters in length and may contain numbers and lowercase letters only.

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

Creare un piano PremiumCreate a Premium plan

L'hosting Linux per i contenitori di funzioni personalizzate è supportato nei piani dedicati (Servizio app) e nei piani Premium.Linux hosting for custom Functions containers supported on Dedicated (App Service) plans and Premium plans. In questa esercitazione si usa un piano Premium, che può essere ridimensionato in base alle esigenze.This tutorial uses a Premium plan, which can scale as needed. Per altre informazioni sull'hosting, vedere Confronto di piani di hosting per Funzioni di Azure.To learn more about hosting, see Azure Functions hosting plans comparison.

L'esempio seguente crea un piano Premium denominato myPremiumPlan nel piano tariffario Elastico Premium 1 (--sku EP1), nell'area Stati Uniti occidentali (-location WestUS) e in un contenitore Linux (--is-linux).The following example creates a Premium plan named myPremiumPlan in the Elastic Premium 1 pricing tier (--sku EP1), in the West US region (-location WestUS), and in a Linux container (--is-linux).

az functionapp plan create --resource-group myResourceGroup --name myPremiumPlan \
--location WestUS --number-of-workers 1 --sku EP1 --is-linux

Creare un'app dall'immagineCreate an app from the image

Un'app per le funzioni gestisce l'esecuzione delle funzioni nel piano di hosting.The function app manages the execution of your functions in your hosting plan. Creare un'app per le funzioni da un'immagine dell'hub Docker usando il comando az functionapp create.Create a function app from a Docker Hub image by using the az functionapp create command.

Nel comando seguente sostituire il segnaposto <app_name> con il nome univoco dell'app per le funzioni e il nome dell'account di archiviazione con <storage_name>.In the following command, substitute a unique function app name where you see the <app_name> placeholder and the storage account name for <storage_name>. Dato che verrà usato come dominio DNS predefinito per l'app per le funzioni, è necessario che <app_name> sia univoco tra tutte le app in Azure.The <app_name> is used as the default DNS domain for the function app, and so the name needs to be unique across all apps in Azure. Come in precedenza, <docker-id> è il nome dell'account Docker.As before, <docker-id> is your Docker account name.

az functionapp create --name <app_name> --storage-account  <storage_name>  --resource-group myResourceGroup \
--plan myPremiumPlan --deployment-container-image-name <docker-id>/mydockerimage:v1.0.0

Il parametro deployment-container-image-name indica l'immagine ospitata nell'hub Docker da usare per creare l'app per le funzioni.The deployment-container-image-name parameter indicates the image hosted on Docker Hub to use to create the function app. Usare il comando az functionapp config container show per visualizzare informazioni sull'immagine usata per la distribuzione.Use the az functionapp config container show command to view information about the image used for deployment. Usare il comando az functionapp config container set per distribuire da un'immagine diversa.Use the az functionapp config container set command to deploy from a different image.

Configurare l'app per le funzioniConfigure the function app

La funzione richiede la stringa di connessione per connettersi all'account di archiviazione predefinito.The function needs the connection string to connect to the default storage account. Quando si pubblica l'immagine personalizzata in un account di un contenitore privato, è invece necessario definire le impostazioni dell'applicazione come variabili di ambiente in Dockerfile, ad esempio usando l'istruzione ENV.When you're publishing your custom image to a private container account, you should instead set these application settings as environment variables in the Dockerfile using the ENV instruction, or something similar.

In questo caso <storage_name> è il nome dell'account di archiviazione creato.In this case, <storage_name> is the name of the storage account you created. Ottenere la stringa di connessione con il comando az storage account show-connection-string.Get the connection string with the az storage account show-connection-string command. Aggiungere le impostazioni dell'applicazione nell'app per le funzioni con il comando az functionapp config appsettings set.Add these application settings in the function app with the az functionapp config appsettings set command.

storageConnectionString=$(az storage account show-connection-string \
--resource-group myResourceGroup --name <storage_name> \
--query connectionString --output tsv)

az functionapp config appsettings set --name <app_name> \
--resource-group myResourceGroup \
--settings AzureWebJobsDashboard=$storageConnectionString \
AzureWebJobsStorage=$storageConnectionString

Nota

Se il contenitore è privato, è necessario impostare anche le seguenti impostazioni dell'applicazioneIf your container is private, you would have to set the following application settings as well

  • DOCKER_REGISTRY_SERVER_USERNAMEDOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_PASSWORDDOCKER_REGISTRY_SERVER_PASSWORD

È necessario arrestare e avviare l'app per le funzioni affinché vengano rilevati questi valoriYou will have to stop and then start your function app for these values to be picked up

Verificare le funzioniVerify your functions

La funzione attivata da HTTP creata richiede una chiave di funzione per chiamare l'endpoint.The HTTP-triggered function you created requires a function key when calling the endpoint. A questo punto, il modo più semplice per ottenere l'URL della funzione, inclusa la chiave, è dal portale di Azure.At this time, the easiest way to get your function URL, including the key, is from the Azure portal.

Suggerimento

È anche possibile ottenere le chiavi di funzione usando le API di gestione delle chiavi, che richiedono la presentazione di un token di connessione per l'autenticazione.You can also obtain your function keys by using the Key management APIs, which requires you to present a bearer token for authentication.

Individuare la nuova app per le funzioni nel portale di Azure digitando il nome dell'app per le funzioni nella casella Cerca nella parte superiore della pagina e selezionando la risorsa Servizio app.Locate your new function app in the Azure portal by typing your function app name in the Search box at the top of the page and selecting the App Service resource.

Selezionare la funzione MyHttpTrigger, selezionare </> Recupera URL della funzione > predefinito (chiave di funzione) > Copia.Select the MyHttpTrigger function, select </> Get function URL > default (Function key) > Copy.

Creare l'URL della funzione dal portale di Azure

In questo URL la chiave di funzione è il parametro di query code.In this URL, the function key is the code query parameter.

Nota

Poiché l'app per le funzioni viene distribuita come contenitore, non è possibile apportare modifiche al codice della funzione nel portale.Because your function app is deployed as a container, you can't make changes to your function code in the portal. È invece necessario aggiornare il progetto nel contenitore locale e ripubblicarlo in Azure.You must instead update the project in local container and republish it to Azure.

Incollare l'URL della funzione nella barra degli indirizzi del browser.Paste the function URL into your browser's address bar. Aggiungere il valore della stringa di query &name=<yourname> alla fine dell'URL e premere il tasto Enter per eseguire la richiesta.Add the query string value &name=<yourname> to the end of this URL and press the Enter key on your keyboard to execute the request. Nel browser dovrebbe venire visualizzata la risposta restituita dalla funzione.You should see the response returned by the function displayed in the browser.

L'esempio seguente mostra la risposta nel browser:The following example shows the response in the browser:

Risposta della funzione nel browser.

L'URL della richiesta include una chiave necessaria per impostazione predefinita per accedere a una funzione tramite HTTP.The request URL includes a key that is required, by default, to access your function over HTTP.

adsaEnable continuous deployment

Uno dei vantaggi dell'utilizzo dei contenitori è il supporto per la distribuzione continua.One of the benefits of using containers is support for continuous deployment. Funzioni di Azure consente di distribuire automaticamente gli aggiornamenti quando il contenitore viene aggiornato nel registro.Functions lets you automatically deploy updates when your container is updated in the registry. Abilitare la distribuzione continua con il comando az functionapp deployment container config.Enable continuous deployment with the az functionapp deployment container config command.

az functionapp deployment container config --enable-cd \
--query CI_CD_URL --output tsv \
--name <app_name> --resource-group myResourceGroup

Questo comando restituisce l'URL del webhook di distribuzione dopo l'abilitazione della distribuzione continua.This command returns the deployment webhook URL after continuous deployment is enabled. È anche possibile usare il comando az functionapp deployment container show-cd-url per ottenere questo URL.You can also use the az functionapp deployment container show-cd-url command to return this URL.

Copiare l'URL di distribuzione e passare al repository DockerHub, scegliere la scheda Webhook, digitare il Nome webhook, incollare l'URL in URL webhooke quindi scegliere il segno più ( + ).Copy the deployment URL and browse to your DockerHub repo, choose the Webhooks tab, type a Webhook name for the webhook, paste your URL in Webhook URL, and then choose the plus sign (+).

Aggiungere il webhook nel repository DockerHub

Con il webhook configurato, ogni volta che l'immagine collegata in DockerHub viene aggiornata l'app per le funzioni scarica e installa l'immagine.With the webhook set, any updates to the linked image in DockerHub result in the function app downloading and installing the latest image.

Abilitare le connessioni SSHEnable SSH connections

SSH consente la comunicazione sicura tra un contenitore e un client.SSH enables secure communication between a container and a client. Con SSH abilitato è possibile connettersi al contenitore tramite Strumenti avanzati (Kudu) del Servizio app.With SSH enabled, you can connect to your container using App Service Advanced Tools (Kudu). Per semplificare la connessione al contenitore tramite SSH, Funzioni di Azure fornisce un'immagine di base con SSH già abilitato.To make it easy to connect to your container using SSH, Functions provide a base image that has SSH already enabled.

Modificare l'immagine di baseChange the base image

In Dockerfile aggiungere la stringa -appservice all'immagine di base nell'istruzione FROM, che per un progetto JavaScript avrà l'aspetto seguente.In your dockerfile, append the string -appservice to the base image in your FROM instruction, which for a JavaScript project looks like the following.

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

Le differenze nelle due immagini di base abilitano le connessioni SSH nel contenitore.The differences in the two base images enable SSH connections into your container. Queste differenze sono descritte in dettaglio in questa esercitazione sul Servizio app.These differences are detailed in this App Services tutorial.

Ricompilare e ridistribuire l'immagineRebuild and redeploy the image

Nella cartella radice eseguire di nuovo il comando docker build e come in precedenza sostituire <docker-id> con l'ID dell'account Docker Hub.In the root folder, run the docker build command again, as before, replace <docker-id> with your Docker Hub account ID.

docker build --tag <docker-id>/mydockerimage:v1.0.0 .

Eseguire il push dell'immagine aggiornata in Docker Hub.Push the updated image back to Docker Hub.

docker push <docker-id>/mydockerimage:v1.0.0

L'immagine aggiornata viene ridistribuita nell'app per le funzioni.The updated image is redeployed to your function app.

Connettersi al contenitore in AzureConnect to your container in Azure

Nel browser passare all'endpoint scm. di Strumenti avanzati (Kudu) seguente per il contenitore dell'app per le funzioni, sostituendo <app_name> con il nome dell'app per le funzioni.In the browser, navigate to the following Advanced Tools (Kudu) scm. endpoint for your function app container, replacing <app_name> with the name of your function app.

https://<app_name>.scm.azurewebsites.net/

Accedere all'account Azure e quindi selezionare la scheda SSH per creare una connessione SSH nel contenitore.Sign in to your Azure account, and then select the SSH tab to create an SSH connection into your container.

Dopo aver stabilito la connessione, eseguire il comando top per visualizzare i processi attualmente in esecuzione.After the connection is established, run the top command to view the currently running processes.

Comando top di Linux in esecuzione in una sessione SSH.

Eseguire la scrittura in archiviazione codeWrite to Queue storage

Funzioni di Azure consente di connettere i servizi di Azure e altre risorse alle funzioni senza la necessità di scrivere codice di integrazione personalizzato.Functions lets you connect Azure services and other resources to functions without having to write your own integration code. Questi binding, che rappresentano sia input che output, vengono dichiarati all'interno della definizione di funzione.These bindings, which represent both input and output, are declared within the function definition. I dati dei binding vengono forniti alla funzione come parametri.Data from bindings is provided to the function as parameters. Un trigger è un tipo speciale di binding di input.A trigger is a special type of input binding. Anche se una funzione include un solo trigger, può avere più binding di input e output.Although a function has only one trigger, it can have multiple input and output bindings. Per altre informazioni, vedere Concetti su trigger e binding di Funzioni di Azure.To learn more, see Azure Functions triggers and bindings concepts.

Questa sezione illustra come integrare la funzione con una coda di archiviazione di Azure.This section shows you how to integrate your function with an Azure Storage queue. Il binding di output che si aggiunge a questa funzione scrive i dati di una richiesta HTTP in un messaggio della coda.The output binding that you add to this function writes data from an HTTP request to a message in the queue.

Scaricare le impostazioni dell'app per le funzioniDownload the function app settings

È stata già creata un'app per le funzioni in Azure, oltre al necessario account di archiviazione.You've already created a function app in Azure, along with the required Storage account. La stringa di connessione per questo account è archiviata in modo sicuro nelle impostazioni dell'app in Azure.The connection string for this account is stored securely in app settings in Azure. In questo articolo verranno scritti messaggi in una coda di archiviazione dello stesso account.In this article, you write messages to a Storage queue in the same account. Per connettersi all'account di archiviazione durante l'esecuzione della funzione in locale, è necessario scaricare le impostazioni dell'app nel file local.settings.json.To connect to your Storage account when running the function locally, you must download app settings to the local.settings.json file.

Dalla radice del progetto eseguire il comando di Azure Functions Core Tools seguente per scaricare le impostazioni nel file local.settings.json, sostituendo <APP_NAME> con il nome dell'app per le funzioni specificato nell'articolo precedente:From the root of the project, run the following Azure Functions Core Tools command to download settings to local.settings.json, replacing <APP_NAME> with the name of your function app from the previous article:

func azure functionapp fetch-app-settings <APP_NAME>

Potrebbe essere necessario accedere all'account Azure.You might need to sign in to your Azure account.

Importante

Questo comando sovrascrive le impostazioni esistenti con i valori dell'app per le funzioni in Azure.This command overwrites any existing settings with values from your function app in Azure.

Il file local.settings.json contiene segreti, quindi non viene mai pubblicato e dovrà essere escluso dal controllo del codice sorgente.Because it contains secrets, the local.settings.json file never gets published, and it should be excluded from source control.

È necessario il valore AzureWebJobsStorage, che corrisponde alla stringa di connessione dell'account di archiviazione.You need the value AzureWebJobsStorage, which is the Storage account connection string. Usare questa connessione per verificare se il binding di output funziona come previsto.You use this connection to verify that the output binding works as expected.

Abilitare le aggregazioni di estensioniEnable extension bundles

Dato che si usa un binding di output di Archiviazione code, è necessario che l'estensione dei binding di archiviazione sia installata prima di eseguire il progetto.Because you are using a Queue storage output binding, you must have the Storage bindings extension installed before you run the project.

Il modo più semplice per installare le estensioni di binding è consentire aggregazioni di estensione.The easiest way to install binding extensions is to enable extension bundles. Quando si abilitano i bundle, viene installato automaticamente un set predefinito di pacchetti di estensioni.When you enable bundles, a predefined set of extension packages is automatically installed.

Per abilitare i bundle di estensioni, aprire il file host.json e aggiornarne il contenuto in modo che corrisponda al codice seguente:To enable extension bundles, open the host.json file and update its contents to match the following code:

{
    "version": "2.0",
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle",
        "version": "[1.*, 2.0.0)"
    }
}

A questo punto, è possibile aggiungere l'associazione di output di archiviazione al progetto.Now, you can add a Storage output binding to your project.

Aggiungere un binding di outputAdd an output binding

In Funzioni ogni tipo di binding richiede di definire direction, type e un valore univoco name nel file function.json.In Functions, each type of binding requires a direction, type, and a unique name to be defined in the function.json file. Il modo in cui si definiscono questi attributi dipende dal linguaggio dell'app per le funzioni.The way you define these attributes depends on the language of your function app.

Gli attributi di binding vengono definiti direttamente nel file function.json.Binding attributes are defined directly in the function.json file. A seconda del tipo di binding, potrebbero essere necessarie altre proprietà.Depending on the binding type, additional properties may be required. La tabella di configurazione dell'output della coda indica i campi necessari per un binding della coda di archiviazione di Azure.The queue output configuration describes the fields required for an Azure Storage queue binding. L'estensione semplifica l'aggiunta di binding nel file function.json.The extension makes it easy to add bindings to the function.json file.

Per creare un binding, fare clic con il pulsante destro del mouse (CTRL+clic in macOS) sul file function.json nella cartella HttpTrigger e scegliere Aggiungi binding. Seguire i prompt per definire le proprietà seguenti per il nuovo binding:To create a binding, right-click (Ctrl+click on macOS) the function.json file in your HttpTrigger folder and choose Add binding.... Follow the prompts to define the following binding properties for the new binding:

PromptPrompt ValoreValue DESCRIZIONEDescription
Selezionare la direzione di bindingSelect binding direction out Il binding è un binding di output.The binding is an output binding.
Selezionare il binding con direzioneSelect binding with direction... Azure Queue Storage Il binding è un binding della coda di archiviazione di Azure.The binding is an Azure Storage queue binding.
Il nome usato per identificare questo binding nel codiceThe name used to identify this binding in your code msg Nome che identifica il parametro di binding a cui viene fatto riferimento nel codice.Name that identifies the binding parameter referenced in your code.
La coda a cui verrà inviato il messaggioThe queue to which the message will be sent outqueue Il nome della coda in cui scrive il binding.The name of the queue that the binding writes to. Se queueName non esiste, il binding lo crea al primo utilizzo.When the queueName doesn't exist, the binding creates it on first use.
Selezionare l'impostazione da "local.setting.json"Select setting from "local.setting.json" AzureWebJobsStorage Il nome dell'impostazione dell'applicazione che contiene la stringa di connessione per l'account di archiviazione.The name of an application setting that contains the connection string for the Storage account. L'impostazione AzureWebJobsStorage contiene la stringa di connessione per l'account di archiviazione creato con l'app per le funzioni.The AzureWebJobsStorage setting contains the connection string for the Storage account you created with the function app.

Viene aggiunto un binding alla matrice bindings nel file function.json, che dovrà essere come indicato nell'esempio seguente:A binding is added to the bindings array in your function.json file, which should now look like the following example:

{
   ...

  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

Aggiungere il codice che usa l'associazione di outputAdd code that uses the output binding

Una volta definito il binding, è possibile usare il relativo valore name per accedervi come attributo nella firma della funzione.After the binding is defined, you can use the name of the binding to access it as an attribute in the function signature. Usando un binding di output, non è necessario usare il codice di Azure Storage SDK per l'autenticazione, per recuperare un riferimento alla coda o per scrivere dati.By using an output binding, you don't have to use the Azure Storage SDK code for authentication, getting a queue reference, or writing data. Queste attività vengono eseguite automaticamente dal runtime di Funzioni e dal binding di output.The Functions runtime and queue output binding do those tasks for you.

Aggiungere il codice che usa l'oggetto msg del binding di output in context.bindings per creare un messaggio della coda.Add code that uses the msg output binding object on context.bindings to create a queue message. Aggiungere questo codice prima dell'istruzione context.res.Add this code before thecontext.res statement.

// Add a message to the Storage queue.
context.bindings.msg = "Name passed to the function: " + 
(req.query.name || req.body.name);

A questo punto, la funzione sarà come indicato di seguito:At this point, your function should look as follows:

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    if (req.query.name || (req.body && req.body.name)) {
        // Add a message to the Storage queue.
        context.bindings.msg = "Name passed to the function: " + 
        (req.query.name || req.body.name);
        context.res = {
            // status: 200, /* Defaults to 200 */
            body: "Hello " + (req.query.name || req.body.name)
        };
    }
    else {
        context.res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
};

Aggiornare il contenitore ospitatoUpdate the hosted container

Nella cartella radice eseguire di nuovo il comando docker build e questa volta aggiornare la versione nel tag impostandola su v1.0.2.In the root folder, run the docker build command again, and this time update the version in the tag to v1.0.2. Come in precedenza, sostituire <docker-id> con l'ID dell'account Docker Hub.As before, replace <docker-id> with your Docker Hub account ID.

docker build --tag <docker-id>/mydockerimage:v1.0.0 .

Eseguire il push dell'immagine aggiornata nel repository.Push the updated image back to the repository.

docker push <docker-id>/mydockerimage:v1.0.0

Verificare gli aggiornamenti in AzureVerify the updates in Azure

Usare lo stesso URL usato in precedenza dal browser per attivare la funzione.Use the same URL as before from the browser to trigger your function. Verrà visualizzata la stessa risposta.You should see the same response. Questa volta, tuttavia, la stringa passata come parametro name viene scritta nella coda di archiviazione outqueue.However, this time the string that you pass as the name parameter is written to the outqueue storage queue.

Impostare la connessione dell'account di archiviazioneSet the Storage account connection

Aprire il file local.settings.json e copiare il valore di AzureWebJobsStorage, che corrisponde alla stringa di connessione dell'account di archiviazione.Open the local.settings.json file and copy the value of AzureWebJobsStorage, which is the Storage account connection string. Impostare la variabile di ambiente AZURE_STORAGE_CONNECTION_STRING sulla stringa di connessione usando il comando Bash seguente:Set the AZURE_STORAGE_CONNECTION_STRING environment variable to the connection string by using this Bash command:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

Con la stringa di connessione impostata sulla variabile di ambiente AZURE_STORAGE_CONNECTION_STRING, è possibile accedere all'account di archiviazione senza eseguire ogni volta l'autenticazione.When you set the connection string in the AZURE_STORAGE_CONNECTION_STRING environment variable, you can access your Storage account without having to provide authentication each time.

Eseguire una query sulla coda di archiviazioneQuery the Storage queue

È possibile usare il comando az storage queue list per visualizzare le code di archiviazione dell'account, come indicato nell'esempio seguente:You can use the az storage queue list command to view the Storage queues in your account, as in the following example:

az storage queue list --output tsv

L'output di questo comando include una coda denominata outqueue, che è la coda creata quando è stata eseguita la funzione.The output from this command includes a queue named outqueue, which is the queue that was created when the function ran.

Usare quindi il comando az storage message peek per visualizzare i messaggi inclusi in questa coda, come indicato in questo esempio:Next, use the az storage message peek command to view the messages in this queue, as in this example:

echo `echo $(az storage message peek --queue-name outqueue -o tsv --query '[].{Message:content}') | base64 --decode`

La stringa restituita dovrebbe essere la stessa del messaggio inviato per testare la funzione.The string returned should be the same as the message you sent to test the function.

Nota

L'esempio precedente decodifica la stringa restituita da base64.The previous example decodes the returned string from base64. Il motivo è che i binding di archiviazione della coda scrivono e leggono i dati da Archiviazione di Azure sotto forma di stringhe base64.This is because the Queue storage bindings write to and read from Azure Storage as base64 strings.

Pulire le risorseClean up resources

Altre guide di avvio rapido di questa raccolta si basano sulla presente guida di avvio rapido.Other quickstarts in this collection build upon this quickstart. Se si prevede di continuare con le guide di avvio rapido o le esercitazioni successive, non eliminare le risorse create in questa guida di avvio rapido.If you plan to continue on with subsequent quickstarts or with the tutorials, don't clean up the resources created in this quickstart. Se non si prevede di continuare, usare il comando seguente per eliminare tutte le risorse create in questa guida di avvio rapido:If you don't plan to continue, use the following command to delete all resources created in this quickstart:

az group delete --name myResourceGroup

Quando richiesto, selezionare y.Select y when prompted.

Passaggi successiviNext steps

Ora che il contenitore personalizzato è stato distribuito in un'app per le funzioni in Azure, è consigliabile leggere altre informazioni sugli argomenti seguenti:Now that you have successfully deployed your custom container to a function app in Azure, consider reading more about the following topics: