Compartir vía


Conexión de la función de Java a Azure Storage

Azure Functions le permite conectar servicios de Azure y otros recursos a funciones sin tener que escribir su propio código de integración. Estos enlaces, que representan la entrada y la salida, se declaran dentro de la definición de función. Los datos de los enlaces se proporcionan a la función como parámetros. Un desencadenador es un tipo especial de enlace de entrada. Si bien una función tiene un único desencadenador, puede tener varios enlaces de entrada y salida. Para más información, consulte Conceptos básicos sobre los enlaces y desencadenadores de Azure Functions.

En este artículo se muestra cómo integrar la función que creó en el artículo de inicio rápido anterior con una cola de Azure Storage. El enlace de salida que se agrega a esta función escribe datos de una solicitud HTTP en un mensaje de la cola.

La mayoría de los enlaces requieren una cadena de conexión almacenada que se usa en Functions para acceder al servicio enlazado. Para facilitar la conexión, usará la cuenta de almacenamiento que creó con la aplicación de funciones. La conexión a esta cuenta ya está almacenada en una configuración de aplicación llamada AzureWebJobsStorage.

Prerrequisitos

Antes de empezar este artículo, realice los pasos de la parte 1 del inicio rápido de Java.

Descarga de la configuración de la aplicación de función

Ya ha creado una aplicación de funciones en Azure junto con la cuenta de Storage necesaria. La cadena de conexión de esta cuenta se almacena de forma segura en la configuración de la aplicación en Azure. En este artículo, escribirá mensajes en una cola de almacenamiento de la misma cuenta. 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.

Desde la raíz del proyecto, ejecute el siguiente el comando de Azure Functions Core Tools para descargar la configuración en local.settings.json y reemplace <APP_NAME> por el nombre de la aplicación de funciones del artículo anterior:

func azure functionapp fetch-app-settings <APP_NAME>

Es posible que tenga que iniciar sesión en su cuenta de Azure.

Importante

Este comando sobrescribe la configuración existente con los valores de la aplicación de funciones de Azure.

Como contiene secretos, el archivo local.settings.json nunca se publica y debe excluirse del control de código fuente.

Necesitará el valor AzureWebJobsStorage, que es la cadena de conexión de la cuenta de almacenamiento. Esta conexión se usa para comprobar que el enlace de salida funciona según lo previsto.

Habilitación de conjuntos de extensiones

La forma más fácil de instalar extensiones de enlace es habilitar conjuntos de extensiones. Al habilitar agrupaciones, un conjunto predefinido de paquetes de extensiones se instala automáticamente.

Para habilitar las agrupaciones de extensiones, abra el archivo host.json y actualice su contenido para que coincida con el siguiente código:

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

Ahora podrá agregar el enlace de salida de almacenamiento al proyecto.

Adición de un enlace de salida

En un proyecto de Java, los enlaces se definen como anotaciones de enlace en el método de función. Entonces, el archivo function.json se genera automáticamente en función de estas anotaciones.

Vaya a la ubicación del código de función en src/main/java, abra el archivo de proyecto Function.java y agregue el parámetro siguiente a la definición del método run:

@QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") OutputBinding<String> msg

El parámetro msg es un tipo OutputBinding<T>, que representa una colección de cadenas. Estas cadenas se escriben como mensajes en un enlace de salida cuando se completa la función. En este caso, la salida es una cola de almacenamiento denominada outqueue. La cadena de conexión de la cuenta de Storage la establece el método connection. Se pasa la configuración de la aplicación que contiene la cadena de conexión de la cuenta Storage, en lugar de pasar la propia cadena de conexión.

La definición del método run debe ahora parecerse a la del siguiente ejemplo:

@FunctionName("HttpTrigger-Java")
public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.FUNCTION)  
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", connection = "AzureWebJobsStorage") 
        OutputBinding<String> msg, final ExecutionContext context) {
    ...
}

Adición de código que utilice el enlace de salida

Ahora, puede usar el nuevo parámetro msg para escribir en el enlace de salida desde el código de la función. Agregue la siguiente línea de código antes de la respuesta de operación correcta para agregar el valor de name al enlace de salida msg.

msg.setValue(name);

Al usar 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. El sistema en tiempo de ejecución de Functions y el enlace de salida de cola realizan esas tareas automáticamente.

El método run debe ahora parecerse al del siguiente ejemplo:

public HttpResponseMessage run(
        @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
        HttpRequestMessage<Optional<String>> request, 
        @QueueOutput(name = "msg", queueName = "outqueue", 
        connection = "AzureWebJobsStorage") OutputBinding<String> msg, 
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger processed a request.");

    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST)
        .body("Please pass a name on the query string or in the request body").build();
    } else {
        // Write the name to the message queue. 
        msg.setValue(name);

        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
}

Actualización de las pruebas

Dado que el arquetipo también crea un conjunto de pruebas, debe actualizar estas pruebas para controlar el nuevo parámetro msg en la signatura del método run.

Vaya a la ubicación del código de prueba en src/test/java, abra el archivo de proyecto Function.Java y reemplace la línea de código debajo de //Invoke por el código siguiente:

@SuppressWarnings("unchecked")
final OutputBinding<String> msg = (OutputBinding<String>)mock(OutputBinding.class);
final HttpResponseMessage ret = new Function().run(req, msg, context);

Ahora ya está listo para probar el nuevo enlace de salida de forma local.

Ejecución local de la función

Como antes, use el siguiente comando para crear el proyecto e iniciar el sistema en tiempo de ejecución de Functions localmente:

mvn clean package 
mvn azure-functions:run

Nota

Como ya habilitó las agrupaciones de extensiones en el archivo host.json, la extensión de enlace de Storage se descargó e instaló automáticamente durante el inicio junto con el resto de extensiones de enlace de Microsoft.

Al igual que antes, desencadene la función desde la línea de comandos mediante cURL en una ventana de terminal nueva:

curl -w "\n" http://localhost:7071/api/HttpTrigger-Java --data AzureFunctions

Esta vez, el enlace de salida también crea una cola denominada outqueue en la cuenta de almacenamiento y agrega un mensaje con esta misma cadena.

A continuación, se usa la CLI de Azure para ver la nueva cola y comprobar que se ha agregado un mensaje. También puede ver la cola mediante el Explorador de Microsoft Azure Storage o en Azure Portal.

Establecimiento de la conexión de la cuenta de almacenamiento

Abra el archivo local.settings.json y copie el valor de AzureWebJobsStorage, que es la cadena de conexión de la cuenta de almacenamiento. Establezca la variable de entorno AZURE_STORAGE_CONNECTION_STRING en la cadena de conexión con el siguiente comando de Bash:

AZURE_STORAGE_CONNECTION_STRING="<STORAGE_CONNECTION_STRING>"

La establecer la cadena de conexión en la variable de entorno AZURE_STORAGE_CONNECTION_STRING, puede acceder a la cuenta de almacenamiento sin tener que autenticarse cada vez.

Consulta de la cola de almacenamiento

Puede usar el comando az storage queue list para ver las colas de almacenamiento de la cuenta, como en el ejemplo siguiente:

az storage queue list --output tsv

La salida de este comando incluye una cola denominada outqueue, que es la cola que se creó cuando se ejecutó la función.

A continuación, use el comando az storage message peek para ver los mensajes de esta cola, como se muestra en este ejemplo:

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

La cadena devuelta debe ser la misma que el mensaje que envió para probar la función.

Nota

En el ejemplo anterior se descodifica la cadena devuelta desde base64. Esto se debe a que los enlaces de Queue Storage escriben y leen en Azure Storage como cadenas de base64.

Reimplementación del proyecto

Para actualizar la aplicación publicada, vuelva a ejecutar el siguiente comando:

mvn azure-functions:deploy

De nuevo, puede usar cURL para probar la función implementada. Como antes, pase el valor AzureFunctions del cuerpo de la solicitud POST a la dirección URL, como en este ejemplo:

curl -w "\n" https://fabrikam-functions-20190929094703749.azurewebsites.net/api/HttpTrigger-Java?code=zYRohsTwBlZ68YF.... --data AzureFunctions

Puede examinar el mensaje de la cola de almacenamiento otra vez para comprobar que el enlace de salida genera un nuevo mensaje en la cola según lo previsto.

Limpieza de recursos

Otras guías de inicio rápido de esta colección se basan en los valores de esta. Si tiene previsto continuar con los siguientes artículos de inicio rápido o tutoriales, no elimine los recursos creados en este artículo. Si no va a continuar, use el siguiente comando para eliminar todos los recursos creados mediante este artículo de inicio rápido:

az group delete --name myResourceGroup

Cuando se le solicite, seleccione y.

Pasos siguientes

Ha actualizado la función desencadenada por HTTP para escribir datos en una cola de almacenamiento. Para más información sobre el desarrollo de Azure Functions con Java, consulte la Guía de Azure Functions para desarrolladores de Java y Desencadenadores y enlaces en Azure Functions. Para obtener ejemplos de proyectos de Functions completos en Java, consulte los ejemplos de Functions para Java.

A continuación, debe habilitar la supervisión de Application Insights para su aplicación de función: