Liaison de sortie d’état Dapr pour Azure Functions

Important

L’extension Dapr pour Azure Functions est actuellement en préversion et uniquement prise en charge dans les environnements Azure Container Apps.

La liaison de sortie d’état Dapr vous permet d’enregistrer une valeur dans un état Dapr pendant l’exécution d’une fonction.

Pour plus d’informations sur l’installation et la configuration de l’extension Dapr, consultez la vue d’ensemble de l’extension Dapr.

Exemple

Une fonction C# peut être créée à l’aide de l’un des modes C# suivants :

Modèle d’exécution Description
Modèle de worker isolé Le code de votre fonction s’exécute dans un processus Worker .NET distinct. Utilisez avec les versions prises en charge de .NET et .NET Framework. Pour plus d’informations, consultez Développer les fonctions de processus Worker isolé .NET.
Modèle in-process Le code de votre fonction s’exécute dans le même processus que le processus hôte Functions. Prend uniquement en charge les versions LTS (Long Term Support) de .NET. Pour plus d’informations, consultez Développer des fonctions de bibliothèque de classes .NET.

L’exemple suivant illustre l’utilisation de la liaison de sortie d’état Dapr pour conserver un nouvel état dans le magasin d’état.

[FunctionName("StateOutputBinding")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "state/{key}")] HttpRequest req,
    [DaprState("statestore", Key = "{key}")] IAsyncCollector<string> state,
    ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    await state.AddAsync(requestBody);

    return new OkResult();
}

L’exemple suivant crée une fonction "CreateNewOrderHttpTrigger" à l’aide de la liaison DaprStateOutput avec un HttpTrigger :

@FunctionName("CreateNewOrderHttpTrigger")
public String run(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
        @DaprStateOutput(
            stateStore = "%StateStoreName%",
            key = "product")
        OutputBinding<String> product,
        final ExecutionContext context) {
    context.getLogger().info("Java HTTP trigger (CreateNewOrderHttpTrigger) processed a request.");
}

Dans l’exemple suivant, la liaison de sortie d’état Dapr est associée à un déclencheur HTTP, qui est inscrit par l’objet app :

const { app, trigger } = require('@azure/functions');

app.generic('StateOutputBinding', {
    trigger: trigger.generic({
        type: 'httpTrigger',
        authLevel: 'anonymous',
        methods: ['POST'],
        route: "state/{key}",
        name: "req"
    }),
    return: daprStateOutput,
    handler: async (request, context) => {
        context.log("Node HTTP trigger function processed a request.");

        const payload = await request.text();
        context.log(JSON.stringify(payload));

        return { value : payload };
    }
});

Les exemples suivants montrent les déclencheurs Dapr dans un fichier function.json et du code PowerShell qui utilise ces liaisons.

Voici le fichier function.json pour la sortie daprState :

{
  "bindings": 
    {
      "type": "daprState",
      "stateStore": "%StateStoreName%",
      "direction": "out",
      "name": "order",
      "key": "order"
    }
}

Pour plus d’informations sur les propriétés du fichier function.json, consultez la section Configuration.

Dans le code :

using namespace System
using namespace Microsoft.Azure.WebJobs
using namespace Microsoft.Extensions.Logging
using namespace Microsoft.Azure.WebJobs.Extensions.Dapr
using namespace Newtonsoft.Json.Linq

param (
    $payload
)

# C# function processed a CreateNewOrder request from the Dapr Runtime.
Write-Host "PowerShell function processed a CreateNewOrder request from the Dapr Runtime."

# Payload must be of the format { "data": { "value": "some value" } }

# Convert the object to a JSON-formatted string with ConvertTo-Json
$jsonString = $payload| ConvertTo-Json

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name order -Value $payload["data"]

L’exemple suivant montre une liaison de sortie d’état Dapr, qui utilise le modèle de programmation Python v2. Pour utiliser daprState dans le code de votre application de fonction Python :

import logging
import json
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="HttpTriggerFunc")
@app.route(route="req", auth_level=dapp.auth_level.ANONYMOUS)
@app.dapr_state_output(arg_name="state", state_store="statestore", key="newOrder")
def main(req: func.HttpRequest, state: func.Out[str] ) -> str:
    # request body must be passed this way '{\"value\": { \"key\": \"some value\" } }'
    body = req.get_body()
    if body is not None:
        state.set(body.decode('utf-8'))
        logging.info(body.decode('utf-8'))
    else:
        logging.info('req body is none')
    return 'ok'

Attributs

Dans le modèle in-process, utilisez le DaprState pour définir une liaison de sortie d’état Dapr, qui prend en charge ces paramètres :

Paramètre Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
StateStore Nom du magasin d’état pour enregistrer l’état. ✔️
Clé Nom de la clé permettant d’enregistrer l’état dans le magasin d’état. ✔️ ✔️
Valeur Obligatoire. Valeur stockée. ✔️

Annotations

L’annotation DaprStateOutput vous permet d’accéder à un magasin d’état.

Élément Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
stateStore Nom du magasin d’état pour enregistrer l’état. ✔️
key Nom de la clé permettant d’enregistrer l’état dans le magasin d’état. ✔️ ✔️
value Obligatoire. Valeur stockée. ✔️

Configuration

Le tableau suivant décrit les propriétés de configuration de liaison que vous avez définies dans le code.

Propriété Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
stateStore Nom du magasin d’état pour enregistrer l’état. ✔️
key Nom de la clé permettant d’enregistrer l’état dans le magasin d’état. ✔️ ✔️
value Obligatoire. Valeur stockée. ✔️

Le tableau suivant décrit les propriétés de configuration de liaison que vous définissez dans le fichier function.json.

Propriété function.json Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
stateStore Nom du magasin d’état pour enregistrer l’état. ✔️
key Nom de la clé permettant d’enregistrer l’état dans le magasin d’état. ✔️ ✔️
value Obligatoire. Valeur stockée. ✔️

Le tableau suivant explique les propriétés de configuration de liaison pour @dapp.dapr_state_output que vous définissez dans votre code Python.

Propriété Description Peut être envoyé via l’attribut Peut être envoyé via RequestBody
stateStore Nom du magasin d’état pour enregistrer l’état. ✔️
key Nom de la clé permettant d’enregistrer l’état dans le magasin d’état. ✔️ ✔️
value Obligatoire. Valeur stockée. ✔️

Si les propriétés sont définies dans les attributs et RequestBody, la priorité est attribuée aux données fournies dans RequestBody.

Pour obtenir des exemples complets, consultez la section Exemple.

Usage

Pour utiliser la liaison de sortie d’état Dapr, commencez par configurer un composant de magasin d’état Dapr. Vous pouvez en savoir plus sur le composant à utiliser et sur la façon de le configurer dans la documentation officielle Dapr.

Pour utiliser daprState dans Python v2, configurez votre projet avec les dépendances appropriées.

  1. Créer et activer un environnement virtuel.

  2. Dans votre fichier requirements.text, ajoutez la ligne suivante :

    azure-functions==1.18.0b3
    
  3. Dans le terminal, installez la bibliothèque Python.

    pip install -r .\requirements.txt
    
  4. Modifiez votre fichier local.setting.json avec la configuration suivante :

    "PYTHON_ISOLATE_WORKER_DEPENDENCIES":1
    

Étapes suivantes

En savoir plus sur la gestion de l’état Dapr.