Создание имен для выходных капель для функции Azure

Используя опции привязки для Azure Function, вы можете указать имя Blob, которое должно быть записано на основе параметров, полученных из триггера (например, сообщение очереди, которое вызвало функцию); документация показывает пример этого.

Мой вопрос: какой лучший способ обработать случай, когда имя blob неизвестно заранее, но на самом деле вычисляется как часть выполнения функции?

И связанный с этим: что делать, если функция может или не может генерировать выходной блок (или несколько выходных капли!), основываясь на результатах его вычисления?

Насколько я могу видеть, механизм привязки функции Azure не очень помогает в этих случаях, и самый простой подход - это ссылка на сборку, которая делает лазурный лабиринт "классическим способом". Но есть ли более идиоматический способ?

Ответ 1

Фактически вы уже можете это сделать в С# Azure Functions, и у нас есть элемент отслеживания здесь, в нашем репо, чтобы включить это для Node.js. Мы скоро доберемся до этого.

Ниже приведен пример рабочей функции, которая связывается с блобом с указанным контуром во время выполнения. Поскольку под крышкой Azure Functions построен на Azure WebJobs SDK, вы заметите, что это зависит от использования WebJobs SDK Binder того, что вы, возможно, не знакомы. Дополнительную документацию можно найти в WebJobs SDK для IBinder/Binder. В SDK WebJobs для привязок используются декларативные атрибуты (например, QueueAttribute/TableAttribute/BlobAttribute и т.д.). Вы можете указать все это во время выполнения через Binder. В Azure Functions мы используем внешние метаданные для описания привязок, но в этом расширенном сценарии у вас есть гибрид. Обратите внимание, что при использовании Binder в function.json нет соответствующего привязки. Для более подробной информации о динамических привязках Binder см. this SO question/answer.

В общем, вы обнаружите, что многие удивительные функции SDK WebJobs можно использовать в Azure Functions - наш документ просто должен догнать, чтобы люди знали об этом:)

Еще одно замечание: есть встроенная поддержка для генерации случайных новых идентификаторов для выходов. Например. если вы хотите установить выходной путь blob на test-output/{rand-guid}, система автоматически создаст для вас новый идентификатор. Если это соответствует вашим потребностям, вам не нужно Binder.

using System;
using System.IO;
using System.Net;
using Microsoft.Azure.WebJobs;

public static async Task<HttpResponseMessage> 
       Run(HttpRequestMessage req, Binder binder, TraceWriter log)
{
    log.Verbose($"C# HTTP function processed RequestUri={req.RequestUri}");

    using (var writer = await binder.BindAsync<TextWriter>(
                  new BlobAttribute("test-output/result")))
    {
        writer.Write("Hello World!!");
    }

    return new HttpResponseMessage(HttpStatusCode.OK);
}

Для вашего второго вопроса, если вы хотите условно написать привязку к выходу, просто не присваивайте никакого значения привязке - вывод не должен производиться.