Exercice : Déplacer des blobs Stockage Azure en utilisant le client de stockage .NET

Effectué

La bibliothèque cliente .NET prend en charge le stockage Azure. Vous pouvez utiliser cette bibliothèque pour écrire vos propres applications personnalisées afin de déplacer des données dans le stockage Azure.

Dans cet exercice, vous écrivez une application capable de migrer des objets blob du stockage chaud au stockage froid.

Créer et ajouter des données dans un stockage chaud

Tout d’abord, créez deux comptes à l’aide d’Azure CLI.

Le bac à sable gratuit vous permet de créer des ressources dans certaines régions Azure du monde. Sélectionnez une région dans cette liste au moment où vous créez des ressources :

  • westus2
  • southcentralus
  • centralus
  • eastus
  • westeurope
  • southeastasia
  • japaneast
  • brazilsouth
  • australiasoutheast
  • centralindia
  1. Créez des variables d’environnement pour la région et le nom de votre compte de stockage. Remplacez <location> par une région issue de la liste précédente.

    HOT_STORAGE_NAME=hotstorage$RANDOM
    COOL_STORAGE_NAME=coolstorage$RANDOM
    LOCATION=<location>
    
  2. Ensuite, exécutez la commande suivante pour créer un compte de stockage afin de conserver les objets blob.

    az storage account create \
      --location $LOCATION \
      --name $HOT_STORAGE_NAME \
      --resource-group <rgn>[Sandbox resource group]</rgn> \
      --sku Standard_RAGRS \
      --kind BlobStorage \
      --access-tier Hot
    
  3. Créez un compte de stockage pour conserver les objets blob archivés. Utilisez le niveau d’accès froid. Comme auparavant, spécifiez une région appropriée et choisissez un nom unique pour votre compte de stockage.

    az storage account create \
      --location $LOCATION \
      --name $COOL_STORAGE_NAME \
      --resource-group <rgn>[Sandbox resource group]</rgn> \
      --sku Standard_RAGRS \
      --kind BlobStorage \
      --access-tier Cool
    
    
  4. Obtenez les clés pour votre compte de stockage.

    az storage account keys list \
      --account-name $HOT_STORAGE_NAME \
      --resource-group <rgn>[Sandbox resource group]</rgn> \
      --output table
    
  5. Créez une variable d’environnement pour votre clé de compte. Utilisez la valeur de la première clé récupérée par la commande précédente.

    HOT_KEY="<source account key>"
    
  6. Créez un conteneur nommé specifications dans votre compte de stockage.

    az storage container create \
      --name specifications \
      --account-name $HOT_STORAGE_NAME \
      --account-key $HOT_KEY
    
  7. Exécutez la commande suivante pour télécharger l’exemple de code source pour cet exercice.

    git clone https://github.com/MicrosoftDocs/mslearn-copy-move-blobs-from-containers-or-storage-accounts sample
    
  8. Chargez ces fichiers dans votre compte de stockage et enregistrez chacun d’eux comme un objet blob. Cette commande charge plusieurs fichiers de spécifications.

    az storage blob upload-batch \
      --destination specifications \
      --pattern "*.md" \
      --source ~/sample/specifications \
      --account-name $HOT_STORAGE_NAME \
      --account-key $HOT_KEY
    
  9. Vérifiez que les blobs ont été créés.

    az storage blob list \
      --container-name specifications \
      --output table \
      --account-name $HOT_STORAGE_NAME \
      --account-key $HOT_KEY
    

Configuration de votre projet

  1. Accédez au dossier des exemples.

    cd sample/code
    
  2. Ouvrez le fichier projet TransferBlobs.csproj à l’aide de l’éditeur Code.

    code TransferBlobs/TransferBlobs.csproj
    
  3. Remplacez la valeur <TargetFramework> par net7.0.

    <PropertyGroup>
      <OutputType>Exe</OutputType>
      <TargetFramework>net7.0</TargetFramework>
    </PropertyGroup>
    
  4. Enregistrez le fichier en sélectionnant Ctrl+S, puis fermez l’éditeur Code en sélectionnant Ctrl+Q.

  5. Générez l’exemple d’application.

    dotnet build TransferBlobs
    

Examiner l’application TransferBlobs

  1. Accédez au sous-répertoire TransferBlobs. Ce sous-répertoire contient le code source pour l’exemple d’application.

    cd TransferBlobs
    
  2. Ouvrez le fichier Program.cs à l’aide de l’éditeur Code.

    code Program.cs
    
  3. Examinez les premières lignes de l’application dans la méthode Main :

    string sourceConnection = args[0];
    string sourceContainer = args[1];
    string destConnection = args[2];
    string destContainer = args[3];
    DateTimeOffset transferBlobsModifiedSince = DateTimeOffset.Parse(args[4]);
    Console.WriteLine($"Moving blobs modified since {transferBlobsModifiedSince}");
    

    L’application TransferBlobs accepte les paramètres de ligne de commande suivants :

    • Une chaîne de connexion permettant d’accéder au compte de stockage source.
    • Le nom du conteneur dans le compte de stockage source contenant les objets blob à déplacer.
    • Une chaîne de connexion pour accéder au compte de stockage de destination.
    • Le nom du conteneur dans le compte de stockage de destination pour conserver les objets blob après leur déplacement.
    • Chaîne de date et d’heure (au format UTC). Les objets blob dans le conteneur source qui ont été modifiés depuis cette date et cette heure sont déplacés vers la destination.

    Remarque

    Cette application n’effectue aucune validation ni gestion d’erreurs. Il s’agit de conserver un code court et concis. Dans un système de production, vous devez valider toutes les entrées avec soin et implémenter la gestion des erreurs pour toutes les opérations sur les comptes de stockage.

  4. Examinez le code sous le commentaire Connect to Azure Storage.

    // Connect to Azure Storage
    BlobServiceClient sourceClient = new BlobServiceClient(sourceConnection);
    BlobServiceClient destClient = new BlobServiceClient(destConnection);
    
    BlobContainerClient sourceBlobContainer = sourceClient.GetBlobContainerClient(sourceContainer);
    sourceBlobContainer.CreateIfNotExists();
    
    BlobContainerClient destBlobContainer = destClient.GetBlobContainerClient(destContainer);
    destBlobContainer.CreateIfNotExists();
    

    Ce bloc de code crée des objets BlobServiceClient pour les comptes source et de destination. Ensuite, il crée des objets BlobContainerClient que vous pouvez utiliser pour accéder aux objets blob dans ces comptes. La variable sourceBlobContainer est une référence au conteneur dans le compte source, qui contient les objets blob à déplacer. La variable destBlobContainer est une référence au conteneur dans le compte de destination, où les objets blob vont être transférés et stockés.

  5. Allez jusqu’à la méthode FindMatchingBlobsAsync.

    // Find all blobs that have been modified since the specified date and time
    private static async Task<IEnumerable<BlobClient>> FindMatchingBlobsAsync(BlobContainerClient blobContainer, DateTimeOffset transferBlobsModifiedSince)
    {
        List<BlobClient> blobList = new List<BlobClient>();
    
        // Iterate through the blobs in the source container
        List<BlobItem> segment = await blobContainer.GetBlobsAsync(prefix: "").ToListAsync();
        foreach (BlobItem blobItem in segment)
        {
            BlobClient blob = blobContainer.GetBlobClient(blobItem.Name);
    
            // Check the source file's metadata
            Response<BlobProperties> propertiesResponse = await blob.GetPropertiesAsync();
            BlobProperties properties = propertiesResponse.Value;
    
            // Check the last modified date and time
            // Add the blob to the list if has been modified since the specified date and time
            if (DateTimeOffset.Compare(properties.LastModified.ToUniversalTime(), transferBlobsModifiedSince.ToUniversalTime()) > 0)
            {
                blobList.Add(blob);
            }
        }
    
        // Return the list of blobs to be transferred
        return blobList;
    }
    

    Cette méthode accepte un conteneur d’objets blob et un objet DateTimeOffset. La méthode effectue une itération dans le conteneur pour rechercher tous les objets blob qui ont une date de dernière modification après la valeur spécifiée dans l’objet DateTimeOffset. La collection blobList est remplie avec une référence à chaque objet blob correspondant. Une fois la méthode terminée, la collection blobList est renvoyée à l’appelant.

    Dans la méthode Main, appelez la méthode FindMatchingBlobsAsync avec l’instruction suivante.

    // Find all blobs that have been changed since the specified date and time
    IEnumerable<BlobClient> sourceBlobRefs = await FindMatchingBlobsAsync(sourceBlobContainer, transferBlobsModifiedSince);
    
  6. Allez jusqu’à la méthode MoveMatchingBlobsAsync.

    // Iterate through the list of source blobs, and transfer them to the destination container
    private static async Task MoveMatchingBlobsAsync(IEnumerable<BlobClient> sourceBlobRefs, BlobContainerClient sourceContainer, BlobContainerClient destContainer)
    {
        foreach (BlobClient sourceBlobRef in sourceBlobRefs)
        {
            // Copy the source blob
            BlobClient sourceBlob = sourceContainer.GetBlobClient(sourceBlobRef.Name);
    
            // Check the source file's metadata
            Response<BlobProperties> propertiesResponse = await sourceBlob.GetPropertiesAsync();
            BlobProperties properties = propertiesResponse.Value;
            BlobClient destBlob = destContainer.GetBlobClient(sourceBlobRef.Name);
            CopyFromUriOperation ops = await destBlob.StartCopyFromUriAsync(GetSharedAccessUri(sourceBlobRef.Name, sourceContainer));
    
            // Display the status of the blob as it is copied
            while(ops.HasCompleted == false)
            {
                long copied = await ops.WaitForCompletionAsync();
                Console.WriteLine($"Blob: {destBlob.Name}, Copied: {copied} of {properties.ContentLength}");
                    await Task.Delay(500);
            }
            Console.WriteLine($"Blob: {destBlob.Name} Complete");
    
            // Remove the source blob
            bool blobExisted = await sourceBlobRef.DeleteIfExistsAsync();
        }
    }
    

    Les paramètres de cette méthode sont la liste d’objets blob à déplacer, ainsi que les conteneurs source et de destination. Le code effectue une itération sur la liste des objets blob et utilise la méthode StartCopyFromUriAsync pour commencer à copier chaque objet blob l’un après l’autre. Une fois l’opération de copie lancée, le code interroge l’état de l’objet blob de destination à des intervalles de 0,5 seconde, affichant la progression de l’opération, jusqu'à ce que la copie soit terminée. L’objet blob est supprimé du conteneur source une fois la copie terminée.

    L’appel de la méthode StartCopyFromUriAsync prend une URL contenant un jeton SAS pour l’objet source, comme décrit dans l’unité précédente.

    Dans la méthode Main, appelez la méthode MoveMatchingBlobsAsync avec l’instruction suivante.

    // Move matching blobs to the destination container
    await MoveMatchingBlobsAsync(sourceBlobRefs, sourceBlobContainer, destBlobContainer);
    

Tester l’application TransferBlobs

  1. À partir du portail Azure, accédez à votre compte de stockage (chaud) source.

  2. Sous Sécurité + mise en réseau, sélectionnez Clés d’accès. Copiez la chaîne de connexion pour la clé dans un fichier texte sur votre ordinateur local.

  3. Sous Stockage des données, sélectionnez Conteneurs.

  4. Sélectionnez le conteneur specifications.

Modifiez quelques blobs pour en avoir certains dont la date de modification est différente de celle du chargement du lot.

  1. Dans le conteneur specifications, sélectionnez l’un des fichiers de spécifications (par exemple, specifications04.md).

  2. Sélectionnez l’onglet Modifier dans le panneau des objets blob, puis ajoutez le texte de votre choix.

  3. Sélectionnez Enregistrer pour valider les modifications apportées à l’objet blob.

  4. Répétez ces étapes pour modifier un ou deux autres fichiers blob.

Comme vous avez maintenant plusieurs objets blob présentant des dates de modification plus récentes, vous pouvez les différencier lorsque vous exécutez l’application .NET.

  1. Dans la liste des objets blob de ce conteneur, notez la date de modification de ces objets. Sélectionnez une date et une heure correspondant à peu près à la date médiane des dates de modification des objets blob (certains objets blob doivent avoir une date et une heure de modification antérieures à votre date sélectionnée, et d’autres postérieures).

    Remarque

    Le Portail Microsoft Azure indique les heures dans votre fuseau horaire local, mais notre programme les attend en heure UTC. Remplacez la date affichée dans le portail Azure par sa valeur UTC. Par exemple, si votre date/heure était 6/15/2021, 10:04:27 AM selon l’heure standard de Corée (KST), vous devez soustraire 9 heures à l’heure UTC : 6/15/2021, 01:04:27 AM.

  2. À partir du portail, accédez à votre compte de stockage (froid) de destination.

  3. Sous Sécurité + mise en réseau, sélectionnez Clés d’accès. Copiez la chaîne de connexion pour la clé dans un fichier texte sur votre ordinateur local.

  4. Dans la section Stockage des données, sélectionnez Conteneurs.

  5. Sélectionnez + Conteneur et créez un conteneur nommé transfer-test.

  6. Dans la fenêtre Cloud Shell, exécutez la commande suivante. Remplacez <source connection string> et <destination connection string> par les chaînes de connexion que vous avez enregistrées dans le bloc-notes. Remplacez <selected date and time> par la date et l’heure de vos blobs, au même format que dans le portail Azure. Pour empêcher l’interpréteur de commandes Bash d’interpréter les chaînes de connexion et la date ou l’heure, placez-les entre guillemets doubles :

    dotnet run "<source connection string>" specifications "<destination connection string>" transfer-test "<selected date and time>"
    

    Remarque

    Si votre fichier ne trouve aucun fichier à déplacer, vous devrez peut-être remplacer la date personnalisée dans le portail Azure pour votre fuseau horaire par sa valeur UTC, car celle-ci est utilisée par le programme. Par exemple, si vous avez effectué la modification à la date 6/15/2021, 10:04:27 AM KST, vous devez soustraire 9 heures à l’heure UTC : 6/15/2021, 01:04:27 AM.

  7. L’application doit lister le nom de chaque objet blob correspondant qu’elle trouve et le déplacer.

  8. Lorsque l’application a terminé, revenez au Portail Microsoft Azure.

  9. Accédez à votre compte de stockage (froid) de destination.

  10. Parcourez le dossier transfer-test. Vérifiez qu’il contient les objets blob qui ont été déplacés.

  11. Accédez à votre compte de stockage (chaud) source.

  12. Parcourez le dossier specifications. Vérifiez que les objets blob transférés sont supprimés de ce dossier.