Bien démarrer avec Stockage Blob Azure en utilisant F#

Stockage Blob Azure est un service qui stocke les données non structurées dans le cloud en tant qu’objets/objets blob. Ce service peut stocker tout type de données texte ou binaires, par exemple, un document, un fichier multimédia ou un programme d’installation d’application. Le stockage d’objets blob est également appelé Stockage Blob.

Cet article vous explique comment effectuer des tâches courantes en utilisant Stockage Blob. Les exemples ont été écrits en utilisant F# et la bibliothèque client Stockage Azure pour .NET. Les tâches abordées consistent à transférer, lister, télécharger et supprimer des objets blob.

Pour obtenir une vue d’ensemble des concepts de Stockage Blob, consultez le guide .NET pour le stockage d’objets blob.

Prérequis

Pour utiliser ce guide, vous devez d’abord créer un compte de stockage Azure. Vous avez aussi besoin de votre clé d’accès de stockage pour ce compte.

Créer un script F# et démarrer F# Interactive

Les exemples de cet article peuvent être utilisés dans une application F# ou dans un script F#. Pour créer un script F#, créez un fichier avec l’extension .fsx, par exemple blobs.fsx, dans votre environnement de développement F#.

Comment exécuter des scripts

F# Interactive, dotnet fsi, peut être lancé de façon interactive ou à partir de la ligne de commande pour exécuter un script. La syntaxe de la ligne de commande est

> dotnet fsi [options] [ script-file [arguments] ]

Ajouter des packages dans un script

Ensuite, utilisez #rnuget:package name pour installer le package Azure.Storage.Blobs et les espaces de noms open. Par exemple

> #r "nuget: Azure.Storage.Blobs"
open Azure.Storage.Blobs
open Azure.Storage.Blobs.Models
open Azure.Storage.Blobs.Specialized

Ajout de déclarations d'espaces de noms

Ajoutez les instructions open suivantes au début du fichier blobs.fsx :

open System
open System.IO
open Azure.Storage.Blobs // Namespace for Blob storage types
open Azure.Storage.Blobs.Models
open Azure.Storage.Blobs.Specialized
open System.Text

Obtention de votre chaîne de connexion

Pour ce tutoriel, vous avez besoin d’une chaîne de connexion à Stockage Azure. Pour plus d’informations sur les chaînes de connexion, consultez Configurer des chaînes de connexion de stockage.

Pour le tutoriel, vous entrez votre chaîne de connexion dans votre script, comme suit :

let storageConnString = "..." // fill this in from your storage account

Créer des données factices locales

Avant de commencer, créez des données locales factices dans le répertoire de notre script. Plus tard, vous allez charger ces données.

// Create a dummy file to upload
let localFile = "./myfile.txt"
File.WriteAllText(localFile, "some data")

Créer le client du service Blob

Le type BlobContainerClient vous permet de créer des conteneurs et d’extraire des blobs stockés dans Stockage Blob. Voici une façon de créer le client conteneur :

let container = BlobContainerClient(storageConnString, "myContainer")

Vous êtes maintenant prêt à écrire du code qui lit et écrit des données dans le Blob Storage.

Créez un conteneur.

Cet exemple montre comment créer un conteneur, si celui-ci n’existe pas encore :

container.CreateIfNotExists()

Le nouveau conteneur est privé par défaut, ce qui signifie que vous devez indiquer votre clé d’accès de stockage pour télécharger des objets blob depuis ce conteneur. Si vous voulez que les fichiers du conteneur soient publics, vous pouvez configurer le conteneur en utilisant le code suivant :

let permissions = PublicAccessType.Blob
container.SetAccessPolicy(permissions)

Tous les utilisateurs d’Internet peuvent afficher des objets blob d’un conteneur public, mais vous ne pouvez les modifier ou les supprimer que si vous disposez de la clé d’accès du compte ou de la signature d'accès partagé adéquate.

Charger un objet blob dans un conteneur

Le service de stockage d’objets blob Azure prend en charge les objets blob de blocs et de page. Dans la plupart des cas, il est recommandé d’utiliser le type d’objet blob de blocs.

Pour charger un fichier sur un objet blob de blocs, obtenez un client conteneur et utilisez-le pour obtenir une référence d’objet blob de blocs. Lorsque vous disposez d’une référence d’objet blob, vous pouvez télécharger un flux de données vers cet objet en appelant la méthode Upload. Cette opération remplace le contenu de l’objet blob, en créant un nouvel objet blob de blocs s’il n’en existe pas.

// Retrieve reference to a blob named "myblob.txt".
let blockBlob = container.GetBlobClient("myblob.txt")

// Create or overwrite the "myblob.txt" blob with contents from the local file.
use fileStream = new FileStream(localFile, FileMode.Open, FileAccess.Read, FileShare.Read)
do blockBlob.Upload(fileStream)

Créer la liste des objets blob d’un conteneur

Pour créer une liste d’objets blob dans un conteneur, commencez par obtenir une référence pointant vers un conteneur. Vous pouvez ensuite utiliser la méthode GetBlobs du conteneur pour récupérer les objets blob et/ou les répertoires qu’il contient. Pour accéder aux nombreuses propriétés et méthodes d’un objet BlobItem retourné

for item in container.GetBlobsByHierarchy() do
    printfn $"Blob name: {item.Blob.Name}"

Par exemple, prenez l’ensemble d’objets blob de blocs suivant, situé dans un conteneur nommé photos:

photo1.jpg
2015/architecture/description.txt
2015/architecture/photo3.jpg
2015/architecture/photo4.jpg
2016/architecture/photo5.jpg
2016/architecture/photo6.jpg
2016/architecture/description.txt
2016/photo7.jpg\

Quand vous appelez GetBlobsByHierarchy sur un conteneur (comme dans l’exemple ci-dessus), une liste hiérarchique est retournée.

Directory: https://<accountname>.blob.core.windows.net/photos/2015/
Directory: https://<accountname>.blob.core.windows.net/photos/2016/
Block blob of length 505623: https://<accountname>.blob.core.windows.net/photos/photo1.jpg

Télécharger des objets blob

Pour télécharger des objets blob, commencez par récupérer une référence d’objet blob, puis appelez la méthode DownloadTo . L’exemple suivant utilise la méthode DownloadTo pour transférer les contenus d’objets blob vers un objet de flux pouvant être rendu persistant dans un fichier local.

// Retrieve reference to a blob named "myblob.txt".
let blobToDownload = container.GetBlobClient("myblob.txt")

// Save blob contents to a file.
do
    use fileStream = File.OpenWrite("path/download.txt")
    blobToDownload.DownloadTo(fileStream)

Vous pouvez également utiliser la méthode DownloadContent pour télécharger les contenus d’un objet blob en tant que chaîne de texte.

let text = blobToDownload.DownloadContent().Value.Content.ToString()

Suppression d’objets blob

Pour supprimer un objet blob, commencez par obtenir une référence d’objet blob, puis appelez la méthode Delete sur celui-ci.

// Retrieve reference to a blob named "myblob.txt".
let blobToDelete = container.GetBlobClient("myblob.txt")

// Delete the blob.
blobToDelete.Delete()

Création d’une liste d’objets blob dans des pages de manière asynchrone

Si vous répertoriez un grand nombre d’objets blob ou que vous souhaitez contrôler le nombre de résultats renvoyés lors d’une opération de création de liste, vous pouvez répertorier les objets blob dans des pages de résultats. Cet exemple montre comment retourner des résultats dans des pages.

Cet exemple montre une liste hiérarchique obtenue en utilisant la méthode GetBlobsByHierarchy du BlobClient.

let ListBlobsSegmentedInHierarchicalListing(container:BlobContainerClient) =
        // List blobs to the console window, with paging.
        printfn "List blobs in pages:"

        // Call GetBlobsByHierarchy to return an async collection 
        // of blobs in this container. AsPages() method enumerate the values 
        //a Page<T> at a time. This may make multiple service requests.

        for page in container.GetBlobsByHierarchy().AsPages() do
            for blobHierarchyItem in page.Values do 
                printf $"The BlobItem is : {blobHierarchyItem.Blob.Name} "

        printfn ""

Nous pouvons maintenant utiliser cette routine de liste hiérarchique comme suit. Tout d’abord, chargez des données factices (en utilisant le fichier local précédemment créé dans ce tutoriel).

for i in 1 .. 100 do
    let blob  = container.GetBlobClient($"myblob{i}.txt")
    use fileStream = System.IO.File.OpenRead(localFile)
    blob.Upload(localFile)

Maintenant, appelez la routine.

ListBlobsSegmentedInHierarchicalListing container

Écriture dans un objet blob d’ajout

Il est optimisé pour les opérations d’ajout, telles que la journalisation. Comme un objet blob de blocs, un objet blob d’ajout est composé de blocs, mais quand vous ajoutez un nouveau bloc à un objet blob d’ajout, il est toujours ajouté à la fin de l’objet blob. Vous ne pouvez pas mettre à jour ou supprimer un bloc dans un objet blob d’ajout. Les ID de bloc dans un objet blob d’ajout ne sont pas visibles, comme pour un objet blob de blocs.

Chaque bloc d’un objet blob d’ajout peut avoir une taille différente (jusqu’à 4 Mo), et un objet blob d’ajout peut contenir au maximum 50 000 blocs. La taille maximale d’un objet blob d’ajout est donc légèrement supérieure à 195 Go (4 Mo x 50 000 blocs).

L’exemple suivant crée un objet blob d’ajout et y ajoute des données pour simuler une opération de journalisation simple.

// Get a reference to a container.
let appendContainer = BlobContainerClient(storageConnString, "my-append-blobs")

// Create the container if it does not already exist.
appendContainer.CreateIfNotExists() |> ignore

// Get a reference to an append blob.
let appendBlob = appendContainer.GetAppendBlobClient("append-blob.log")

// Create the append blob. Note that if the blob already exists, the 
// CreateOrReplace() method will overwrite it. You can check whether the 
// blob exists to avoid overwriting it by using CloudAppendBlob.Exists().
appendBlob.CreateIfNotExists()

let numBlocks = 10

// Generate an array of random bytes.
let rnd = Random()
let bytesArray = Array.zeroCreate<byte>(numBlocks)
rnd.NextBytes(bytesArray)

// Simulate a logging operation by writing text data and byte data to the 
// end of the append blob.
for i in 0 .. numBlocks - 1 do
    let msg = sprintf $"Timestamp: {DateTime.UtcNow} \tLog Entry: {bytesArray.[i]}\n"
    let array = Encoding.ASCII.GetBytes(msg);
    use stream = new MemoryStream(array)
    appendBlob.AppendBlock(stream)

// Read the append blob to the console window.
let downloadedText = appendBlob.DownloadContent().ToString()
printfn $"{downloadedText}"

Pour plus d’informations sur les différences entre les trois types d’objets blob, consultez la page Présentation des objets blob de blocs, des objets blob d’ajout et des objets blob de pages .

Accès simultané

Pour activer la prise en charge de l’accès simultané à un objet blob par plusieurs clients ou instances de processus, vous pouvez utiliser ETags ou leases.

  • Etag : permet de détecter la modification de l’objet blob ou du conteneur par un autre processus

  • Bail : permet d’obtenir un accès exclusif, renouvelable, en écriture ou en suppression à un objet blob pour une période de temps donnée

Pour plus d’informations, consultez Gestion de l’accès concurrentiel dans Stockage Microsoft Azure.

Nommage des conteneurs

Chaque objet blob du stockage Azure doit résider dans un conteneur. Le conteneur fait partie du nom d'objet blob. Par exemple, mydata est le nom du conteneur dans ces exemples d’URI d’objet blob :

  • https://storagesample.blob.core.windows.net/mydata/blob1.txt
  • https://storagesample.blob.core.windows.net/mydata/photos/myphoto.jpg

Un conteneur doit posséder un nom DNS valide, conforme aux règles de nommage suivantes :

  1. Les noms de conteneur doivent commencer par une lettre ou un chiffre, et peuvent comporter uniquement des lettres, des chiffres et des tirets (-).
  2. Chaque tiret (-) doit être immédiatement précédé et suivi d’une lettre ou d’un chiffre ; les tirets consécutifs sont interdits.
  3. Toutes les lettres du conteneur doivent être minuscules.
  4. Les noms de conteneurs doivent comporter entre 3 et 63 caractères.

Le nom d’un conteneur doit toujours être en minuscules. Si vous incluez une majuscule dans un nom de conteneur ou si vous ne respectez pas les règles d'affectation de noms, vous pouvez recevoir une erreur 400 (demande incorrecte).

Gestion de la sécurité pour les objets blob

Par défaut, Azure Storage préserve la sécurité de vos données en limitant l’accès au propriétaire du compte, qui est en possession des clés d’accès au compte. Lorsque vous avez besoin de partager des données d’objets blob de votre compte de stockage, il est important de le faire sans compromettre la sécurité de vos clés d’accès au compte. En outre, vous pouvez chiffrer les données d’objets blob pour vous assurer qu’elles sont sécurisées lors de leur transfert et dans Azure Storage.

Contrôle de l’accès aux données d’objets blob

Par défaut, les données d’objets blob de votre compte de stockage sont accessibles uniquement par le propriétaire du compte de stockage. L’authentification des demandes vis-à-vis du stockage d’objets blob requiert la clé d’accès par défaut. Cependant, vous pouvez rendre certaines données des objets blob disponibles pour d’autres utilisateurs.

Chiffrement des données d’objets blob

Stockage Azure prend en charge le chiffrement des données des objets blob sur le client et sur le serveur.

Voir aussi