Создание имен для выходных BLOB-объектов для функции Azure
Используя параметры привязки для функции Azure, можно указать имя большого двоичного объекта, который будет записан, на основе параметров, полученных из триггера (например, сообщение очереди, которое вызвало функцию); документация показывает пример этого.
Мой вопрос: каков наилучший способ справиться со случаем, когда имя BLOB-объекта заранее неизвестно, но фактически рассчитывается как часть выполнения функции?
И связанные: что делать, если функция может генерировать или не генерировать выходной BLOB-объект (или несколько выходных BLOB-объектов!), Основываясь на результатах его вычисления?
Насколько я сейчас понимаю, механизм привязки функции Azure не очень помогает в этих случаях, и самый простой подход - обратиться к сборке, которая делает BLOB-объект Azure "классическим способом". Но есть ли более идиоматический способ?
1 ответ
На самом деле вы уже можете это сделать в C# Azure Functions, и у нас есть элемент отслеживания в нашем репо, чтобы включить это и для функций Node.js. Мы скоро к этому вернемся.
Ниже приведен пример рабочей функции, которая связывается с BLOB-объектом с путем, указанным во время выполнения. Поскольку под крышками функции Azure встроены в Azure WebJobs SDK, вы заметите, что это зависит от использования WebJobs SDK. Binder
что-то, с чем вы, возможно, не знакомы. Пожалуйста, смотрите SDK WebJobs для получения дополнительной документации по IBinder
/Binder
, В SDK WebJobs декларативные атрибуты используются для привязок (например, QueueAttribute
/TableAttribute
/BlobAttribute
, так далее.). Вы можете указать все это во время выполнения через Binder
, В функциях Azure мы используем внешние метаданные для описания привязок, но в этом сложном сценарии у вас есть гибрид. Обратите внимание, что при использовании Binder
нет соответствующей привязки в function.json
, Для более подробной информации о Binder
динамические привязки видят этот ТАК вопрос / ответ.
В общем, вы обнаружите, что многие удивительные функции WebJobs SDK можно использовать в функциях Azure - нашему документу просто нужно наверстать упущенное, чтобы люди знали об этом:)
Еще одна вещь, на которую следует обратить внимание: есть встроенная поддержка генерации случайных новых идентификаторов для выходных данных. Например, если вам нужно установить путь к выходному блобу в 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);
}
Что касается вашего второго вопроса, если вы хотите условно записать в выходную привязку, просто не присваивайте привязке какое-либо значение - вывод не должен производиться.