Gérer des objets blob de blocs avec PowerShell

Stockage Blob prend en charge les objets blob de blocs, d’ajout et de pages. Les objets blob de blocs sont optimisés pour charger efficacement de grandes quantités de données. Les objets blob de blocs sont parfaits pour stocker des images, des documents et d’autres types de données qui ne sont pas soumis à des opérations de lecture et d’écriture aléatoires. Cet article explique comment travailler avec des objets blob de blocs.

Prérequis

Configurer un objet de contexte pour encapsuler les informations d’identification

Chaque demande adressée au Stockage Azure doit être autorisée. Vous pouvez autoriser une requête effectuée depuis PowerShell avec votre compte Microsoft Entra ou en utilisant les clés d'accès au compte. Les exemples de cet article utilisent l’autorisation Microsoft Entra avec des objets contextuels. Les objets contextuels encapsulent vos informations d'identification Microsoft Entra et les transmettent lors des opérations de données ultérieures.

Pour vous connecter à votre compte Azure avec un compte Microsoft Entra, ouvrez PowerShell et appelez la cmdlet Connect-AzAccount.

#Connect to your Azure subscription
Connect-AzAccount

Une fois la connexion établie, créez le contexte Azure. L'authentification avec Microsoft Entra ID crée automatiquement un contexte Azure pour votre abonnement par défaut. Dans certains cas, vous devrez peut-être accéder à des ressources dans un autre abonnement après l’authentification. Vous pouvez changer l’abonnement associé à votre session Azure actuelle en modifiant le contexte de session active.

Pour utiliser votre abonnement par défaut, créez le contexte en appelant la cmdlet New-AzStorageContext. Incluez le paramètre -UseConnectedAccount afin que les opérations sur les données soient effectuées à l'aide de vos informations d'identification Microsoft Entra.

#Create a context object using Azure AD credentials
$ctx = New-AzStorageContext -StorageAccountName <storage account name> -UseConnectedAccount

Pour modifier les abonnements, récupérez l’objet de contexte à l’aide de la cmdlet Get-AzSubscription, puis modifiez le contexte actuel avec set-AzContext. Consultez Modifier l’abonnement actif pour plus d’informations.

Créez un conteneur.

Toutes les données blob sont stockées dans des conteneurs. Vous avez donc besoin d’au moins une ressource de conteneur avant de pouvoir charger des données. Si nécessaire, utilisez l’exemple suivant pour créer un conteneur de stockage. Pour plus d’informations, consultez Gestion des conteneurs de blobs à l’aide de PowerShell.

#Create a container object
$container = New-AzStorageContainer -Name "mycontainer" -Context $ctx

Si vous utilisez les exemples suivants, vous devez remplacer les valeurs d’espace réservé entre crochets par vos propres valeurs. Pour plus d’informations sur la connexion à Azure avec PowerShell, consultez Se connecter avec Azure PowerShell.

Charger un objet blob

Pour charger un fichier sur un objet blob de bloc, transmettez les valeurs de paramètres requises à la cmdlet Set-AzStorageBlobContent. Fournissez le chemin d’accès et le nom du fichier avec le paramètre-File et le nom du conteneur avec le paramètre -Container. Vous devez également fournir une référence à l’objet de contexte à l’aide du paramètre -Context.

Cette commande crée le blob s’il n’existe pas ou vous invite à remplacer la confirmation si elle existe. Vous pouvez remplacer le fichier sans confirmation si vous transmettez le paramètre -Force à la cmdlet.

L’exemple suivant spécifie une valeur de paramètre -File pour le téléchargement d’un fichier nommé unique. Elle illustre également l’utilisation de l’opérateur de pipeline PowerShell et de la cmdlet Get-ChildItem pour charger plusieurs fichiers. La cmdlet Get-ChildItem utilise le paramètre -Path pour spécifier C:\Temp\*.png. L’inclusion du caractère générique astérisque (*) spécifie tous les fichiers avec l’extension de nom de fichier .png. Le paramètre -Recurse recherche dans le répertoire Temp et ses sous-répertoires.

#Set variables
$path          = "C:\temp\" 
$containerName = "mycontainer"
$filename      = "demo-file.txt"
$imageFiles    = $path + "*.png"
$file          = $path + $filename

#Upload a single named file
Set-AzStorageBlobContent -File $file -Container $containerName -Context $ctx

#Upload multiple image files recursively
 Get-ChildItem -Path $imageFiles -Recurse | Set-AzStorageBlobContent -Container $containerName -Context $ctx

Le résultat affiche le nom du compte de stockage, le nom du conteneur de stockage et fournit une liste des fichiers chargés.

   AccountName: demostorageaccount, ContainerName: demo-container

Name              BlobType   Length  ContentType                LastModified          AccessTier  IsDeleted
----              --------   ------  -----------                ------------          ----------  ---------
demo-file.txt     BlockBlob  222     application/octet-stream   2021-12-14 01:38:03Z  Cool        False     
hello-world.png   BlockBlob  14709   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world2.png  BlockBlob  12472   application/octet-stream   2021-12-14 01:38:03Z  Cool        False
hello-world3.png  BlockBlob  13537   application/octet-stream   2021-12-14 01:38:03Z  Cool        False

Liste des objets blob

La cmdlet Get-AzStorageBlob sert à répertorier les blobs stockés dans un conteneur. Vous pouvez utiliser différentes approches pour définir l’étendue de votre recherche. Utilisez le paramètre -Container et -Name pour répertorier un blob spécifique au sein d’un conteneur connu. Pour générer une liste non filtrée de tous les blobs au sein d’un conteneur spécifique, utilisez le paramètre -Container seul, sans valeur -Name.

Il n’existe aucune restriction au nombre de conteneurs ou blobs qu’un compte de stockage peut avoir. Pour éviter éventuellement de récupérer des milliers de blobs, il est important de limiter la quantité de données renvoyées. Lorsque vous récupérez plusieurs blobs, vous pouvez utiliser le paramètre -Prefix pour spécifier des blobs dont les noms commencent par une chaîne spécifique. Vous pouvez également utiliser le paramètre -Name avec un caractère générique pour spécifier des noms ou des types de fichiers.

Le paramètre -MaxCount peut être utilisé pour limiter le nombre de blobs non filtrés renvoyés à partir d’un conteneur. Une limite de service de 5 000 est imposée à toutes les ressources Azure. Cette limite garantit que des quantités gérables de données sont récupérées et que le niveau de performance n’est pas impacté. Si le nombre de blobs renvoyés dépasse la valeur -MaxCount ou la limite de service, un jeton de continuation est renvoyé. Ce jeton vous permet d’utiliser plusieurs demandes pour récupérer n’importe quel membre de blobs. Des informations supplémentaires sont disponibles Énumération des ressources blob.

L’exemple suivant illustre plusieurs approches utilisées pour fournir une liste des blobs. La première approche répertorie un seul blob au sein d’une ressource de conteneur spécifique. La deuxième approche utilise un caractère générique pour lister tous les fichiers .jpg comportant le préfixe louis. La recherche est limitée à cinq conteneurs à l’aide du paramètre -MaxCount. La troisième approche utilise des paramètres -MaxCount et -ContinuationToken pour limiter la récupération de tous les blobs au sein d’un conteneur.

#Set variables
$namedContainer  = "named-container"
$demoContainer   = "mycontainer"
$containerPrefix = "demo"

$maxCount = 1000
$total     = 0
$token     = $Null

#Approach 1: List all blobs in a named container
Get-AzStorageBlob -Container $namedContainer -Context $ctx

#Approach 2: Use a wildcard to list blobs in all containers
Get-AzStorageContainer -MaxCount 5 -Context $ctx | Get-AzStorageBlob -Blob "*louis*.jpg" 

#Approach 3: List batches of blobs using MaxCount and ContinuationToken parameters
Do
{
     #Retrieve blobs using the MaxCount parameter
     $blobs = Get-AzStorageBlob -Container $demoContainer `
         -MaxCount $maxCount `
         -ContinuationToken $token `
         -Context $ctx
     $blobCount = 1
     
     #Loop through the batch
     Foreach ($blob in $blobs)
     {
         #To-do: Perform some work on individual blobs here

         #Display progress bar
         $percent = $($blobCount/$maxCount*100)
         Write-Progress -Activity "Processing blobs" -Status "$percent% Complete" -PercentComplete $percent
         $blobCount++
     }

     #Update $total
     $total += $blobs.Count
      
     #Exit if all blobs processed
     If($blobs.Length -le 0) { Break; }
      
     #Set continuation token to retrieve the next batch
     $token = $blobs[$blobs.Count -1].ContinuationToken
 }
 While ($null -ne $token)
 Write-Host "`n`n   AccountName: $($ctx.StorageAccountName), ContainerName: $demoContainer `n"
 Write-Host "Processed $total blobs in $namedContainer."

Les deux premières approches affichent les noms du compte de stockage et du conteneur, ainsi qu’une liste des blobs récupérés. La troisième approche affiche le nombre total de blobs dans un conteneur nommé. Les blobs sont récupérés par lots et une barre d’état affiche la progression au cours du nombre.

   AccountName: demostorageaccount, ContainerName: named-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
index.txt            BlockBlob   222       text/plain     2021-12-15 22:00:10Z  Cool          False
miles-davis.txt      BlockBlob   23454     text/plain     2021-12-15 22:17:59Z  Cool          False
cab-calloway.txt     BlockBlob   18419     text/plain     2021-12-15 22:17:59Z  Cool          False
benny-goodman.txt    BlockBlob   17726     text/plain     2021-12-15 22:17:59Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType    Length    ContentType    LastModified          AccessTier    IsDeleted
----                 --------    ------    -----------    ------------          ----------    ---------
louis-armstrong.jpg  BlockBlob   211482    image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-jordan.jpg     BlockBlob   55766     image/jpeg     2021-12-14 01:38:03Z  Cool          False
louis-prima.jpg      BlockBlob   290651    image/jpeg     2021-12-14 01:38:03Z  Cool          False


   AccountName: demostorageaccount, ContainerName: demo-container

Processed 5257 blobs in demo-container.

Télécharger un objet blob

Selon votre cas d’utilisation, la cmdlet Get-AzStorageBlobContent peut être utilisée pour télécharger un ou plusieurs blobs. Comme pour la plupart des opérations, les deux approches nécessitent un objet de contexte.

Pour télécharger un seul blob nommé, vous pouvez appeler directement la cmdlet et fournir les valeurs des paramètres -Blob et -Container. Le blob est téléchargé dans le répertoire PowerShell par défaut en cours de fonctionnement, mais un autre emplacement peut être spécifié. Pour modifier l’emplacement cible, un chemin d’accès valide existant doit être transmis avec le paramètre -Destination. Étant donné que l’opération ne peut pas créer de destination, elle échouera avec une erreur si le chemin d’accès spécifié n’existe pas.

Vous pouvez télécharger plusieurs blobs en combinant la cmdlet Get-AzStorageBlob et l’opérateur de pipeline PowerShell. Tout d’abord, créez une liste de blobs avec la cmdlet Get-AzStorageBlob. Utilisez ensuite l’opérateur de pipeline et la cmdlet Get-AzStorageBlobContent pour extraire les blobs du conteneur.

L’exemple de code suivant fournit un exemple d’approches de téléchargement unique et de téléchargement multiple. Il offre également une approche simplifiée de la recherche de fichiers spécifiques dans tous les conteneurs à l’aide d’un caractère générique. Étant donné que certains environnements peuvent avoir des centaines de milliers de ressources, l’utilisation du paramètre -MaxCount est recommandée.

#Set variables
$containerName = "mycontainer"
$path          = "C:\temp\downloads\"
$blobName      = "demo-file.txt"
$fileList      = "*.png"
$pipelineList  = "louis*"
$maxCount      = 10

#Download a single named blob
Get-AzStorageBlobContent -Container $containerName -Blob $blobName -Destination $path -Context $ctx

#Download multiple blobs using the pipeline
Get-AzStorageBlob -Container $containerName -Blob $fileList -Context $ctx | Get-AzStorageBlobContent

#Use wildcard to download blobs from all containers
Get-AzStorageContainer -MaxCount $maxCount `
     -Context $ctx | Get-AzStorageBlob `
     -Blob "louis*" | Get-AzStorageBlobContent

Le résultat affiche le nom du compte de stockage et du conteneur et fournit la liste des fichiers téléchargés.

   AccountName: demostorageaccount, ContainerName: demo-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
demo-file.txt        BlockBlob  222     application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world.png      BlockBlob  14709   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world2.png     BlockBlob  12472   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False
hello-world3.png     BlockBlob  13537   application/octet-stream 2021-12-14 01:38:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: public-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-armstrong.jpg  BlockBlob  211482  image/jpeg               2021-12-14 18:56:03Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: read-only-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-jordan.jpg     BlockBlob  55766   image/jpeg               2021-12-14 18:56:21Z  Unknown     False

   AccountName: demostorageaccount, ContainerName: hidden-container

Name                 BlobType   Length  ContentType              LastModified          AccessTier  IsDeleted
----                 --------   ------  -----------              ------------          ----------  ---------
louis-prima.jpg      BlockBlob  290651  image/jpeg               2021-12-14 18:56:45Z  Unknown     False

Gérer des propriétés et des métadonnées de blobs

Un conteneur expose à la fois les propriétés système et les métadonnées définies par l’utilisateur. Des propriétés système existent sur chaque ressource de Stockage Blob. Certaines propriétés sont en lecture seule, d’autres peuvent être lues ou définies. En arrière-plan, certaines propriétés système correspondent à certains en-têtes HTTP standard.

Ces métadonnées définies par l’utilisateur se composent d’une ou plusieurs paires nom-valeur que vous spécifiez pour une ressource de Stockage Blob. Vous pouvez utiliser des métadonnées pour stocker ces valeurs supplémentaires avec la ressource. Les valeurs de métadonnées sont destinées à votre usage personnel et n’affectent pas le comportement de la ressource.

Lecture des propriétés blob

Pour lire les propriétés ou métadonnées d’un blob, vous devez d’abord récupérer le blob à partir du service. Utilisez la cmdlet Get-AzStorageBlob pour récupérer des propriétés et métadonnées d’un blob, mais pas son contenu. Utilisez ensuite la méthode BlobClient.GetProperties pour extraire les propriétés d’un blob. Les propriétés ou métadonnées peuvent ensuite être lues ou définies selon vos besoins.

L’exemple suivant récupère un blob et répertorie ses propriétés.

$blob = Get-AzStorageBlob -Blob "blue-moon.mp3" -Container "mycontainer" -Context $ctx
$properties = $blob.BlobClient.GetProperties()
Echo $properties.Value

Le résultat affiche la liste des propriétés d’un blob, comme illustré dans l’exemple suivant.

LastModified                         : 11/16/2021 3:42:07 PM +00:00
CreatedOn                            : 11/16/2021 3:42:07 PM +00:00
Metadata                             : {}
BlobType                             : Block
LeaseDuration                        : Infinite
LeaseState                           : Available
LeaseStatus                          : Unlocked
ContentLength                        : 2163298
ContentType                          : audio/mpeg
ETag                                 : 0x8D9C0AA9E0CBA78
IsServerEncrypted                    : True
AccessTier                           : Cool
IsLatestVersion                      : False
TagCount                             : 0
ExpiresOn                            : 1/1/0001 12:00:00 AM +00:00
LastAccessed                         : 1/1/0001 12:00:00 AM +00:00
HasLegalHold                         : False

Lire et écrire des métadonnées de blob

Les métadonnées de blob sont un ensemble facultatif de paires nom-valeur associés à un blob. Comme montré dans l’exemple précédent, aucune métadonnées n’est associée initialement à un blob, même si elle peut être ajoutée si nécessaire. Pour accéder aux métadonnées de blob, vous devez utiliser la méthode BlobClient.UpdateMetadata. Cette méthode n’accepte que les paires clé-valeur stockées dans un objet générique IDictionary. Pour plus d’informations, consultez la définition de classe BlobClient.

L’exemple ci-dessous met à jour et valide les métadonnées d’un blob, puis les récupère. L’exemple de blob est vidé de la mémoire pour s’assurer que les métadonnées ne sont pas lues à partir de l’objet en mémoire.

#Set variable
$container = "mycontainer"
$blobName  = "blue-moon.mp3"

#Retrieve blob
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx

#Create IDictionary, add key-value metadata pairs to IDictionary
$metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
$metadata.Add("YearWritten","1934")
$metadata.Add("YearRecorded","1958")
$metadata.Add("Composer","Richard Rogers")
$metadata.Add("Lyricist","Lorenz Hart")
$metadata.Add("Artist","Tony Bennett")

#Update metadata
$blob.BlobClient.SetMetadata($metadata, $null)

#Flush blob from memory, retrieve updated blob, retrieve properties
$blob = $null
$blob = Get-AzStorageBlob -Blob $blobName -Container $container -Context $ctx
$properties = $blob.BlobClient.GetProperties()
 
#Display metadata
Echo $properties.Value.Metadata

Le résultat renvoie les métadonnées récemment mises à jour du blob, comme illustré dans l’exemple suivant.

Key          Value         
---          -----         
YearWritten  1934          
YearRecorded 1958          
Composer     Richard Rogers
Lyricist     Lorenz Hart   
Artist       Tony Bennett

Opérations de copie de blobs

Il existe de nombreux scénarios où des blobs de différents types peuvent être copiés. Les exemples décrits dans cet article sont limités aux objets blob de blocs.

Copier un blob source vers un blob de destination

Pour simplifier l’opération de copie dans le même compte de stockage, utilisez la cmdlet Copy-AzStorageBlob. Étant donné que l’opération copie un blob dans le même compte de stockage, il s’agit d’une opération synchrone. Les opérations entre comptes sont asynchrones.

Vous devez envisager l’utilisation d’AzCopy pour la simplicité et le niveau de performance, en particulier lors de la copie de blobs entre des comptes de stockage. AzCopy est un utilitaire de ligne de commande que vous pouvez utiliser pour copier des blobs ou des fichiers vers ou depuis un compte de stockage. En savoir plus sur Démarrage avec AzCopy.

L’exemple ci-dessous copie le blob bannerphoto.png du conteneur de photos vers le dossier photos dans le conteneur archive. Les deux conteneurs existent dans le même compte de stockage. Le résultat vérifie le succès de l’opération de copie.

$blobname = "bannerphoto.png"
Copy-AzStorageBlob -SrcContainer "photos" `
     -SrcBlob $blobname -DestContainer "archive" `
     -DestBlob $("photos/$blobname") -Context $ctx

AccountName: demostorageaccount, ContainerName: archive

Name                BlobType   Length  ContentType  LastModified          AccessTier  IsDeleted  VersionId
----                --------   ------  -----------  ------------          ----------  ---------  ---------
photos/bannerphoto  BlockBlob  12472   image/png    2021-11-27 23:11:43Z  Cool        False

Vous pouvez utiliser le paramètre -Force pour remplacer un blob existant du même nom dans la destination. Cette opération remplace efficacement le blob de destination. Cette opération supprime tous les blocs non validés et remplace les métadonnées du blob de destination.

Copiez un instantané sur un blob de destination avec un nom différent

L’objet blob de destination obtenu est un objet blob modifiable et non pas un instantané.

L’objet blob source d’une opération de copie peut être un objet blob de blocs, un objet blob d’ajout, un objet blob de pages ou un instantané. Si l’objet blob de destination existe déjà, il doit être du même type d’objet blob que l’objet blob source. Tout objet blob de destination existant est remplacé.

L’objet blob de destination ne peut pas être modifié pendant une opération de copie. Un objet blob de destination ne peut avoir qu’une seule opération de copie en attente. En d’autres termes, un objet blob ne peut pas être la destination de plusieurs opérations de copie en attente.

Lorsque vous copiez un objet blob dans le même compte de stockage, il s’agit d’une opération synchrone. Les opérations de copie entre comptes sont asynchrones.

L’intégralité du fichier ou de l’objet blob source est toujours copiée. La copie d’une plage d’octets ou d’un ensemble de blocs n’est pas prise en charge.

Lorsqu’un objet blob est copié, ses propriétés système sont copiées dans l’objet blob de destination avec les mêmes valeurs.

Il montre également comment abandonner une opération de copie asynchrone.

Blobs instantanés

Un instantané est une version en lecture seule d'un objet blob capturé à un instant donné. Un instantané d’objet blob est identique à son objet blob de base, sauf qu’une valeur DateTime est ajoutée à l’URI. Cette valeur indique l’heure à laquelle l’instantané a été pris et constitue la seule distinction entre l’objet blob de base et l’instantané.

Aucun bail associé à l’objet blob de base n’a d’incidence sur l’instantané. Vous ne pouvez pas acquérir de bail pour un instantané. En savoir plus sur les Instantanés de blobs.

L’exemple de code suivant extrait un blob d’un conteneur de stockage et crée un instantané de celui-ci.

$blob = Get-AzStorageBlob -Container "manuscripts" -Blob "novels/fast-cars.docx" -Context $ctx
$blob.BlobClient.CreateSnapshot()

Définir un niveau d’objet blob

Lorsque vous changez le niveau d’un blob, vous déplacez ce blob et toutes ses données dans le niveau cible. Pour apporter la modification, récupérez un objet blob avec l’applet de commande Get-AzStorageBlob et appelez la méthode BlobClient.SetAccessTier. Cette approche peut être utilisée pour modifier le niveau entre chaud, froid et archive.

Le changement de niveau de froid ou chaud à archive s'effectue presque immédiatement. Une fois qu’un objet blob est déplacé vers le niveau archive, il est considéré comme étant hors ligne et ne peut pas être lu ou modifié. Pour pouvoir lire ou modifier les données d’un blob archivé, vous devez le réhydrater à un niveau en ligne. En savoir plus sur la réhydratation des Blob à partir du niveau Archive.

L’exemple de code suivant définit le niveau sur chaud pour tous les blobs du conteneur archive.

$blobs = Get-AzStorageBlob -Container archive -Context $ctx
Foreach($blob in $blobs) {
    $blob.BlobClient.SetAccessTier("Hot")
}

Opérations à l’aide de balises blob

Les balises d’index blob facilitent la gestion et la découverte des données. Les balises d’index blob sont des attributs d’index clé-valeur définis par l’utilisateur que vous pouvez appliquer à vos blobs. Une fois configuré, vous pouvez catégoriser et rechercher des objets au sein d’un conteneur individuel ou de tous les conteneurs. Les ressources blob peuvent être catégorisés dynamiquement en mettant à jour leurs balises d’index sans modifier l’organisation des conteneurs. Grâce aux étiquettes d’index, vous disposez d’une certaine flexibilité pour changer les exigences en matière de données. Vous pouvez utiliser simultanément des métadonnées et des balises d’index. Pour plus d’informations sur les balises d'index, consultez Gérer et rechercher des données Blob Azure avec des balises d’index blob.

L’exemple suivant montre comment ajouter des balises d’index blob à une série de blobs. L’exemple lit les données d’un fichier XML et l’utilise pour créer des balises d’index sur plusieurs blobs. Pour utiliser l’exemple de code, créez un fichier blob-list.xml local dans votre répertoire C:\temp. Les données XML sont fournies dans l’exemple suivant.

<Venue Name="House of Prime Rib" Type="Restaurant">
  <Files>
    <File path="transactions/12027121.csv" />
    <File path="campaigns/radio-campaign.docx" />
    <File path="photos/bannerphoto.png" />
    <File path="archive/completed/2020review.pdf" />
    <File path="logs/2020/01/01/logfile.txt" />
  </Files>
</Venue>

L’exemple de code crée une table de hachage et y affecte la variable$tags. Ensuite, il utilise les cmdlets Get-Content et Get-Data pour créer un objet basé sur la structure XML. Il ajoute ensuite des paires clé-valeur à la table de hachage à utiliser comme valeurs de balise. Enfin, il itère par le biais de l’objet XML et crée des balises pour chaque nœud File.

#Set variables
$filePath = "C:\temp\blob-list.xml"
$tags     = @{}

#Get data, set tag key-values
[xml]$data = Get-Content -Path $filepath
$tags.Add("VenueName", $data.Venue.Name)
$tags.Add("VenueType", $data.Venue.Type)
 
#Loop through files and add tag
$data.Venue.Files.ChildNodes | ForEach-Object {
    #break the path: container name, blob
    $path = $_.Path -split "/",2
   
    #set apply the blob tags
    Set-AzStorageBlobTag -Container $location[0] -Blob $location[1] -Tag $tags -Context $ctx
 }

Suppression d’objets blob

Vous pouvez supprimer un seul blob ou une série de blobs avec la cmdlet Remove-AzStorageBlob. Lors de la suppression de plusieurs objets blob, vous pouvez utiliser les opérations conditionnelles, les boucles ou le pipeline PowerShell, comme le montrent les exemples suivants.

Avertissement

L’exécution des exemples suivants peut supprimer définitivement des objets blob. Microsoft recommande d’activer la suppression réversible de conteneurs afin de protéger les conteneurs et les blobs contre les suppressions accidentelles. Pour plus d’informations, consultez Suppression réversible de conteneurs.

#Create variables
$containerName  = "mycontainer"
$blobName       = "demo-file.txt"
$prefixName     = "file"

#Delete a single, named blob
Remove-AzStorageBlob -Blob $blobName -Container $containerName -Context $ctx

#Iterate a loop, deleting blobs
for ($i = 1; $i -le 3; $i++) { 
    Remove-AzStorageBlob -Blob (-join($prefixName, $i, ".txt")) -Container $containerName -Context $ctx
} 

#Retrieve blob list, delete using a pipeline
Get-AzStorageBlob -Prefix $prefixName -Container $containerName -Context $ctx | Remove-AzStorageBlob

Dans certains cas, il est possible de récupérer des blobs qui ont été supprimés. Si l’option de protection des données avec la suppression réversible de votre compte de stockage est activée, le paramètre -IncludeDeleted retourne les blobs supprimés pendant la période de rétention associée. Pour en savoir plus sur la surpression réversible, consultez l’article Suppression réversible pour les blobs.

Utilisez l’exemple suivant pour récupérer une liste de blobs supprimés pendant la période de rétention associée au conteneur. Le résultat affiche une liste de blobs récemment supprimés.

#Retrieve a list of blobs including those recently deleted
Get-AzStorageBlob -Prefix $prefixName -IncludeDeleted -Context $ctx

AccountName: demostorageaccount, ContainerName: demo-container

Name       BlobType   Length  ContentType                LastModified          AccessTier    IsDeleted
----       --------   ------  -----------                ------------          ----------    ---------
file.txt   BlockBlob  22      application/octet-stream   2021-12-16 20:59:41Z  Cool          True
file2.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file3.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:24Z  Cool          True
file4.txt  BlockBlob  22      application/octet-stream   2021-12-17 00:14:25Z  Cool          True

Restaurer un objet blob supprimé

Comme indiqué dans la section Blobs de listes, vous pouvez configurer l’option de protection des données avec la suppression réversible sur votre compte de stockage. Lorsque vous l’activez, il est possible de restaurer des objets blob supprimés pendant la période de rétention associée. Vous pouvez également utiliser le contrôle de version afin de gérer les versions précédentes de vos objets blob pour la récupération et la restauration.

Si le contrôle de version des objets blob et la suppression réversible d’objets blob sont tous deux activés, alors la modification, le remplacement, la suppression ou la restauration d’un objet blob crée automatiquement une nouvelle version. La méthode que vous utilisez pour restaurer un objet blob supprimé varie selon que le contrôle de version est activé ou non sur votre compte de stockage.

L’exemple de code suivant restaure tous les objets blob supprimés de manière réversible ou, si le contrôle de version est activé, restaure la dernière version d’un objet blob. Il commence par déterminer si le contrôle de version est activé à l’aide de l’applet de commande Get-AzStorageBlobServiceProperty.

Si le versioning est activé, l’applet de commande Get-AzStorageBlob récupère la liste des versions d’objets blob dotés d’un nom unique. Ensuite, les versions d’objet blob figurant dans la liste sont récupérées et classées par date. Si aucune version n’est trouvée avec la valeur d’attribut LatestVersion, l’applet de commande Copy-AzBlob est utilisée pour effectuer une copie active de la dernière version.

Si le contrôle de version est désactivé, la méthode BlobBaseClient.Undelete est utilisée pour restaurer chaque objet blob supprimé de manière réversible dans le conteneur.

Pour pouvoir suivre cet exemple, vous devez activer la suppression réversible ou le contrôle de version sur au moins un de vos comptes de stockage.

Important

L’exemple suivant énumère un groupe d’objets blob et les stocke en mémoire avant de les traiter. Si le contrôle de version est activé, les objets blob sont également triés. L’utilisation du paramètre -ContinuationToken avec une variable $maxCount limite le nombre d’objets blob au sein du groupe pour conserver les ressources. Si un conteneur contient des millions d’objets blob, cela sera extrêmement coûteux. Vous pouvez ajuster la valeur de la variable $maxCount, mais si un conteneur contient des millions d’objets blob, le script traite les objets blob lentement.

Pour en savoir plus sur l’option de protection des données avec la suppression réversible, reportez-vous à l’article Suppression réversible pour les blobs.

$accountName   ="myStorageAccount"
$groupName     ="myResourceGroup"
$containerName ="mycontainer"
$maxCount      = 1000
$token         = $null


$blobSvc = Get-AzStorageBlobServiceProperty `
    -StorageAccountName $accountName `
    -ResourceGroupName $groupName

# If soft delete is enabled
if($blobSvc.DeleteRetentionPolicy.Enabled)
{
    # If versioning is enabled
    if($blobSvc.IsVersioningEnabled -eq $true)
    {
        # Set context
        $ctx = New-AzStorageContext `
            -StorageAccountName $accountName `
            -UseConnectedAccount
        do
        {
            # Get all blobs and versions using -Unique 
            # to avoid processing duplicates/versions
            $blobs = Get-AzStorageBlob `
                -Container $containerName `
                -Context $ctx -IncludeVersion | `
                    Where-Object {$_.VersionId -ne $null} | `
                    Sort-Object -Property Name -Unique

            # Iterate the collection
            foreach ($blob in $blobs)
            {
                # Process versions
                if($blob.VersionId -ne $null)
                {
            
                    # Get all versions of the blob, newest to oldest
                    $delBlob = Get-AzStorageBlob `
                        -Container $containerName `
                        -Context $ctx `
                        -Prefix $blob.Name `
                        -IncludeDeleted -IncludeVersion  | `
                            Sort-Object -Property VersionId -Descending

                    # Verify that the newest version is NOT the latest (that the version is "deleted")
                    if (-Not $delBlob[0].IsLatestVersion)
                    {
                        $delBlob[0] | Copy-AzStorageBlob `
                            -DestContainer $containerName `
                            -DestBlob $delBlob[0].Name
                    }
                
                    #Dispose the temporary object
                    $delBlob = $null
                }
            }
            $token = $blobs[$blobs.Count -1].ContinuationToken;
        }
        while ($null -ne $token)
    }

    # Otherwise (if versioning is disabled)
    else
    {
        $blobs = Get-AzStorageBlob `
            -Container $containerName `
            -Context $ctx -IncludeDeleted | `
                Where-Object {$_.IsDeleted}
        foreach($blob in $blobs)
        {
            if($blob.IsDeleted) { $blob.BlobBaseClient.Undelete() }
        }
    }
}
else
{
    echo "Sorry, the delete retention policy is not enabled."
}

Étapes suivantes