V předchozím článku jsme si popsali co a k čemu Azure Functions jsou, jak je vytvořit nebo jak správa functions na portále Azure vypadá. Dnes si ukážeme, jak vytvořit funkci, která bude reagovat na změny v blob storage a nebo jejím výstupem bude nový blob.
Blob storage Trigger
Vytvoříme si novou funkci, kde je připraveno množství templatů. Vybereme “BlobTrigger-CSharp”.
V průvodci je potřeba zvolit Storage account connection. Já už ho mám předem připravený, pokud nemáte, jednoduše si ho vytvoříte. Do pole Path je třeba zadat cestu ke kontejneru.
Azure vygeneruje následující kód:
public static void Run(Stream myBlob, string name, TraceWriter log)
{
log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}
Já jsem v Path poli triggeru smazal “{name}”, proto musíme smazat parameter name I v metodě. Změníme kód tak, aby přečetl obsah blobu.
using System;
public async static Task Run(Stream myBlob, TraceWriter log)
{
log.Info($"C# Blob trigger function. Content of blob is:");
using(var reader = new StreamReader(myBlob))
{
log.Info(reader.ReadToEnd());
}
}
Po nahrání připraveného souboru do blobu je vidět v logu tento výstup:
2017-03-19T13:25:08.535 Function started (Id=96e41c5a-a8bb-4b2f-a5a4-85b45eb51a3a)
2017-03-19T13:25:08.535 C# Blob trigger function. Content of blob is:
2017-03-19T13:25:08.550 Hello world!
2017-03-19T13:25:08.550 Function completed (Success, Id=96e41c5a-a8bb-4b2f-a5a4-85b45eb51a3a)
Do funkce vstupuje blob jako Stream, co když nám to ale nestačí? Functions, v tomto případě BlobTrigger, nám umožňují úpravu vstupních parametrů a jejich typů. V dokumentaci najdete rozsáhlý popis možností, nám pro potřeby článku postačí vědět, že můžeme použít ICloudBlob. Upravíme náš kód do následující varianty:
#r "Microsoft.WindowsAzure.Storage"
using System;
using Microsoft.WindowsAzure.Storage.Blob;
public async static Task Run(ICloudBlob myBlob, TraceWriter log)
{
log.Info($"C# Blob trigger function. Content of blob {myBlob.Name} is:");
using(var reader = new StreamReader(await myBlob.OpenReadAsync()))
{
log.Info(reader.ReadToEnd());
}
}
Nejdříve si nalinkujeme knihovnu Microsoft.WindowsAzure.Storage a následně přidáme using potřebného namespacu. V prvním volání log.Info() přidáme název blobu, následně přidáme kód pro vyčtení obsahu. Výpis se příliš lišit nebude, ale díky rozhraní ICloudBlob máme celou řadu nových možností jak s blobem manipulovat.
Blob jako výstup funkce
V této části navážeme na předchozí kód a ukážeme si, jak vytvořit nový blob jako výstup funkce. Vytvořený blob bude vracet obsah původního blobu doplněný o informace o zpracování. Nejdříve je potřeba na záložce Integrate nastavit výstup. Klikneme na tlačítko “New Output” a vybereme “Azure Blob Storage”. Opět je třeba nastavit Storage account connection a Path, do které vložím “outputblob/output.txt”. Outputblob je opět předem připravený kontejner. Pokud bychom zvolili původní kontejner “functionblob”, funkce by se volala neustále znovu, protože výstupem je nový blob, který spustí trigger a tak pořád dokola. Výstup můžeme předávat formou parametru, nebo jako návratovou hodnotu. Já zvolím návratovou hodnotu.
#r "Microsoft.WindowsAzure.Storage"
using System;
using Microsoft.WindowsAzure.Storage.Blob;
public async static Task<string> Run(ICloudBlob myBlob, TraceWriter log)
{
log.Info($"The following blob has triggered the function: {myBlob.Name}");
log.Info("Content of the blob is:");
using(var reader = new StreamReader(await myBlob.OpenReadAsync()))
{
var content = reader.ReadToEnd();
log.Info(content);
return content + Environment.NewLine + $"{myBlob.Name} processed by function at {DateTime.Now}";
}
}
V nastavení outputu jsme uvedli cestu včetně názvu, proto můžeme vrátít string, který se zapíše do výstupního blobu. Po opětovném nahrání souboru blob.txt do functionblob kontejneru se funkce spustí, a do kontejneru outputblob vloží output.txt s očekávaným obsahem.
Hello world!
blob.txt processed by function at 3/19/2017 2:09:49 PM
Podobně jako output je možné nastavit také input, který vstupuje jako parametr do metody Run. Inputů a outputů je možné předávat více. A v čem se liší input od triggeru? Můžete například vytvořit funkci, kterou chcete spouštět periodicky, ale potřebujete na vstupu mít blob. V tomto případě můžete použít kombinaci TimerTriggeru a BlobStorage jako input.
Závěr
V tomto článku jsme si ukázali práci s bloby. V první části jsme reagovali na změnu v kontejneru a vypsali obsah nového blobu. V druhé části jsme vzali obsahu načteného blobu, přidali informace o zpracování a poslali na výstup jako nový blob v jiném kontejneru. Příště si ukážeme, jak volat funkci pomocí Http requestu.