Azure Storage Account รจ una resource che consente di archiviare in modo flessibile e affidabile unโ€™ampia varietร  di dati, inclusi file, tabelle, code e oggetti binari, in modo scalabile ed economicamente efficiente. รˆ progettata per supportare applicazioni e carichi di lavoro diversificati, offrendo allo stesso tempo una robusta sicurezza e un elevato livello di disponibilitร .

Caratteristiche

  1. Multi-Protocol Support: Una Storage Account di Azure supporta piรน protocolli come HTTP, HTTPS e SMB (Server Message Block), consentendo agli sviluppatori di accedere e gestire i dati in vari modi a seconda delle esigenze dellโ€™applicazione.
  2. Scalabilitร  e Performance: La Storage Account di Azure offre una scalabilitร  incredibile, consentendo di aumentare o diminuire le risorse di archiviazione e di elaborazione in modo dinamico per adattarsi ai cambiamenti nei carichi di lavoro. Ciรฒ assicura alte prestazioni anche con un aumento significativo del traffico dati.
  3. Ridundanza e Affidabilitร : Azure Storage Account garantisce la ridondanza e lโ€™affidabilitร  dei dati mediante la replica automatica delle informazioni tra piรน data center allโ€™interno di una regione o addirittura su diverse regioni. Ciรฒ riduce il rischio di perdita di dati e assicura la disponibilitร  continua.
  4. Sicurezza avanzata: La Storage Account di Azure offre funzionalitร  di sicurezza avanzate come lโ€™autenticazione basata su token, la crittografia dei dati in transito e a riposo, lโ€™accesso condizionale e il controllo degli accessi in base al ruolo (RBAC), garantendo la protezione dei dati sensibili.
  5. Integrazione con Altri Servizi: La Storage Account di Azure si integra senza problemi con altri servizi di Azure, come Azure Functions, Azure Logic Apps, Azure Machine Learning, consentendo la creazione di soluzioni complesse e scalabili.
  6. Tipi di Archiviazione: Azure Storage Account offre diverse opzioni per lโ€™archiviazione dei dati, tra cui:
    • Blob Storage: Per lโ€™archiviazione di oggetti e file di grandi dimensioni.
    • File Storage: Per la condivisione di file in modo semplice e scalabile utilizzando il protocollo SMB.
    • Table Storage: Per lโ€™archiviazione di dati strutturati in una tabella non relazionale.
    • Queue Storage: Per la gestione delle code e la comunicazione asincrona tra i componenti dellโ€™applicazione.
  7. Costi Flessibili: Azure Storage Account offre opzioni di prezzi flessibili, tra cui il pagamento in base al consumo, che consente di pagare solo per le risorse effettivamente utilizzate.
  8. Strumenti di Gestione e Monitoraggio: Azure fornisce strumenti e portali di gestione centralizzati che consentono di monitorare le prestazioni, gestire lโ€™accesso e il controllo degli utenti, nonchรฉ ottimizzare lโ€™utilizzo delle risorse.

Tipologie di container

Allโ€™interno di una Azure Storage Account, รจ possibile creare e gestire diversi tipi di container: i container sono strutture di alto livello utilizzate per organizzare e separare i dati in base ai diversi scopi e utilizzi.

Blob Container

Il Blob Container รจ uno dei tipi di container piรน comuni in Azure Storage. รˆ progettato per archiviare oggetti di grandi dimensioni, noti come โ€œblobโ€ (binary large objects). Questi blob possono essere file di immagini, video, documenti, backup o qualsiasi altro tipo di dati binari. I blob possono essere accessibili tramite HTTP/HTTPS e supportano tre tipi di accesso: pubblico, privato o condiviso con firma dellโ€™account. I blob possono essere organizzati allโ€™interno dei container utilizzando una struttura ad albero di directory.

File Share

Il File Share รจ un tipo di container progettato per consentire la condivisione di file tra diverse macchine virtuali, servizi e applicazioni. Funziona come un sistema di file tradizionale, consentendo lโ€™accesso tramite il protocollo SMB (Server Message Block). รˆ particolarmente utile quando รจ necessario condividere dati tra macchine virtuali, creare un ambiente di condivisione dei file distribuito o supportare applicazioni legacy che richiedono accesso ai file tramite SMB.

Table

Il Table Container รจ un tipo di container utilizzato per lโ€™archiviazione di grandi quantitร  di dati non strutturati, organizzati in tabelle. Ogni tabella puรฒ contenere un numero elevato di entitร  (righe), ognuna con un insieme di proprietร  (colonne). Questa struttura รจ ottimizzata per query veloci e distribuite su grandi volumi di dati. รˆ particolarmente adatto per applicazioni che richiedono un modello di dati flessibile, scalabile e senza schema fisso.

Queue

Il Queue Container รจ un tipo di container utilizzato per implementare code di messaggi. Le code consentono la comunicazione asincrona tra i diversi componenti di unโ€™applicazione. รˆ possibile inserire messaggi in una coda da unโ€™applicazione e elaborarli in modo separato da unโ€™altra. Questo modello รจ ampiamente utilizzato per implementare processi di lavorazione dei messaggi o per garantire la scalabilitร  e la resistenza dei sistemi distribuiti.

Gestione dei container

Per poter creare un container per prima cosa creiamo una risorsa di tipo โ€œStorage Accountโ€, poi andiamo su Container e creiamone uno nuovo. Per fase di test รจ comodo che sia pubblicamente visibile dallโ€™esterno, quindi impostiamo su โ€œallow anonymous usersโ€ a true e creiamolo public.

Url

Ogni container รจ contraddistinto da un URL, che รจ comodo per poterci accedere tramite API. Per accedere allโ€™URL di un Container, una volta creato, andare sulle sue property in questo modo e copiarsi lโ€™url

Script

Questa console application รจ progettata per interagire con un account di archiviazione di Azure attraverso lโ€™utilizzo delle librerie Microsoft.Azure.Storage e Microsoft.Azure.Storage.Blob. Lโ€™utente puรฒ scegliere tra quattro azioni principali: caricare un file, eliminare un file, scaricare un file o uscire dallโ€™applicazione.

  1. Upload File: Consente allโ€™utente di caricare un file nel container denominato โ€œnotesโ€ allโ€™interno dellโ€™account di archiviazione di Azure. Lโ€™utente inserisce il nome e il contenuto del file, che vengono quindi caricati come un blob nel container.
  2. Delete File: Permette allโ€™utente di eliminare un file specifico dal container โ€œnotesโ€ nel suo account di archiviazione di Azure. Lโ€™utente fornisce il nome del file da eliminare, e se esiste, il blob corrispondente viene rimosso dal container.
  3. Download File: Consente allโ€™utente di scaricare un file specifico dal container โ€œnotesโ€ nellโ€™account di archiviazione di Azure. Lโ€™utente fornisce il nome del file da scaricare, e se esiste, il blob corrispondente viene scaricato e salvato sul desktop dellโ€™utente.
  4. Exit: Permette allโ€™utente di uscire dallโ€™applicazione.
using System.Text;  
using Microsoft.Azure.Storage;  
using Microsoft.Azure.Storage.Blob;  
  
// Questa stringa si trova in Resource -> Access Keys -> Connection string  
const string storageConnectionString = "DefaultEndpointsProtocol=https;AccountName=st0r4geaccountt3st;AccountKey=Vy1PPN4c3uqIAcxbcozmn5cHTYKVSy5Bx7sSgRskd5FY+gzPCR2w+yrF9IE2q3ZRzwuyG+EiHO/A+AStwkMXqg==;EndpointSuffix=core.windows.net";  
var exitRequested = false;  
while (!exitRequested)  
{  
    Console.WriteLine("Choose an action:");  
    Console.WriteLine("1. Upload file");  
    Console.WriteLine("2. Delete file");  
    Console.WriteLine("3. Download file");  
    Console.WriteLine("4. Exit");  
    Console.Write("Enter your choice: ");  
  
    if (int.TryParse(Console.ReadLine(), out var choice))  
    {        switch (choice)  
        {            case 1:  
                Console.Write("Enter the file name: ");  
                var fileName = Console.ReadLine();  
  
                Console.Write("Enter the content: ");  
                var content = Console.ReadLine();  
  
                if (fileName != null && content != null)  
                    await UploadTextToBlobAsync(fileName, content);  
                break;  
            case 2:  
                Console.Write("Enter the file name to delete: ");  
                var fileToDelete = Console.ReadLine();  
  
                if (fileToDelete != null)  
                    await DeleteBlobAsync(fileToDelete);  
                break;  
            case 3:  
                Console.Write("Enter the file name to download: ");  
                var fileToDownload = Console.ReadLine();  
  
                if (fileToDownload != null)  
                {                    var desktopPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop),  
                        fileToDownload);                    await DownloadBlobAsync(fileToDownload, desktopPath);  
                }  
                break;  
            case 4:  
                exitRequested = true;  
                break;  
            default:  
                Console.WriteLine("Invalid choice. Please choose 1, 2 or 3.");  
                break;  
        }    }    else  
    {  
        Console.WriteLine("Invalid input. Please enter a valid numeric choice.");  
    }
}  
  
return;  
  
  
async Task UploadTextToBlobAsync(string fileName, string content)  
{  
    try  
    {  
        // Retrieve storage account from connection string.  
        var storageAccount = CloudStorageAccount.Parse(storageConnectionString);  
  
        // Create the blob client.  
        var blobClient = storageAccount.CreateCloudBlobClient();  
  
        // Get a reference to the container.  
        var container = blobClient.GetContainerReference("notes");  
  
        // Create the container if it doesn't exist.  
        await container.CreateIfNotExistsAsync();  
  
        // Set the permissions so the blobs are public.  
        var containerPermissions = new BlobContainerPermissions  
        {  
            PublicAccess = BlobContainerPublicAccessType.Container  
        };  
        await container.SetPermissionsAsync(containerPermissions);  
  
        // Get a reference to the blob.  
        var blockBlob = container.GetBlockBlobReference(fileName);  
  
        // Convert the content to bytes.  
        var contentBytes = Encoding.UTF8.GetBytes(content);  
  
        // Upload the content as a stream.  
        using (var stream = new MemoryStream(contentBytes))  
        {            await blockBlob.UploadFromStreamAsync(stream);  
        }  
        Console.WriteLine($"File uploaded successfully to: {blockBlob.Uri}");  
    }    catch (Exception ex)  
    {        Console.WriteLine($"An error occurred: {ex.Message}");  
    }
}  
  
async Task DownloadBlobAsync(string fileName, string destinationPath)  
{  
    try  
    {  
        // Retrieve storage account from connection string.  
        var storageAccount = CloudStorageAccount.Parse(storageConnectionString);  
  
        // Create the blob client.  
        var blobClient = storageAccount.CreateCloudBlobClient();  
  
        // Get a reference to the container.  
        var container = blobClient.GetContainerReference("notes");  
  
        // Get a reference to the blob.  
        var blockBlob = container.GetBlockBlobReference(fileName);  
  
        if (await blockBlob.ExistsAsync())  
        {            // Download the blob to the specified destination path.  
            await blockBlob.DownloadToFileAsync(destinationPath, FileMode.Create);  
            Console.WriteLine($"File downloaded successfully to: {destinationPath}");  
        }        else  
        {  
            Console.WriteLine("Blob not found.");  
        }    }    catch (Exception ex)  
    {        Console.WriteLine($"An error occurred: {ex.Message}");  
    }
}  
  
  
async Task DeleteBlobAsync(string blobName)  
{  
    try  
    {  
        // Retrieve storage account from connection string.  
        var storageAccount = CloudStorageAccount.Parse(storageConnectionString);  
  
        // Create the blob client.  
        var blobClient = storageAccount.CreateCloudBlobClient();  
  
        // Get a reference to the container.  
        var container = blobClient.GetContainerReference("notes");  
  
        // Get a reference to the blob.  
        var blockBlob = container.GetBlockBlobReference(blobName);  
  
        if (await blockBlob.ExistsAsync())  
        {            await blockBlob.DeleteAsync();  
            Console.WriteLine("Blob deleted successfully.");  
        }        else  
        {  
            Console.WriteLine("Blob not found.");  
        }    }    catch (Exception ex)  
    {        Console.WriteLine($"An error occurred: {ex.Message}");  
    }
}