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 avbildning till Azure Blob Storage och bearbetar 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 med mera. Du kan läsa mer om Blob Storage på översiktssidan.

Varning

Den här självstudien är avsedd för snabb implementering och följer därför inte kraven för säker som standard. Om du vill veta mer om det här scenariot med ett säkert som standardmål går du till Säkerhetsöverväganden.

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älvstudien får du lära dig att:

  • Ladda upp bilder och filer till Blob Storage
  • Använda en Azure Function-hä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 hjälp av Azure Function-utdatabindningar

Arkitekturdiagram som visar en bildblob läggs till i Blob Storage och analyseras sedan 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 innehåller de uppladdade blobdata, som i det här scenariot är 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ärdar 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. I Azure Explorer med den nya lagringsresursen hittad expanderar du resursen för att se noderna.
  2. Högerklicka på Blobcontainrar och välj Skapa blobcontainer.
  3. Ange namnet images. Då skapas 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 imagesoch välj ... (ellipsen) i slutet av raden.
  4. Välj Ändra åtkomstnivå.
  5. Välj Blob (endast anonym läsåtkomst för blobar och välj sedan Ok.
  6. Gå tillbaka till Visual Studio Code.

Hämta anslutningssträng 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 där du kan använda den senare.
  4. Anteckna även namnet på lagringskontot msdocsstoragefunction som ska användas senare.

Skapa Azure AI Vision-tjänsten

Skapa sedan azure AI Vision-tjänstkontot 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 Ansvarig AI-meddelande 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. Azure tar en stund att verifiera den information som du angav. När inställningarna har verifierats väljer du Skapa och Azure börjar 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 nycklar

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. På sidan Visuellt innehåll översikt väljer du Nycklar och slutpunkt.

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

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

Skapa ett Cosmos DB-tjänstkonto

Skapa Cosmos DB-tjänstkontot för att lagra analysen av filer. 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-val.

  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 resursgruppen.
    • 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 och Azure börjar 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 Datautforskaren 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äng

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

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

  2. På sidan Nycklar kopierar du den primära anslutningssträngen som ska användas senare.

Ladda ned och konfigurera exempelprojektet

Koden för Den Azure-funktion 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 tjänsten Visuellt innehåll
  • 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ösarna och bindningarna anger att data, som förväntas till eller från 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 påskynda utvecklingsprocessen genom att ta bort behovet av att skriva kod för att ansluta till tjänster.

Utlösare för indatalagringsblob

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 egenskapen name .
    • {name}: Namnet på den uppladdade bloben. Användningen av blob är parameternamnet för bloben som kommer in i funktionen. Ändra inte värdet blob.
    • connection: Lagringskontots anslutningssträng. 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 object
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: Lagringskontots anslutningssträng. 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 parsade 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 bloblagringsnyckeln anslutningssträng och Visuellt innehåll. Dessa miljövariabler läggs till i Azure-funktionsmiljön när den 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 bilden. Begäran returnerar all text som identifieras i bilden. Den här texten skrivs till Cosmos DB med hjälp av den utgående bindningen.

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 Lagring 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ällning Värde
    Namn Ange msdocsprocessimage eller något liknande.
    Körningsstack Välj en Node.js LTS-version .
    Programmeringsmodell Välj v4.
    OS Välj Linux.
    Resursgrupp Välj den msdocs-storage-function resursgrupp som du skapade tidigare.
    Plats Välj samma region som resursgruppen.
    Plantyp Välj Förbrukning.
    Azure Storage Välj det lagringskonto som du skapade tidigare.
    Application Insights Hoppa över tills vidare.
  4. Azure etablerar de begärda resurserna, vilket tar en stund att slutföra.

Distribuera Azure Functions-appen

  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 Vill du 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 din local.settings.json-fil 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äng 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ällning
    StorageConnection
    StorageAccountName
    StorageContainerName
    ComputerVisionKey
    ComputerVisionEndPoint
    CosmosDBConnection

Alla miljövariabler som krävs 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 accepterar du standardvärdet , /.
  5. Vänta tills filerna har laddats upp och listats i containern.

Visa textanalys av bild

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

  1. I Visual Studio Code går du till Azure Explorer under Noden Azure Cosmos DB och 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 nod Dokument 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 Åtgärd
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/.

Säkerhetsfrågor

Den här lösningen, som en nybörjarkurs, visar inte säkra metoder som standard. Detta är avsiktligt för att du ska kunna distribuera lösningen. Nästa steg efter den lyckade distributionen är att skydda resurserna. Den här lösningen använder tre Azure-tjänster, var och en har sina egna säkerhetsfunktioner och överväganden för säker konfiguration som standard:

Exempelkod

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. Sök efter 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.