Filip Herudek

Vývojářský blog Filipa Herudka



Podle kategorie

Azure functions – blob storage

Filip Herudek       22. 3. 2017       Azure       2266 zobrazení

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”.

image

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());
    }
}

image

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.

image

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.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback