Dela via


JavaScript-självstudie: Ladda upp och analysera en fil med Azure Functions och Blob Storage

I den här självstudien får du lära dig hur du laddar upp en bild för att Azure Blob Storage och bearbeta den med hjälp av Azure Functions, Visuellt innehåll och Cosmos DB. Du får också lära dig hur du implementerar Azure Function-utlösare och bindningar som en del av den här processen. Tillsammans analyserar dessa tjänster en uppladdad bild som innehåller text, extraherar texten ur den och lagrar sedan texten på en databasrad för senare analys eller andra ändamål.

Azure Blob Storage är Microsofts enormt skalbara objektlagringslösning för molnet. Blob Storage är utformat för att lagra bilder och dokument, strömma mediefiler, hantera säkerhetskopierings- och arkivdata och mycket mer. Du kan läsa mer om Blob Storage på översiktssidan.

Varning

Den här självstudien använder offentligt tillgänglig lagring för att förenkla processen för att slutföra den här självstudien. Anonym offentlig åtkomst utgör en säkerhetsrisk. Lär dig hur du åtgärdar den här risken.

Azure Cosmos DB är en fullständigt hanterad NoSQL och relationsdatabas för modern apputveckling.

Azure Functions är en serverlös datorlösning som gör att du kan skriva och köra små kodblock som mycket skalbara, serverlösa, händelsedrivna funktioner. Du kan läsa mer om Azure Functions på översiktssidan.

I den här självstudiekursen får du lära du dig att:

  • Ladda upp bilder och filer till Blob Storage
  • Använda en Azure-funktionshändelseutlösare för att bearbeta data som laddats upp till Blob Storage
  • Använda Azure AI-tjänster för att analysera en bild
  • Skriva data till Cosmos DB med azure-funktionsutdatabindningar

Arkitekturdiagram som visar att en bildblob läggs till i Blob Storage och sedan analyseras av en Azure-funktion, med analysen infogad i en Cosmos DB.

Förutsättningar

Skapa lagringskontot och containern

Det första steget är att skapa lagringskontot som ska innehålla de uppladdade blobdata, som i det här scenariot blir bilder som innehåller text. Ett lagringskonto erbjuder flera olika tjänster, men den här självstudien använder endast Blob Storage.

  1. I Visual Studio Code väljer du Ctrl + Skift + P för att öppna kommandopaletten.

  2. Sök efter Azure Storage: Skapa lagringskonto (avancerat).

  3. Använd följande tabell för att skapa lagringsresursen.

    Inställning Värde
    Namn Ange msdocsstoragefunction eller något liknande.
    Resursgrupp Skapa resursgruppen msdocs-storage-function som du skapade tidigare.
    Statiska webbvärdtjänster Nej.
  4. I Visual Studio Code väljer du Skift + Alt + A för att öppna Azure Explorer.

  5. Expandera avsnittet Lagring , expandera din prenumerationsnod och vänta tills resursen har skapats.

Skapa containern i Visual Studio Code

  1. Expandera resursen för att se noderna i Azure Explorer med den nya Lagringsresursen.
  2. Högerklicka på Blobcontainrar och välj Skapa blobcontainer.
  3. Ange namnet images. Detta skapar en privat container.

Ändra från privat till offentlig container i Azure Portal

Den här proceduren förväntar sig en offentlig container. Om du vill ändra konfigurationen gör du ändringen i Azure Portal.

  1. Högerklicka på lagringsresursen i Azure Explorer och välj Öppna i portalen.
  2. I avsnittet Datalagring väljer du Containrar.
  3. Leta upp containern images, och välj ... (ellipsen) i slutet av raden.
  4. Välj Ändra åtkomstnivå.
  5. Välj Blob (anonym läsåtkomst endast för blobar och välj sedan Ok.
  6. Gå tillbaka till Visual Studio Code.

Hämta anslutningssträngen i Visual Studio Code

  1. I Visual Studio Code väljer du Skift + Alt + A för att öppna Azure Explorer.
  2. Högerklicka på lagringsresursen och välj Kopiera anslutningssträng.
  3. klistra in den någonstans för senare användning.
  4. Anteckna även namnet på lagringskontot msdocsstoragefunction som ska användas senare.

Skapa Tjänsten Azure AI Vision

Skapa sedan det Azure AI Vision-tjänstkonto som ska bearbeta våra uppladdade filer. Vision är en del av Azure AI-tjänster och erbjuder olika funktioner för att extrahera data från bilder. Du kan läsa mer om Azure AI Vision på översiktssidan.

  1. I sökfältet överst i portalen söker du efter Dator och väljer resultatet med etiketten Visuellt innehåll.

  2. På sidan Visuellt innehåll väljer du + Skapa.

  3. På sidan Skapa Visuellt innehåll anger du följande värden:

    • Prenumeration: Välj önskad prenumeration.
    • Resursgrupp: Använd den msdocs-storage-function resursgrupp som du skapade tidigare.
    • Region: Välj den region som är närmast dig.
    • Namn: Ange i namnet msdocscomputervision.
    • Prisnivå: Välj Kostnadsfri om den är tillgänglig, annars väljer du Standard S1.
    • Markera rutan Meddelande om ansvarsfull AI om du godkänner villkoren

    En skärmbild som visar hur du skapar en ny Visuellt innehåll-tjänst.

  4. Välj Granska + skapa längst ned. Det tar en stund för Azure att verifiera den information som du har angett. När inställningarna har verifierats väljer du Skapa så börjar Azure etablera Visuellt innehåll-tjänsten, vilket kan ta en stund.

  5. När åtgärden har slutförts väljer du Gå till resurs.

Hämta Visuellt innehåll-nycklarna

Därefter måste vi hitta den hemliga nyckeln och slutpunkts-URL:en för Visuellt innehåll-tjänsten som ska användas i vår Azure-funktionsapp.

  1. översiktssidan Visuellt innehåll väljer du Nycklar och slutpunkt.

  2. På sidan Nycklar och slutpunkt kopierar du värdet för Key 1 och EndPoint och klistrar in dem någonstans för senare användning. Slutpunkten ska vara i formatet https://YOUR-RESOURCE-NAME.cognitiveservices.azure.com/

En skärmbild som visar hur du hämtar nycklar och URL-slutpunkten för en Visuellt innehåll-tjänst.

Skapa ett Cosmos DB-tjänstkonto

Skapa Cosmos DB-tjänstkontot för att lagra filanalysen. Azure Cosmos DB är en fullständigt hanterad NoSQL- och relationsdatabas för modern apputveckling. Du kan lära dig mer om Cosmos DB och dess support-API:er för flera olika branschdatabaser.

Den här självstudien anger ett API när du skapar resursen, men Azure-funktionsbindningarna för Cosmos DB konfigureras på samma sätt för alla Cosmos DB-API:er.

  1. I sökfältet överst i portalen söker du efter Azure Cosmos DB och väljer resultatet.

  2. På sidan Azure Cosmos DB väljer du + Skapa. Välj Azure Cosmos DB för NoSQL i listan över API-alternativ.

  3. På sidan Skapa Cosmos DB anger du följande värden:

    • Prenumeration: Välj önskad prenumeration.
    • Resursgrupp: Använd den msdocs-storage-function resursgrupp som du skapade tidigare.
    • Region: Välj samma region som din resursgrupp.
    • Namn: Ange i namnet msdocscosmosdb.
    • Prisnivå: Välj Kostnadsfri om den är tillgänglig, annars väljer du Standard S1.
  4. Välj Granska + skapa längst ned. Det tar en stund för Azure att verifiera den information som du har angett. När inställningarna har verifierats väljer du Skapa så börjar Azure etablera Visuellt innehåll-tjänsten, vilket kan ta en stund.

  5. När åtgärden har slutförts väljer du Gå till resurs.

  6. Välj Data Explorer och välj sedan Ny container.

  7. Skapa en ny databas och container med följande inställningar:

    • Skapa nytt databas-ID: StorageTutorial.
    • Ange det nya container-ID:t: analysis.
    • Ange partitionsnyckeln: /type.
  8. Lämna resten av standardinställningarna och välj OK.

Hämta Cosmos DB-anslutningssträngen

Hämta anslutningssträngen för Cosmos DB-tjänstkontot som ska användas i vår Azure-funktionsapp.

  1. översiktssidan för Cosmos DB väljer du Nycklar.

  2. På sidan Nycklar kopierar du den primära anslutningssträngen för senare användning.

Ladda ned och konfigurera exempelprojektet

Koden för Azure-funktionen som används i den här självstudien finns på den här GitHub-lagringsplatsen i underkatalogen JavaScript-v4 . Du kan också klona projektet med hjälp av kommandot nedan.

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

Exempelprojektet utför följande uppgifter:

  • Hämtar miljövariabler för att ansluta till lagringskontot, Visuellt innehåll och Cosmos DB-tjänsten
  • Accepterar den uppladdade filen som en blobparameter
  • Analyserar bloben med hjälp av Visuellt innehåll-tjänsten
  • Infogar den analyserade bildtexten som ett JSON-objekt i Cosmos DB med hjälp av utdatabindningar

När du har laddat ned och öppnat projektet finns det några viktiga begrepp att förstå:

Koncept Syfte
Funktion Azure-funktionen definieras av både funktionskoden och bindningarna. Dessa finns i ./src/functions/process-blobs.js.
Utlösare och bindningar Utlösare och bindningar anger att data, som förväntas till eller ut ur funktionen och vilken tjänst som ska skicka eller ta emot dessa data.

Utlösare och bindningar som används i den här självstudien för att expediera utvecklingsprocessen genom att ta bort behovet av att skriva kod för att ansluta till tjänster.

Storage Blob-utlösare för indata

Koden, som anger att funktionen utlöses när en blob laddas upp till containern images följer. Funktionen utlöses på alla blobnamn, inklusive hierarkiska mappar.


// ...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.storageBlobStorage Blob-indatautlösaren används för att binda funktionen till uppladdningshändelsen i Blob Storage. Utlösaren har två obligatoriska parametrar:
    • path: Sökvägen som utlösaren söker efter händelser. Sökvägen innehåller containernamnetimages och variabelersättningen för blobnamnet. Det här blobnamnet hämtas från name egenskapen .
    • {name}: Namnet på den uppladdade bloben. Användningen av blob är parameternamnet för bloben som kommer till funktionen. Ändra inte värdet blob.
    • connection: Anslutningssträngen för lagringskontot. Värdet StorageConnection matchar namnet i filen när du local.settings.json utvecklar lokalt.

Cosmos DB-utlösare för utdata

När funktionen är klar använder funktionen det returnerade objektet som data för att infoga i 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'
    })
});

För containern i den här artikeln är följande obligatoriska egenskaper:

  • id: det ID som krävs för att Cosmos DB ska kunna skapa en ny rad.

  • /type: partitionsnyckeln som angavs med containern skapades.

  • output.cosmosDBCosmos DB-utdatautlösaren används för att infoga resultatet av funktionen i Cosmos DB.

    • connection: Anslutningssträngen för lagringskontot. Värdet StorageConnection matchar namnet i local.settings.json filen.
    • databaseName: Cosmos DB-databasen att ansluta till.
    • containerName: Namnet på tabellen som ska skriva det tolkade bildtextvärdet som returneras av funktionen. Tabellen måste redan finnas.

Azure-funktionskod

Följande är den fullständiga funktionskoden.

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

Den här koden hämtar även viktiga konfigurationsvärden från miljövariabler, till exempel Blob Storage-anslutningssträngen och Visuellt innehåll nyckel. Dessa miljövariabler läggs till i Azure-funktionsmiljön när de har distribuerats.

Standardfunktionen använder också en andra metod med namnet AnalyzeImage. Den här koden använder URL-slutpunkten och nyckeln för Visuellt innehåll-kontot för att göra en begäran om att Visuellt innehåll för att bearbeta avbildningen. Begäran returnerar all text som identifieras i bilden. Den här texten skrivs till Cosmos DB med hjälp av utgående bindning.

Konfigurera lokala inställningar

Om du vill köra projektet lokalt anger du miljövariablerna i ./local.settings.json filen. Fyll i platshållarvärdena med de värden som du sparade tidigare när du skapade Azure-resurserna.

Även om Azure-funktionskoden körs lokalt ansluter den till molnbaserade tjänster för Storage i stället för att använda några lokala emulatorer.

{
  "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"
  }
}

Skapa Azure Functions app

Nu är du redo att distribuera programmet till Azure med hjälp av ett Visual Studio Code-tillägg.

  1. I Visual Studio Code väljer du Skift + Alt + A för att öppna Azure Explorer.

  2. I avsnittet Funktioner letar du upp och högerklickar på prenumerationen och väljer Skapa funktionsapp i Azure (avancerat).

  3. Använd följande tabell för att skapa funktionsresursen.

    Inställningen Värde
    Namn Ange msdocsprocessimage eller något liknande.
    Körningsstack Välj en Node.js LTS-version .
    Programmeringsmodell Välj v4.
    Operativsystem Välj Linux.
    Resursgrupp Välj den msdocs-storage-function resursgrupp som du skapade tidigare.
    Plats Välj samma region som din resursgrupp.
    Plantyp Välj Förbrukning.
    Azure Storage Välj det lagringskonto som du skapade tidigare.
    Application Insights Hoppa över för tillfället.
  4. Azure etablerar de begärda resurserna, vilket tar en stund att slutföra.

Distribuera Azure Functions app

  1. När den föregående resursskapandeprocessen är klar högerklickar du på den nya resursen i avsnittet Funktioner i Azure Explorer och väljer Distribuera till funktionsapp.
  2. Om du tillfrågas Är du säker på att du vill distribuera... väljer du Distribuera.
  3. När processen är klar visas ett meddelande som ett val, som innehåller uppladdningsinställningar. Välj det alternativet. Detta kopierar värdena från filen local.settings.json till azure-funktionsappen. Om meddelandet försvann innan du kunde välja det fortsätter du till nästa avsnitt.

Lägga till appinställningar för Lagring och Visuellt innehåll

Om du har valt Ladda upp inställningar i meddelandet hoppar du över det här avsnittet.

Azure-funktionen har distribuerats, men den kan inte ansluta till vårt lagringskonto och Visuellt innehåll tjänster ännu. Rätt nycklar och anslutningssträngar måste först läggas till i konfigurationsinställningarna för Azure Functions-appen.

  1. Leta reda på resursen i avsnittet Funktioner i Azure Explorer, högerklicka på Programinställningar och välj Lägg till ny inställning.

  2. Ange en ny appinställning för följande hemligheter. Kopiera och klistra in dina hemliga värden från ditt lokala projekt i local.settings.json filen.

    Inställningen
    StorageConnection
    StorageAccountName
    StorageContainerName
    ComputerVisionKey
    ComputerVisionEndPoint
    CosmosDBConnection

Alla nödvändiga miljövariabler för att ansluta vår Azure-funktion till olika tjänster finns nu på plats.

Ladda upp en avbildning till Blob Storage

Nu är du redo att testa vårt program! Du kan ladda upp en blob till containern och sedan kontrollera att texten i bilden har sparats i Cosmos DB.

  1. I Azure Explorer i Visual Studio Code letar du upp och expanderar lagringsresursen i avsnittet Lagring .
  2. Expandera Blobcontainrar och högerklicka på containernamnet och imagesvälj sedan Ladda upp filer.
  3. Du hittar några exempelbilder som ingår i avbildningsmappen i roten för det nedladdningsbara exempelprojektet, eller så kan du använda en egen.
  4. För målkatalogen godkänner du standardvärdet . /
  5. Vänta tills filerna laddas upp och visas i containern.

Visa textanalys av bilden

Sedan kan du kontrollera att uppladdningen utlöste Azure-funktionen och att texten i bilden har analyserats och sparats i Cosmos DB korrekt.

  1. I Visual Studio Code går du till Azure Explorer, under Azure Cosmos DB-noden, väljer din resurs och expanderar den för att hitta databasen StorageTutorial.

  2. Expandera databasnoden.

  3. En analyscontainer bör nu vara tillgänglig. Välj på containerns dokumentnod för att förhandsgranska data inuti. Du bör se en post för den bearbetade bildtexten i en uppladdad fil.

    {
        "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
    }
    

Grattis! Du lyckades bearbeta en avbildning som laddades upp till Blob Storage med hjälp av Azure Functions och Visuellt innehåll.

Felsökning

Använd följande tabell för att felsöka problem under den här proceduren.

Problem Lösning
await computerVisionClient.read(url); fel med Only absolute URLs are supported Kontrollera att slutpunkten ComputerVisionEndPoint är i formatet https://YOUR-RESOURCE-NAME.cognitiveservices.azure.com/.

Rensa resurser

Om du inte kommer att fortsätta att använda det här programmet kan du ta bort de resurser som du skapade genom att ta bort resursgruppen.

  1. Välj Resursgrupper i Azure Explorer
  2. Leta upp och högerklicka på msdocs-storage-function resursgruppen i listan.
  3. Välj Ta bort. Det kan ta några minuter att ta bort resursgruppen.

Exempelkod

Nästa steg