Conexión de las funciones a Azure Storage mediante Visual Studio CodeConnect functions to Azure Storage using Visual Studio Code

Azure Functions permite conectar funciones a servicios de Azure y otros recursos sin tener que escribir su propio código de integración.Azure Functions lets you connect functions to Azure services and other resources without having to write your own integration code. Estos enlaces, que representan la entrada y la salida, se declaran dentro de la definición de función.These bindings, which represent both input and output, are declared within the function definition. Los datos de los enlaces se proporcionan a la función como parámetros.Data from bindings is provided to the function as parameters. Un desencadenador es un tipo especial de enlace de entrada.A trigger is a special type of input binding. Si bien una función tiene un único desencadenador, puede tener varios enlaces de entrada y salida.While a function has only one trigger, it can have multiple input and output bindings. Para más información, consulte Conceptos básicos sobre los enlaces y desencadenadores de Azure Functions.To learn more, see Azure Functions triggers and bindings concepts.

En este artículo se muestra cómo conectar la función que creó en el artículo de inicio rápido anterior a Azure Storage mediante Visual Studio Code.This article shows you how to use Visual Studio Code to connect the function you created in the previous quickstart article to Azure Storage. El enlace de salida que se agrega a esta función escribe datos de la solicitud HTTP en un mensaje de la cola de Azure Queue Storage.The output binding that you add to this function writes data from the HTTP request to a message in an Azure Queue storage queue.

La mayoría de los enlaces requieren una cadena de conexión almacenada que se usa en Functions para acceder al servicio enlazado.Most bindings require a stored connection string that Functions uses to access the bound service. Para que sea más fácil, usará la cuenta de almacenamiento que creó con la aplicación de función.To make it easier, you use the Storage account that you created with your function app. La conexión a esta cuenta ya está almacenada en una configuración de aplicación llamada AzureWebJobsStorage.The connection to this account is already stored in an app setting named AzureWebJobsStorage.

Requisitos previosPrerequisites

Para empezar este artículo debe cumplir antes los requisitos siguientes:Before you start this article, you must meet the following requirements:

En este artículo se da por supuesto que ya inició sesión en la suscripción de Azure desde Visual Studio Code.This article assumes that you are already signed in to your Azure subscription from Visual Studio Code. Puede iniciar sesión mediante la ejecución de Azure: Sign In desde la paleta de comandos.You can sign in by running Azure: Sign In from the command palette.

Descarga de la configuración de la aplicación de funciónDownload the function app settings

En el artículo de inicio rápido anterior creó una aplicación de funciones en Azure junto con una cuenta de Storage.In the previous quickstart article, you created a function app in Azure along with the required Storage account. La cadena de conexión de esta cuenta se almacena de forma segura en la configuración de la aplicación en Azure.The connection string for this account is stored securely in app settings in Azure. En este artículo, escribirá mensajes en una cola de almacenamiento de la misma cuenta.In this article, you write messages to a Storage queue in the same account. Para conectarse a su cuenta de almacenamiento cuando se ejecuta la función localmente, debe descargar la configuración de la aplicación en el archivo 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.

  1. Presione la tecla F1 para abrir la paleta de comandos, y busque y ejecute el comando Azure Functions: Download Remote Settings.....Press the F1 key to open the command palette, then search for and run the command Azure Functions: Download Remote Settings.....

  2. Elija la aplicación de funciones que creó en el artículo anterior.Choose the function app you created in the previous article. Seleccione Sí a todo para sobrescribir la configuración local existente.Select Yes to all to overwrite the existing local settings.

    Importante

    Como contiene secretos, el archivo local.settings.json nunca se publica, se excluye del control de código fuente.Because it contains secrets, the local.settings.json file never gets published, and is excluded from source control.

  3. Copie el valor AzureWebJobsStorage, que es la clave del valor de la cadena de conexión de la cuenta de Storage.Copy the value AzureWebJobsStorage, which is the key for the Storage account connection string value. Esta conexión se usa para comprobar que el enlace de salida funciona según lo previsto.You use this connection to verify that the output binding works as expected.

Registro de extensiones de enlaceRegister binding extensions

Dado que está utilizando un enlace de salida de Queue Storage, debe tener la extensión de enlaces de Storage instalada antes de ejecutar el proyecto.Because you are using a Queue storage output binding, you must have the Storage bindings extension installed before you run the project.

JavaScriptJavaScript

La forma más fácil de instalar extensiones de enlace es habilitar conjuntos de extensiones.The easiest way to install binding extensions is to enable extension bundles. Al habilitar agrupaciones, un conjunto predefinido de paquetes de extensiones se instala automáticamente.When you enable bundles, a predefined set of extension packages is automatically installed.

Para habilitar las agrupaciones de extensiones, abra el archivo host.json y actualice su contenido para que coincida con el siguiente código: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)"
    }
}

Biblioteca de clases de C#C# class library

A excepción de los desencadenadores HTTP y el temporizador, los enlaces se implementan como paquetes de extensión.With the exception of HTTP and timer triggers, bindings are implemented as extension packages. Ejecute el siguiente comando dotnet add package en la ventana Terminal para agregar el paquete de extensión de Storage al proyecto.Run the following dotnet add package command in the Terminal window to add the Storage extension package to your project.

dotnet add package Microsoft.Azure.WebJobs.Extensions.Storage --version 3.0.4

Ahora podrá agregar el enlace de salida de almacenamiento al proyecto.Now, you can add the storage output binding to your project.

Adición de un enlace de salidaAdd an output binding

En Functions, para cada tipo de enlace es necesario definir los elementos direction, type y un valor único de name en el archivo function.json.In Functions, each type of binding requires a direction, type, and a unique name to be defined in the function.json file. La manera de definir estos atributos depende del lenguaje de la aplicación de funciones.The way you define these attributes depends on the language of your function app.

JavaScriptJavaScript

Los atributos de enlace se definen directamente en el archivo function.json.Binding attributes are defined directly in the function.json file. Según el tipo de enlace, pueden ser necesarias propiedades adicionales.Depending on the binding type, additional properties may be required. En la configuración de salida de cola se describen los campos necesarios para un enlace de cola de Azure Storage.The queue output configuration describes the fields required for an Azure Storage queue binding. La extensión facilita la incorporación de enlaces al archivo function.json.The extension makes it easy to add bindings to the function.json file.

Para crear un enlace, haga clic con el botón derecho (Ctrl + clic en macOS) en el archivo function.json de la carpeta HttpTrigger y elija Agregar enlace... Siga las indicaciones para definir las siguientes propiedades de enlace para el nuevo enlace: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 ValorValue DESCRIPCIÓNDescription
Select binding direction (Seleccionar dirección de enlace)Select binding direction out El enlace es un enlace de salida.The binding is an output binding.
Select binding with direction... (Seleccionar enlace con dirección...)Select binding with direction... Azure Queue Storage El enlace es un enlace de cola de Azure Storage.The binding is an Azure Storage queue binding.
The name used to identify this binding in your code (Nombre identificativo del enlace en el código)The name used to identify this binding in your code msg Nombre que identifica el parámetro de enlace al que se hace referencia en el código.Name that identifies the binding parameter referenced in your code.
The queue to which the message will be sent (Cola donde se enviará el mensaje)The queue to which the message will be sent outqueue El nombre de la cola en la que escribe el enlace.The name of the queue that the binding writes to. Cuando no existe queueName, el enlace lo crea durante el primer uso.When the queueName doesn't exist, the binding creates it on first use.
Select setting from "local.setting.json" (Seleccionar configuración de "local.setting.json")Select setting from "local.setting.json" AzureWebJobsStorage El nombre de una configuración de la aplicación que contiene la cadena de conexión de la cuenta de Storage.The name of an application setting that contains the connection string for the Storage account. El valor AzureWebJobsStorage contiene la cadena de conexión de la cuenta de almacenamiento que creó con la aplicación de función.The AzureWebJobsStorage setting contains the connection string for the Storage account you created with the function app.

Se agrega un enlace a la matriz bindings en el archivo function.json, que debería ser ahora similar al siguiente ejemplo: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"
    }
  ]
}

Biblioteca de clases de C#C# class library

En un proyecto de biblioteca de clases de C#, los enlaces se definen como atributos de enlace en el método de función.In a C# class library project, the bindings are defined as binding attributes on the function method. Después se genera automáticamente el archivo function.json en función de estos atributos.The function.json file is then auto-generated based on these attributes.

Abra el archivo de proyecto HttpTrigger.cs y agregue la siguiente instrucción using:Open the HttpTrigger.cs project file and add the following using statement:

using Microsoft.Azure.WebJobs.Extensions.Storage;

Agregue el siguiente parámetro a la definición de método Run:Add the following parameter to the Run method definition:

[Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg

El parámetro msg es de tipo ICollector<T>, que representa una colección de mensajes escritos en un enlace de salida cuando se completa la función.The msg parameter is an ICollector<T> type, which represents a collection of messages that are written to an output binding when the function completes. En este caso, la salida es una cola de almacenamiento denominada outqueue.In this case, the output is a storage queue named outqueue. La cadena de conexión de la cuenta de Storage la establece StorageAccountAttribute.The connection string for the Storage account is set by the StorageAccountAttribute. Este atributo indica la configuración que contiene la cadena de conexión de la cuenta de Storage y se puede aplicar en el nivel de clase, método o parámetro.This attribute indicates the setting that contains the Storage account connection string and can be applied at the class, method, or parameter level. En este caso, puede omitir StorageAccountAttribute, puesto que ya está usando la cuenta de almacenamiento predeterminada.In this case, you could omit StorageAccountAttribute because you are already using the default storage account.

La definición del método Run debe ahora parecerse a la siguiente:The Run method definition should now look like the following:

[FunctionName("HttpTrigger")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, ILogger log)

Adición de código que utilice el enlace de salidaAdd code that uses the output binding

Una vez definido el enlace, podrá usar el valor de name de este para acceder a él como atributo en la firma de función.After the binding is defined, you can use the name of the binding to access it as an attribute in the function signature. Con un enlace de salida, no tiene que usar el código del SDK de Azure Storage para autenticarse, obtener una referencia de cola o escribir datos.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. El sistema en tiempo de ejecución de Functions y el enlace de salida de cola realizan esas tareas automáticamente.The Functions runtime and queue output binding do those tasks for you.

JavaScriptJavaScript

Agregue código que utilice el objeto de enlace de salida msg en context.bindings para crear un mensaje de la cola.Add code that uses the msg output binding object on context.bindings to create a queue message. Agregue este código antes de la instrucción 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);

En este momento, la función debe tener el aspecto siguiente: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"
        };
    }
};

C#C#

Agregue código que utilice el objeto de enlace de salida msg para crear un mensaje de la cola.Add code that uses the msg output binding object to create a queue message. Agregue este código antes de la devolución del método.Add this code before the method returns.

if (!string.IsNullOrEmpty(name))
{
    // Add a message to the output collection.
    msg.Add(string.Format("Name passed to the function: {0}", name));
}

En este momento, la función debe tener el aspecto siguiente:At this point, your function should look as follows:

[FunctionName("HttpTrigger")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, 
    [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    if (!string.IsNullOrEmpty(name))
    {
        // Add a message to the output collection.
        msg.Add(string.Format("Name passed to the function: {0}", name));
    }
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

Ejecución local de la funciónRun the function locally

Azure Functions Core Tools le permite ejecutar un proyecto de Azure Functions en el equipo de desarrollo local.Azure Functions Core Tools lets you run an Azure Functions project on your local development computer.

  1. Para probar la función, establezca un punto de interrupción en el código de la función y presione F5 para iniciar el proyecto de la aplicación de función.To test your function, set a breakpoint in the function code and press F5 to start the function app project. La salida de Core Tools aparece en el panel Terminal.Output from Core Tools is displayed in the Terminal panel.

  2. En el panel Terminal, copie el punto de conexión de la dirección URL de la función desencadenada por HTTP.In the Terminal panel, copy the URL endpoint of your HTTP-triggered function. Esta dirección URL incluye la clave de función, que se pasa al parámetro de consulta code.This URL includes the function key, which is passed to the code query parameter.

    Salida local de Azure

  3. Pegue la dirección URL de la solicitud HTTP en la barra de direcciones del explorador.Paste the URL for the HTTP request into your browser's address bar. Agregue la cadena de consulta ?name=<yourname> a esta dirección URL y ejecute la solicitud.Append the query string ?name=<yourname> to this URL and execute the request. La ejecución se pone en pausa cuando se alcanza el punto de interrupción.Execution is paused when the breakpoint is hit.

  4. Si continúa la ejecución, aquí se muestra la respuesta en el explorador a la solicitud GET:When you continue the execution, the following shows the response in the browser to the GET request:

    Respuesta de localhost de la función en el explorador

  5. Para detener la depuración, presione Mayús + F5.To stop debugging, press Shift + F5.

Cuando el enlace de salida se usa por primera vez, el entorno de ejecución de Functions crea una nueva cola denominada outqueue en la cuenta de almacenamiento.A new queue named outqueue is created in your storage account by the Functions runtime when the output binding is first used. Usará el Explorador de Storage para comprobar que se han creado la cola y un mensaje.You'll use Storage Explorer to verify that the queue was created along with the new message.

Conexión del Explorador de Storage con la cuentaConnect Storage Explorer to your account

Omita esta sección si ya ha instalado el Explorador de Azure Storage y lo ha conectado a su cuenta de Azure.Skip this section if you have already installed Azure Storage Explorer and connected it to your Azure account.

  1. Ejecute la herramienta Explorador de Azure Storage, y seleccione el icono de conexión de la izquierda y Agregar una cuenta.Run the Azure Storage Explorer tool, select the connect icon on the left, and select Add an account.

    Incorporación de una cuenta de Azure al Explorador de Microsoft Azure Storage

  2. En el cuadro de diálogo Conectar, elija Add an Azure account (Agregar una cuenta de Azure), elija el Entorno Azure y seleccione Iniciar sesión...In the Connect dialog, choose Add an Azure account, choose your Azure environment, and select Sign in....

    Inicio de sesión en la cuenta de Azure.

Después de iniciar sesión correctamente en su cuenta, verá todas las suscripciones de Azure asociadas con ella.After you successfully sign in to your account, you see all of the Azure subscriptions associated with your account.

Examen de la cola de salidaExamine the output queue

  1. En Visual Studio Code, presione la tecla F1 para abrir la paleta de comandos, busque y ejecute el comando Azure Storage: Open in Storage Explorer y elija el nombre de la cuenta de Storage.In Visual Studio Code, press the F1 key to open the command palette, then search for and run the command Azure Storage: Open in Storage Explorer and choose your Storage account name. En el menú de la cuenta de almacenamiento, seleccione Explorador de Azure Storage.Your storage account opens in Azure Storage Explorer.

  2. Expanda el nodo Colas y, después, seleccione la cola con el nombre outqueue.Expand the Queues node, and then select the queue named outqueue.

    La cola contiene el mensaje que creó el enlace de salida de la cola al ejecutar la función desencadenada por HTTP.The queue contains the message that the queue output binding created when you ran the HTTP-triggered function. Si se invoca la función con el valor predeterminado name de Azure, el mensaje de cola es Name passed to the function: Azure (Nombre pasado a la función: Azure).If you invoked the function with the default name value of Azure, the queue message is Name passed to the function: Azure.

    Mensaje de la cola que se muestra en el Explorador de Azure Storage

  3. Vuelva a ejecutar la función, envíe otra solicitud y verá aparecer un nuevo mensaje en la cola.Run the function again, send another request, and you'll see a new message appear in the queue.

Ahora, es el momento de volver a publicar la aplicación de función actualizada en Azure.Now, it's time to republish the updated function app to Azure.

Reimplementación y comprobación de la aplicación actualizadaRedeploy and verify the updated app

  1. En Visual Studio Code, presione F1 para abrir la paleta de comandos.In Visual Studio Code, press F1 to open the command palette. En la paleta de comandos, busque y seleccione Azure Functions: Deploy to function app....In the command palette, search for and select Azure Functions: Deploy to function app....

  2. Elija la aplicación de funciones que creó en el primer artículo.Choose the function app that you created in the first article. Dado que se está volviendo a implementar el proyecto en la misma aplicación, seleccione Implementar para descartar la advertencia sobre la sobrescritura de archivos.Because you are redeploying your project to the same app, select Deploy to dismiss the warning about overwriting files.

  3. Una vez finalizada la implementación, puede usar nuevamente cURL o un explorador para probar la función que ha vuelto a implementar.After deployment completes, you can again use cURL or a browser to test the redeployed function. Como antes, adjunte la cadena de consulta &name=<yourname> a la dirección URL, como en el ejemplo siguiente:As before, append the query string &name=<yourname> to the URL, as in the following example:

    curl https://myfunctionapp.azurewebsites.net/api/httptrigger?code=cCr8sAxfBiow548FBDLS1....&name=<yourname>
    
  4. De nuevo, consulte el mensaje de la cola de almacenamiento para comprobar que el enlace de salida genera otra vez un nuevo mensaje en la cola.Again view the message in the storage queue to verify that the output binding again generates a new message in the queue.

Limpieza de recursosClean up resources

En Azure, los recursos son aplicaciones de función, funciones o cuentas de almacenamiento, entre otros.Resources in Azure refers to function apps, functions, storage accounts, and so forth. Se agrupan en grupos de recursos, y se puede eliminar todo el contenido de un grupo si se elimina el grupo.They are grouped into resource groups, and you can delete everything in a group by deleting the group.

Ha creado recursos para completar estas guías de inicio rápido.You created resources to complete these quickstarts. Se le pueden facturar por estos recursos, dependiendo del estado de la cuentade los y precios de los servicios.You may be billed for these resources, depending on your account status and service pricing. Si ya no necesita los recursos, aquí se indica cómo eliminarlos:If you don't need the resources anymore, here's how to delete them:

  1. En Visual Studio Code, presione F1 para abrir la paleta de comandos.In Visual Studio Code, press F1 to open the command palette. En la paleta de comandos, busque y seleccione Azure Functions: Open in portal.In the command palette, search for and select Azure Functions: Open in portal.

  2. Elija la aplicación de funciones y presione Entrar.Choose your function app, and press Enter. La página de la aplicación de funciones se abre en Azure Portal.The function app page is opened in the Azure portal.

  3. En la pestaña Introducción, seleccione el vínculo con nombre en Grupo de recursos.In the Overview tab, select the named link under Resource group.

    Seleccione el grupo de recursos que se va a eliminar de la página de la aplicación de función.

  4. En la página Grupo de recursos, revise la lista de recursos incluidos y compruebe que son los que desea eliminar.In the Resource group page, review the list of included resources, and verify that they are the ones you want to delete.

  5. Seleccione Eliminar grupo de recursos y siga las instrucciones.Select Delete resource group, and follow the instructions.

    El proceso de eliminación tardará un par de minutos.Deletion may take a couple of minutes. Cuando termine, aparece una notificación durante unos segundos.When it's done, a notification appears for a few seconds. También puede seleccionar el icono de campana en la parte superior de la página para ver la notificación.You can also select the bell icon at the top of the page to view the notification.

Pasos siguientesNext steps

Ha actualizado la función desencadenada por HTTP para escribir datos en una cola de almacenamiento.You've updated your HTTP triggered function to write data to a Storage queue. Para más información sobre el desarrollo de funciones, consulte Develop Azure Functions using Visual Studio Code (Desarrollo con Azure Functions mediante Visual Studio Code).To learn more about developing Functions, see Develop Azure Functions using Visual Studio Code.

A continuación, debe habilitar la supervisión de Application Insights para su aplicación de función:Next, you should enable Application Insights monitoring for your function app: