Kurz k JavaScriptu: Nahrání a analýza souboru pomocí Azure Functions a Blob Storage

V tomto kurzu se dozvíte, jak nahrát obrázek do Azure Blob Storage a zpracovat ho pomocí Azure Functions, Počítačové zpracování obrazu a Cosmos DB. Dozvíte se také, jak v rámci tohoto procesu implementovat triggery a vazby funkce Azure Functions. Tyto služby společně analyzují nahraný obrázek, který obsahuje text, extrahují z něj text a pak text uloží do řádku databáze pro pozdější analýzu nebo jiné účely.

Azure Blob Storage je masivně škálovatelné řešení úložiště objektů od Microsoftu pro cloud. Služba Blob Storage je navržená pro ukládání obrázků a dokumentů, streamování mediálních souborů, správu zálohování a archivace dat a mnoho dalšího. Další informace o službě Blob Storage najdete na stránce přehledu.

Upozornění

Tento kurz používá veřejně přístupné úložiště ke zjednodušení procesu dokončení tohoto kurzu. Anonymní veřejný přístup představuje bezpečnostní riziko. Zjistěte, jak toto riziko napravit.

Azure Cosmos DB je plně spravovaná databáze NoSQL a relační databáze pro vývoj moderních aplikací.

Azure Functions je počítačové řešení bez serveru, které umožňuje psát a spouštět malé bloky kódu jako vysoce škálovatelné funkce řízené událostmi bez serveru. Další informace o Azure Functions najdete na stránce přehledu.

V tomto kurzu získáte informace o těchto tématech:

  • Nahrání obrázků a souborů do služby Blob Storage
  • Použití triggeru události funkce Azure Functions ke zpracování dat nahraných do služby Blob Storage
  • Použití služeb Azure AI k analýze obrázku
  • Zápis dat do služby Cosmos DB pomocí výstupních vazeb funkce Azure Functions

Diagram architektury znázorňující objekt blob obrázku se přidá do služby Blob Storage a pak se analyzuje funkcí Azure s analýzou vloženou do cosmos DB.

Požadavky

Vytvoření účtu úložiště a kontejneru

Prvním krokem je vytvoření účtu úložiště, který bude obsahovat nahraná data objektů blob, což v tomto scénáři budou obrázky obsahující text. Účet úložiště nabízí několik různých služeb, ale tento kurz využívá pouze službu Blob Storage.

  1. V editoru Visual Studio Code stisknutím klávesy Ctrl + Shift + P otevřete paletu příkazů.

  2. Vyhledejte Azure Storage: Vytvořit účet úložiště (upřesnit).

  3. K vytvoření prostředku úložiště použijte následující tabulku.

    Nastavení Hodnota
    Název Zadejte msdocsstoragefunction nebo něco podobného.
    Skupina prostředků Vytvořte skupinu prostředků, msdocs-storage-function kterou jste vytvořili dříve.
    Statické hostování webů No.
  4. V editoru Visual Studio Code vyberte Shift + Alt + A a otevřete Azure Explorer.

  5. Rozbalte část Úložiště , rozbalte uzel předplatného a počkejte na vytvoření prostředku.

Vytvoření kontejneru v editoru Visual Studio Code

  1. Stále v Azure Exploreru s nalezeným novým prostředkem úložiště rozbalte prostředek a zobrazte uzly.
  2. Klikněte pravým tlačítkem na Kontejnery objektů blob a vyberte Vytvořit kontejner objektů blob.
  3. Zadejte název images. Tím se vytvoří privátní kontejner.

Změna z privátního kontejneru na veřejný v Azure Portal

Tento postup očekává veřejný kontejner. Pokud chcete změnit konfiguraci, proveďte změnu v Azure Portal.

  1. V Azure Exploreru klikněte pravým tlačítkem na prostředek úložiště a vyberte Otevřít na portálu.
  2. V části Úložiště dat vyberte Kontejnery.
  3. Najděte kontejner imagesa na konci řádku vyberte ... tři tečky.
  4. Vyberte Změnit úroveň přístupu.
  5. Vyberte Objekt blob (anonymní přístup pro čtení pouze pro objekty blob ) a pak vyberte OK.
  6. Vraťte se do editoru Visual Studio Code.

Načtení připojovacího řetězce v editoru Visual Studio Code

  1. V editoru Visual Studio Code vyberte Shift + Alt + A a otevřete Azure Explorer.
  2. Klikněte pravým tlačítkem na prostředek úložiště a vyberte Kopírovat připojovací řetězec.
  3. Někam ho vložte, abyste ho mohli použít později.
  4. Poznamenejte si také název msdocsstoragefunction účtu úložiště, abyste ho mohli použít později.

Vytvoření služby Azure AI Vision

Dále vytvořte účet služby Azure AI Vision, který bude zpracovávat naše nahrané soubory. Vision je součástí služeb Azure AI a nabízí různé funkce pro extrakci dat z obrázků. Další informace o službě Azure AI Vision najdete na stránce s přehledem.

  1. Na panelu hledání v horní části portálu vyhledejte Počítač a vyberte výsledek s popiskem Počítačové zpracování obrazu.

  2. Na stránce Počítačové zpracování obrazu vyberte + Vytvořit.

  3. Na stránce Vytvořit Počítačové zpracování obrazu zadejte následující hodnoty:

    • Předplatné: Zvolte požadované předplatné.
    • Skupina prostředků: Použijte msdocs-storage-function skupinu prostředků, kterou jste vytvořili dříve.
    • Oblast: Vyberte oblast, která je k vám nejblíže.
    • Název: Zadejte název msdocscomputervision.
    • Cenová úroveň: Pokud je dostupná, zvolte Free , jinak zvolte Standard S1.
    • Pokud souhlasíte s podmínkami, zaškrtněte políčko Oznámení o odpovědné AI .

    Snímek obrazovky znázorňující, jak vytvořit novou službu Počítačové zpracování obrazu

  4. V dolní části vyberte Zkontrolovat a vytvořit . Azure chvíli trvá, než ověří informace, které jste zadali. Po ověření nastavení zvolte Vytvořit a Azure začne zřizovat službu Počítačové zpracování obrazu, což může chvíli trvat.

  5. Po dokončení operace vyberte Přejít k prostředku.

Načtení Počítačové zpracování obrazu klíčů

Dále musíme najít tajný klíč a adresu URL koncového bodu pro službu Počítačové zpracování obrazu, která se má používat v naší aplikaci Funkcí Azure.

  1. Na stránce přehledu Počítačové zpracování obrazu vyberte Klíče a koncový bod.

  2. Na stránce Klíče a koncový bod zkopírujte hodnotu Klíč 1 a hodnoty EndPoint a vložte je někam, abyste je mohli použít později. Koncový bod by měl být ve formátu https://YOUR-RESOURCE-NAME.cognitiveservices.azure.com/

Snímek obrazovky znázorňující, jak načíst klíče a koncový bod adresy URL pro službu Počítačové zpracování obrazu

Vytvoření účtu služby Cosmos DB

Vytvořte účet služby Cosmos DB pro ukládání analýzy souborů. Azure Cosmos DB je plně spravovaná databáze NoSQL a relační databáze pro vývoj moderních aplikací. Další informace o službě Cosmos DB a jejích rozhraních API podpory pro několik různých oborových databází.

I když tento kurz určuje rozhraní API při vytváření prostředku, vazby funkcí Azure pro Službu Cosmos DB se konfigurují stejným způsobem pro všechna rozhraní API služby Cosmos DB.

  1. Na panelu hledání v horní části portálu vyhledejte Azure Cosmos DB a vyberte výsledek.

  2. Na stránce Azure Cosmos DB vyberte + Vytvořit. V seznamu možností rozhraní API vyberte Azure Cosmos DB for NoSQL .

  3. Na stránce Vytvořit službu Cosmos DB zadejte následující hodnoty:

    • Předplatné: Zvolte požadované předplatné.
    • Skupina prostředků: Použijte msdocs-storage-function skupinu prostředků, kterou jste vytvořili dříve.
    • Oblast: Vyberte stejnou oblast jako vaše skupina prostředků.
    • Název: Zadejte název msdocscosmosdb.
    • Cenová úroveň: Pokud je dostupná, zvolte Free , jinak zvolte Standard S1.
  4. V dolní části vyberte Zkontrolovat a vytvořit . Azure chvíli potrvá, než ověří informace, které jste zadali. Po ověření nastavení zvolte Vytvořit a Azure začne zřizovat službu Počítačové zpracování obrazu, což může chvíli trvat.

  5. Po dokončení operace vyberte Přejít k prostředku.

  6. Vyberte Data Explorer pak vyberte Nový kontejner.

  7. Vytvořte novou databázi a kontejner s následujícím nastavením:

    • Vytvořte nové ID databáze: StorageTutorial.
    • Zadejte nové ID kontejneru: analysis.
    • Zadejte klíč oddílu: /type.
  8. Ponechte zbývající výchozí nastavení a vyberte OK.

Získání připojovacího řetězce služby Cosmos DB

Získejte připojovací řetězec pro účet služby Cosmos DB, který chcete použít v naší aplikaci funkcí Azure.

  1. Na stránce Přehled služby Cosmos DB vyberte Klíče.

  2. Na stránce Klíče zkopírujte primární připojovací řetězec , abyste ho mohli použít později.

Stažení a konfigurace ukázkového projektu

Kód funkce Azure použitý v tomto kurzu najdete v tomto úložišti GitHub v JavaScript-v4 podadresáři. Projekt můžete také naklonovat pomocí následujícího příkazu.

git clone https://github.com/Azure-Samples/msdocs-storage-bind-function-service.git \
cd msdocs-storage-bind-function-service/javascript-v4 \
code .

Ukázkový projekt provádí následující úkoly:

  • Načte proměnné prostředí pro připojení k účtu úložiště, Počítačové zpracování obrazu a službě Cosmos DB.
  • Přijme nahraný soubor jako parametr objektu blob.
  • Analyzuje objekt blob pomocí služby Počítačové zpracování obrazu.
  • Vloží analyzovaný text obrázku jako objekt JSON do služby Cosmos DB pomocí výstupních vazeb.

Po stažení a otevření projektu je potřeba pochopit několik základních konceptů:

Koncepce Účel
Funkce Funkce Azure Functions je definovaná kódem funkce i vazbami. Jsou v souboru ./src/functions/process-blobs.js.
Triggery a vazby Triggery a vazby označují, že data, která se očekávají do funkce nebo z funkce a která služba bude tato data odesílat nebo přijímat.

Triggery a vazby použité v tomto kurzu k urychlení procesu vývoje odstraněním nutnosti psát kód pro připojení ke službám.

Trigger vstupního objektu blob služby Storage

Kód, který určuje, že se funkce aktivuje při nahrání objektu blob do kontejneru images . Funkce se aktivuje u libovolného názvu objektu blob, včetně hierarchických složek.


// ...preceding code removed for brevity

app.storageBlob('process-blob-image', { 
    path: 'images/{name}',                // Storage container name: images, Blob name: {name}
    connection: 'StorageConnection',      // Storage account connection string
    handler: async (blob, context) => {

// ... function code removed for brevity
  • app.storageBlob – aktivační událost vstupu objektu blob služby Storage se používá k vytvoření vazby funkce k události nahrávání ve službě Blob Storage. Trigger má dva požadované parametry:
    • path: Cesta, kterou trigger sleduje pro události. Cesta obsahuje názevimages kontejneru a proměnnou nahrazení názvu objektu blob. Tento název objektu blob se načte name z vlastnosti .
    • {name}: Název nahraného objektu blob. Použití parametru blob je název parametru pro objekt blob přicházející do funkce. Neměňte hodnotu blob.
    • connection: Připojovací řetězec účtu úložiště. Hodnota StorageConnection se při místním vývoji shoduje s názvem v local.settings.json souboru.

Výstup triggeru Cosmos DB

Po dokončení funkce použije vrácený objekt jako data pro vložení do služby Cosmos DB.


// ... function definition ojbect
app.storageBlob('process-blob-image', { 
    
        // removed for brevity    
        
        // Data to insert into Cosmos DB
        const id = uuidv4().toString();
        const analysis = await analyzeImage(blobUrl);
        
        // `type` is the partition key 
        const dataToInsertToDatabase = {
                id,
                type: 'image',
                blobUrl,
                blobSize: blob.length,
                analysis,
                trigger: context.triggerMetadata
            }

        return dataToInsertToDatabase;
    }),

    // Output binding for Cosmos DB
    return: output.cosmosDB({
        connection: 'CosmosDBConnection',
        databaseName:'StorageTutorial',
        containerName:'analysis'
    })
});

Pro kontejner v tomto článku jsou následující požadované vlastnosti:

  • id: ID požadované pro službu Cosmos DB k vytvoření nového řádku.

  • /type: Byl vytvořen klíč oddílu zadaný kontejnerem.

  • output.cosmosDB – Trigger výstupu služby Cosmos DB slouží k vložení výsledku funkce do služby Cosmos DB.

    • connection: Připojovací řetězec účtu úložiště. Hodnota StorageConnection odpovídá názvu v local.settings.json souboru.
    • databaseName: Databáze Cosmos DB, ke které se chcete připojit.
    • containerName: Název tabulky pro zápis hodnoty analyzovaného textu obrázku vrácené funkcí. Tabulka již musí existovat.

Kód funkce Azure Functions

Následuje úplný kód funkce.

const { app, input, output } = require('@azure/functions');
const { v4: uuidv4 } = require('uuid');
const { ApiKeyCredentials } = require('@azure/ms-rest-js');
const { ComputerVisionClient } = require('@azure/cognitiveservices-computervision');
const sleep = require('util').promisify(setTimeout);

const STATUS_SUCCEEDED = "succeeded";
const STATUS_FAILED = "failed"

const imageExtensions = ["jpg", "jpeg", "png", "bmp", "gif", "tiff"];

async function analyzeImage(url) {

    try {

        const computerVision_ResourceKey = process.env.ComputerVisionKey;
        const computerVision_Endpoint = process.env.ComputerVisionEndPoint;

        const computerVisionClient = new ComputerVisionClient(
            new ApiKeyCredentials({ inHeader: { 'Ocp-Apim-Subscription-Key': computerVision_ResourceKey } }), computerVision_Endpoint);

        const contents = await computerVisionClient.analyzeImage(url, {
            visualFeatures: ['ImageType', 'Categories', 'Tags', 'Description', 'Objects', 'Adult', 'Faces']
        });

        return contents;

    } catch (err) {
        console.log(err);
    }
}
app.storageBlob('process-blob-image', { 
    path: 'images/{name}',
    connection: 'StorageConnection',
    handler: async (blob, context) => {

        context.log(`Storage blob 'process-blob-image' url:${context.triggerMetadata.uri}, size:${blob.length} bytes`);

        const blobUrl = context.triggerMetadata.uri;
        const extension = blobUrl.split('.').pop();

        if(!blobUrl) {
            // url is empty
            return;
        } else if (!extension || !imageExtensions.includes(extension.toLowerCase())){
            // not processing file because it isn't a valid and accepted image extension
            return;
        } else {
            //url is image
            const id = uuidv4().toString();
            const analysis = await analyzeImage(blobUrl);
            
            // `type` is the partition key 
            const dataToInsertToDatabase = {
                    id,
                    type: 'image',
                    blobUrl,
                    blobSize: blob.length,
                    ...analysis,
                    trigger: context.triggerMetadata
                }

            return dataToInsertToDatabase;
        }

        
    },
    return: output.cosmosDB({
        connection: 'CosmosDBConnection',
        databaseName:'StorageTutorial',
        containerName:'analysis'
    })
});

Tento kód také načte základní konfigurační hodnoty z proměnných prostředí, jako je připojovací řetězec služby Blob Storage a klíč Počítačové zpracování obrazu. Tyto proměnné prostředí se po nasazení přidají do prostředí funkce Azure Functions.

Výchozí funkce také používá druhou metodu s názvem AnalyzeImage. Tento kód používá koncový bod adresy URL a klíč účtu Počítačové zpracování obrazu k vytvoření požadavku na Počítačové zpracování obrazu zpracování obrázku. Požadavek vrátí veškerý text zjištěný na obrázku. Tento text se zapíše do služby Cosmos DB pomocí odchozí vazby.

Konfigurace místního nastavení

Pokud chcete projekt spustit místně, zadejte do souboru proměnné ./local.settings.json prostředí. Do zástupných hodnot zadejte hodnoty, které jste si uložili dříve při vytváření prostředků Azure.

Kód funkce Azure Functions sice běží místně, ale místo použití místních emulátorů se připojuje ke cloudovým službám služby Storage.

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AzureWebJobsStorage": "",
    "StorageConnection": "STORAGE-CONNECTION-STRING",
    "StorageAccountName": "STORAGE-ACCOUNT-NAME",
    "StorageContainerName": "STORAGE-CONTAINER-NAME",
    "ComputerVisionKey": "COMPUTER-VISION-KEY",
    "ComputerVisionEndPoint":  "COMPUTER-VISION-ENDPOINT",
    "CosmosDBConnection": "COSMOS-DB-CONNECTION-STRING"
  }
}

Vytvoření aplikace Azure Functions

Teď jste připraveni nasadit aplikaci do Azure pomocí rozšíření Visual Studio Code.

  1. V editoru Visual Studio Code vyberte Shift + Alt + A a otevřete průzkumníka Azure .

  2. V části Functions vyhledejte a klikněte pravým tlačítkem na předplatné a vyberte Create Function App in Azure (Advanced) (Vytvořit aplikaci funkcí v Azure).

  3. K vytvoření prostředku funkce použijte následující tabulku.

    Nastavení Hodnota
    Název Zadejte msdocsprocessimage nebo něco podobného.
    Zásobník modulu runtime Vyberte Node.js verzi LTS .
    Programovací model Vyberte v4.
    OS Vyberte Linux.
    Skupina prostředků Zvolte skupinu prostředků, msdocs-storage-function kterou jste vytvořili dříve.
    Umístění Vyberte stejnou oblast jako vaše skupina prostředků.
    Typ plánu Vyberte Spotřeba.
    Azure Storage Vyberte účet úložiště, který jste vytvořili dříve.
    Application Insights Prozatím přeskočte.
  4. Azure zřídí požadované prostředky, což bude chvíli trvat.

Nasazení aplikace Azure Functions

  1. Po dokončení předchozího procesu vytváření prostředků klikněte v Průzkumníku Azure pravým tlačítkem na nový prostředek v části Funkce a vyberte Nasadit do aplikace funkcí.
  2. Pokud se zobrazí Dotaz Opravdu chcete nasadit... vyberte Nasadit.
  3. Po dokončení procesu se zobrazí oznámení s volbou, která zahrnuje nastavení nahrávání. Tuto možnost vyberte. Tím se zkopírují hodnoty ze souboru local.settings.json do aplikace funkcí Azure. Pokud oznámení zmizelo dříve, než jste ho mohli vybrat, pokračujte k další části.

Přidání nastavení aplikace pro úložiště a Počítačové zpracování obrazu

Pokud jste v oznámení vybrali Nastavení nahrávání , tuto část přeskočte.

Funkce Azure Functions se úspěšně nasadila, ale zatím se nemůže připojit k našemu účtu Storage a Počítačové zpracování obrazu služby. Správné klíče a připojovací řetězce musí být nejprve přidány do nastavení konfigurace aplikace Azure Functions.

  1. V průzkumníku Azure v části Funkce najděte svůj prostředek, klikněte pravým tlačítkem na Nastavení aplikace a vyberte Přidat nové nastavení.

  2. Zadejte nové nastavení aplikace pro následující tajné kódy. Zkopírujte a vložte tajné hodnoty z místního projektu do local.settings.json souboru .

    Nastavení
    StorageConnection
    název_účtu_úložiště
    Název kontejneru úložiště
    ComputerVisionKey
    ComputerVisionEndPoint
    CosmosDBConnection

Všechny požadované proměnné prostředí pro připojení funkce Azure k různým službám jsou teď na místě.

Nahrání obrázku do služby Blob Storage

Teď jste připraveni otestovat naši aplikaci! Do kontejneru můžete nahrát objekt blob a pak ověřit, že se text v obrázku uložil do služby Cosmos DB.

  1. V průzkumníku Azure v editoru Visual Studio Code v části Storage vyhledejte a rozbalte prostředek úložiště .
  2. Rozbalte Kontejnery objektů blob , klikněte pravým tlačítkem na název imageskontejneru a pak vyberte Nahrát soubory.
  3. Několik ukázkových obrázků, které jsou součástí složky images , najdete v kořenovém adresáři ukázkového projektu ke stažení, nebo můžete použít vlastní.
  4. Pro cílový adresář přijměte výchozí hodnotu /.
  5. Počkejte, až se soubory nahrají a zobrazí se v kontejneru.

Zobrazení analýzy textu obrázku

Dále můžete ověřit, že nahrávání aktivovalo funkci Azure a že text na obrázku byl správně analyzován a uložen do služby Cosmos DB.

  1. V nástroji Visual Studio Code v Průzkumníku Azure v uzlu Azure Cosmos DB vyberte prostředek a rozbalte ho a vyhledejte svou databázi StorageTutorial.

  2. Rozbalte uzel databáze.

  3. Teď by měl být k dispozici kontejner analýzy . Výběrem uzlu Dokumenty kontejneru zobrazte náhled dat uvnitř. Měla by se zobrazit položka pro zpracovaný text obrázku nahraného souboru.

    {
        "id": "3cf7d6f0-a362-421e-9482-3020d7d1e689",
        "type": "image",
        "blobUrl": "https://msdocsstoragefunction.blob.core.windows.net/images/presentation.png",
        "blobSize": 1383614,
        "analysis": {  ... details removed for brevity ...
            "categories": [],
            "adult": {},
            "imageType": {},
            "tags": [],
            "description": {},
            "faces": [],
            "objects": [],
            "requestId": "eead3d60-9905-499c-99c5-23d084d9cac2",
            "metadata": {},
            "modelVersion": "2021-05-01"
        },
        "trigger": { 
            "blobTrigger": "images/presentation.png",
            "uri": "https://msdocsstorageaccount.blob.core.windows.net/images/presentation.png",
            "properties": {
                "lastModified": "2023-07-07T15:32:38+00:00",
                "createdOn": "2023-07-07T15:32:38+00:00",
                "metadata": {},
                ... removed for brevity ...
                "contentLength": 1383614,
                "contentType": "image/png",
                "accessTier": "Hot",
                "accessTierInferred": true,
            },
            "metadata": {},
            "name": "presentation.png"
        },
        "_rid": "YN1FAKcZojEFAAAAAAAAAA==",
        "_self": "dbs/YN1FAA==/colls/YN1FAKcZojE=/docs/YN1FAKcZojEFAAAAAAAAAA==/",
        "_etag": "\"7d00f2d3-0000-0700-0000-64a830210000\"",
        "_attachments": "attachments/",
        "_ts": 1688743969
    }
    

Gratulujeme! Úspěšně jste zpracovali obrázek, který se nahrál do služby Blob Storage pomocí Azure Functions a Počítačové zpracování obrazu.

Řešení potíží

Následující tabulka vám pomůže s řešením potíží během tohoto postupu.

Problém Řešení
await computerVisionClient.read(url); s chybou Only absolute URLs are supported Ujistěte se, že je váš ComputerVisionEndPoint koncový bod ve formátu https://YOUR-RESOURCE-NAME.cognitiveservices.azure.com/.

Vyčištění prostředků

Pokud tuto aplikaci nebudete dál používat, můžete prostředky, které jste vytvořili, odstranit odebráním skupiny prostředků.

  1. V Průzkumníku Azure vyberte Skupiny prostředků .
  2. V seznamu vyhledejte skupinu prostředků a klikněte na ni msdocs-storage-function pravým tlačítkem.
  3. Vyberte Odstranit. Proces odstranění skupiny prostředků může trvat několik minut.

Ukázka kódu

Další kroky