padrões de expressão de enlace Funções do Azure

Uma das funcionalidades mais avançadas dos acionadores e enlaces são as expressões de enlace. No ficheiro function.json e nos parâmetros de função e no código, pode utilizar expressões que resolvem para valores de várias origens.

A maioria das expressões são identificadas encapsulando-as em chavetas. Por exemplo, numa função de acionador de fila, {queueTrigger} é resolvido para o texto da mensagem de fila. Se a path propriedade de um enlace de saída de blobs for container/{queueTrigger} e a função for acionada por uma mensagem HelloWorldde fila , é criado um blob com o nome HelloWorld .

Tipos de expressões de enlace

Expressões de enlace - definições da aplicação

Como melhor prática, os segredos e as cadeias de ligação devem ser geridos com as definições da aplicação, em vez de ficheiros de configuração. Isto limita o acesso a estes segredos e torna seguro armazenar ficheiros como function.json em repositórios de controlo de código fonte públicos.

As definições da aplicação também são úteis sempre que quiser alterar a configuração com base no ambiente. Por exemplo, num ambiente de teste, poderá querer monitorizar um contentor de armazenamento de blobs ou fila diferente.

As expressões de enlace de definição de aplicação são identificadas de forma diferente das outras expressões de enlace: são encapsuladas em sinais de percentagem em vez de chavetas. Por exemplo, se o caminho de enlace de saída do blob for %Environment%/newblob.txt e o valor da definição da aplicação Environment for Development, será criado um blob no Development contentor.

Quando uma função está a ser executada localmente, os valores de definição da aplicação são provenientes do ficheiro local.settings.json .

Nota

A connection propriedade dos acionadores e enlaces é um caso especial e resolve automaticamente os valores como definições da aplicação, sem sinais de percentagem.

O exemplo seguinte é um acionador do Armazenamento de Filas do Azure que utiliza uma definição %input_queue_name% de aplicação para definir a fila para acionar.

{
  "bindings": [
    {
      "name": "order",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "%input_queue_name%",
      "connection": "MY_STORAGE_ACCT_APP_SETTING"
    }
  ]
}

Pode utilizar a mesma abordagem nas bibliotecas de classes:

[FunctionName("QueueTrigger")]
public static void Run(
    [QueueTrigger("%input_queue_name%")]string myQueueItem, 
    ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
}

Nome de ficheiro do acionador

O path para um acionador de Blobs pode ser um padrão que lhe permite fazer referência ao nome do blob acionador noutros enlaces e código de função. O padrão também pode incluir critérios de filtragem que especificam que blobs podem acionar uma invocação de função.

Por exemplo, no seguinte enlace de acionador de Blobs, o path padrão é sample-images/{filename}, que cria uma expressão de enlace com o nome filename:

{
  "bindings": [
    {
      "name": "image",
      "type": "blobTrigger",
      "path": "sample-images/{filename}",
      "direction": "in",
      "connection": "MyStorageConnection"
    },
    ...

Em seguida, a expressão filename pode ser utilizada num enlace de saída para especificar o nome do blob que está a ser criado:

    ...
    {
      "name": "imageSmall",
      "type": "blob",
      "path": "sample-images-sm/{filename}",
      "direction": "out",
      "connection": "MyStorageConnection"
    }
  ],
}

O código de função tem acesso a este mesmo valor ao utilizar filename como um nome de parâmetro:

// C# example of binding to {filename}
public static void Run(Stream image, string filename, Stream imageSmall, ILogger log)  
{
    log.LogInformation($"Blob trigger processing: {filename}");
    // ...
} 

A mesma capacidade de utilizar expressões e padrões de enlace aplica-se a atributos em bibliotecas de classes. No exemplo seguinte, os parâmetros do construtor de atributos são os mesmos path valores que os exemplos de function.json anteriores:

[FunctionName("ResizeImage")]
public static void Run(
    [BlobTrigger("sample-images/{filename}")] Stream image,
    [Blob("sample-images-sm/{filename}", FileAccess.Write)] Stream imageSmall,
    string filename,
    ILogger log)
{
    log.LogInformation($"Blob trigger processing: {filename}");
    // ...
}

Também pode criar expressões para partes do nome do ficheiro. No exemplo seguinte, a função é acionada apenas em nomes de ficheiros que correspondam a um padrão: anyname-anyfile.csv

{
    "name": "myBlob",
    "type": "blobTrigger",
    "direction": "in",
    "path": "testContainerName/{date}-{filetype}.csv",
    "connection": "OrderStorageConnection"
}

Para obter mais informações sobre como utilizar expressões e padrões na cadeia de caminho do Blob, veja a Referência de enlace de blobs de armazenamento.

Metadados do acionador

Além do payload de dados fornecido por um acionador (como o conteúdo da mensagem de fila que acionou uma função), muitos acionadores fornecem valores de metadados adicionais. Estes valores podem ser utilizados como parâmetros de entrada em C# e F# ou propriedades no context.bindings objeto em JavaScript.

Por exemplo, um acionador de armazenamento de Filas do Azure suporta as seguintes propriedades:

  • QueueTrigger – acionar o conteúdo da mensagem se uma cadeia válida
  • DequeueCount
  • ExpirationTime
  • Id
  • InsertionTime
  • NextVisibleTime
  • PopReceipt

Estes valores de metadados estão acessíveis nas propriedades do ficheiro function.json . Por exemplo, suponha que utiliza um acionador de fila e que a mensagem de fila contém o nome de um blob que pretende ler. No ficheiro function.json , pode utilizar queueTrigger a propriedade metadados na propriedade blob path , conforme mostrado no exemplo seguinte:

{
  "bindings": [
    {
      "name": "myQueueItem",
      "type": "queueTrigger",
      "queueName": "myqueue-items",
      "connection": "MyStorageConnection",
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "direction": "in",
      "connection": "MyStorageConnection"
    }
  ]
}

Os detalhes das propriedades de metadados de cada acionador são descritos no artigo de referência correspondente. Por exemplo, veja metadados de acionador de fila. A documentação também está disponível no separador Integrar do portal, na secção Documentação abaixo da área de configuração do enlace.

Payloads JSON

Em alguns cenários, pode ver as propriedades do payload do acionador na configuração de outros enlaces na mesma função e no código de função. Isto requer que o payload do acionador seja JSON e seja inferior a um limiar específico de cada acionador. Normalmente, o tamanho do payload tem de ser inferior a 100 MB, mas deve verificar o conteúdo de referência de cada acionador. A utilização de propriedades de payload do acionador pode afetar o desempenho da sua aplicação e força o tipo de parâmetro do acionador a ser tipos simples, como cadeias ou um tipo de objeto personalizado que representa dados JSON. Não pode ser utilizado com fluxos, clientes ou outros tipos de SDK.

O exemplo seguinte mostra o ficheiro function.json de uma função de webhook que recebe um nome de blob em JSON: {"BlobName":"HelloWorld.txt"}. Um enlace de entrada de Blobs lê o blob e o enlace de saída HTTP devolve o conteúdo do blob na resposta HTTP. Repare que o enlace de entrada do Blob obtém o nome do blob ao referir-se diretamente à BlobName propriedade ("path": "strings/{BlobName}")

{
  "bindings": [
    {
      "name": "info",
      "type": "httpTrigger",
      "direction": "in",
      "webHookType": "genericJson"
    },
    {
      "name": "blobContents",
      "type": "blob",
      "direction": "in",
      "path": "strings/{BlobName}",
      "connection": "AzureWebJobsStorage"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    }
  ]
}

Para que isto funcione em C# e F#, precisa de uma classe que defina os campos a anular a serialização, tal como no exemplo seguinte:

using System.Net;
using Microsoft.Extensions.Logging;

public class BlobInfo
{
    public string BlobName { get; set; }
}
  
public static HttpResponseMessage Run(HttpRequestMessage req, BlobInfo info, string blobContents, ILogger log)
{
    if (blobContents == null) {
        return req.CreateResponse(HttpStatusCode.NotFound);
    } 

    log.LogInformation($"Processing: {info.BlobName}");

    return req.CreateResponse(HttpStatusCode.OK, new {
        data = $"{blobContents}"
    });
}

Em JavaScript, a desserialização JSON é executada automaticamente.

module.exports = async function (context, info) {
    if ('BlobName' in info) {
        context.res = {
            body: { 'data': context.bindings.blobContents }
        }
    }
    else {
        context.res = {
            status: 404
        };
    }
}

Notação de pontos

Se algumas das propriedades no payload JSON forem objetos com propriedades, pode fazer referência a essas propriedades diretamente através da notação de pontos (.). Esta notação não funciona para enlaces de armazenamento de Tabelas ou do Azure Cosmos DB.

Por exemplo, suponha que o JSON tem o seguinte aspeto:

{
  "BlobName": {
    "FileName":"HelloWorld",
    "Extension":"txt"
  }
}

Pode referir-se diretamente a FileName .BlobName.FileName Com este formato JSON, eis o path aspeto da propriedade no exemplo anterior:

"path": "strings/{BlobName.FileName}.{BlobName.Extension}",

Em C#, precisaria de duas classes:

public class BlobInfo
{
    public BlobName BlobName { get; set; }
}
public class BlobName
{
    public string FileName { get; set; }
    public string Extension { get; set; }
}

Criar GUIDs

A {rand-guid} expressão de enlace cria um GUID. O seguinte caminho de blob num function.json ficheiro cria um blob com um nome como 50710cb5-84b9-4d87-9d83-a03d6976a682.txt.

{
  "type": "blob",
  "name": "blobOutput",
  "direction": "out",
  "path": "my-output-container/{rand-guid}.txt"
}

Hora atual

A expressão DateTime de enlace é resolvida para DateTime.UtcNow. O seguinte caminho de blob num function.json ficheiro cria um blob com um nome como 2018-02-16T17-59-55Z.txt.

{
  "type": "blob",
  "name": "blobOutput",
  "direction": "out",
  "path": "my-output-container/{DateTime}.txt"
}

Enlace no runtime

Em C# e noutras linguagens .NET, pode utilizar um padrão de enlace imperativo, ao contrário dos enlaces declarativos em function.json e atributos. O enlace imperativo é útil quando os parâmetros de enlace têm de ser calculados no runtime em vez do tempo de conceção. Para saber mais, consulte a referência de programador C# ou a referência para programadores de scripts C#.

Passos seguintes