Verwalten von Blob-Containern mithilfe von PowerShell

Azure-Blobspeicher ermöglicht Ihnen das Speichern großer Mengen unstrukturierter Objektdaten. Mithilfe von Blobspeicher können Sie Medien, Inhalte oder Anwendungsdaten für Benutzer sammeln oder verfügbar machen. Da alle Blobdaten in Containern gespeichert werden, müssen Sie einen Speichercontainer erstellen, bevor Sie mit dem Hochladen von Daten beginnen können. Weitere Informationen zum Blobspeicher finden Sie unter Einführung in Azure Blob Storage.

In diesem Artikel mit Vorgehensweisen wird erläutert, wie Sie sowohl mit einzelnen als auch mit mehreren Speichercontainerobjekten arbeiten.

Voraussetzungen

Bevor Sie die Beispiele in diesem Artikel verwenden können, müssen Sie Autorisierung für ein Azure-Abonnement erhalten. Autorisierung kann durch Authentifizierung bei einem Microsoft Entra-Konto oder durch Verwenden eines freigegebenen Schlüssels erfolgen. In den Beispielen in diesem Artikel wird Microsoft Entra-Autorisierung in Verbindung mit Kontextobjekten verwendet. Kontextobjekte kapseln Ihre Microsoft Entra-Anmeldeinformationen und übergeben sie bei nachfolgenden Datenvorgängen, sodass keine erneute Authentifizierung erforderlich ist.

Um sich mit einem Microsoft Entra-Konto bei Ihrem Azure-Konto anzumelden, öffnen Sie PowerShell, und verwenden Sie das Cmdlet Connect-AzAccount.

# Connect to your Azure subscription
 Connect-AzAccount

Nachdem die Verbindung hergestellt wurde, erstellen Sie den Kontext für das Speicherkonto, indem Sie das Cmdlet New-AzStorageContext aufrufen. Schließen Sie den Parameter -UseConnectedAccount ein, damit Datenvorgänge mithilfe Ihrer Microsoft Entra-Anmeldeinformationen durchgeführt werden.

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

Denken Sie daran, die Platzhalterwerte in den spitzen Klammern durch Ihre eigenen Werte zu ersetzen. Weitere Informationen zum Anmelden mit Azure PowerShell finden Sie unter Anmelden mit Azure PowerShell.

Erstellen eines Containers

Rufen Sie zum Erstellen von Containern mit PowerShell das Cmdlet New-AzStorageContainer auf. Es gibt keine Beschränkungen für die Anzahl der Blobs oder Container, die in einem Speicherkonto erstellt werden können. Container können nicht in anderen Containern geschachtelt werden.

Das folgende Beispiel veranschaulicht drei Optionen für die Erstellung von Blobcontainern mit dem Cmdlet New-AzStorageContainer. Beim ersten Ansatz wird ein einzelner Container erstellt, bei den beiden anderen Vorgehensweisen werden hingegen PowerShell-Vorgänge genutzt, um die Containererstellung zu automatisieren.

Um dieses Beispiel zu verwenden, stellen Sie Werte für die Variablen bereit, und stellen Sie sicher, dass Sie eine Verbindung mit Ihrem Azure-Abonnement erstellt haben. Denken Sie daran, die Platzhalterwerte in den spitzen Klammern durch Ihre eigenen Werte zu ersetzen.

# Create variables
 $containerName  = "individual-container"
 $prefixName     = "loop"

# Approach 1: Create a container
 New-AzStorageContainer -Name $containerName -Context $ctx

# Approach 2: Create containers with a PowerShell loop
 for ($i = 1; $i -le 3; $i++) { 
     New-AzStorageContainer -Name (-join($prefixName, $i)) -Context $ctx
    } 

# Approach 3: Create containers using the PowerShell Split method
 "$($prefixName)4 $($prefixName)5 $($prefixName)6".split() | New-AzStorageContainer -Context $ctx

Das Ergebnis gibt den Namen des Speicherkontos an und bestätigt die Erstellung des neuen Containers.

Storage Account Name: demostorageaccount

Name                   PublicAccess   LastModified
----                   ------------   ------------
individual-container   Off            11/2/2021 4:09:05 AM +00:00
loop-container1        Off            11/2/2021 4:09:05 AM +00:00
loop-container2        Off            11/2/2021 4:09:05 AM +00:00
loop-container3        Off            11/2/2021 4:09:05 AM +00:00           
loop-container4        Off            11/2/2021 4:09:05 AM +00:00           
loop-container5        Off            11/2/2021 4:09:05 AM +00:00           
loop-container6        Off            11/2/2021 4:09:05 AM +00:00          

Auflisten von Containern

Verwenden Sie das Cmdlet Get-AzStorageContainer, um Speichercontainer abzurufen. Beziehen Sie zum Abrufen eines einzelnen Containers den -Name-Parameter ein. Wenn Sie eine Liste von Containern zurückgeben möchten, die mit einer bestimmten Zeichenzeichenfolge beginnen, geben Sie einen Wert für den Parameter „-Prefix“ an.

Im folgenden Beispiel werden sowohl ein einzelner Container als auch eine Liste von Containerressourcen abgerufen.

# Create variables
 $containerName  = "individual-container"
 $prefixName     = "loop-"

# Approach 1: Retrieve an individual container
 Get-AzStorageContainer -Name $containerName -Context $ctx
 Write-Host

# Approach 2: Retrieve a list of containers
 Get-AzStorageContainer -Prefix $prefixName -Context $ctx

Das Ergebnis enthält den URI des Blobendpunkts und listet die nach Name und Präfix abgerufenen Container auf.

   Storage Account Name: demostorageaccount

Name                 PublicAccess         LastModified                   IsDeleted  VersionId        
----                 ------------         ------------                   ---------  ---------        
individual-container                      11/2/2021 5:52:08 PM +00:00                                

loop-container1                           11/2/2021 12:22:00 AM +00:00                               
loop-container2                           11/2/2021 12:22:00 AM +00:00                               

loop-container1                           11/2/2021 12:22:00 AM +00:00                               
loop-container2                           11/2/2021 12:22:00 AM +00:00
loop-container3                           11/2/2021 12:22:00 AM +00:00   True       01D7E7129FDBD7D4
loop-container4                           11/2/2021 12:22:00 AM +00:00   True       01D7E8A5EF01C787 

Lesen von Containereigenschaften und -metadaten

Ein Container macht sowohl Systemeigenschaften als auch benutzerdefinierte Metadaten verfügbar. Systemeigenschaften sind in jeder Blobspeicherressource vorhanden. Einige davon sind schreibgeschützt, während andere gelesen oder festgelegt werden können. Darüber hinaus lassen sich einige Systemeigenschaften bestimmten HTTP-Standardheadern zuordnen.

Benutzerdefinierte Metadaten bestehen aus mindestens einem Name/Wert-Paar, das Sie für eine Blobspeicherressource angeben. Metadaten können verwendet werden, um zusätzliche Werte mit der Ressource zu speichern. Metadatenwerte sind nur für Ihre eigenen Zwecke bestimmt und wirken sich nicht auf das Verhalten der Ressource aus.

Containereigenschaften

Das folgende Beispiel ruft alle Container mit dem Präfix demo ab und durchläuft sie, um ihre Eigenschaften aufzulisten.

# Create variable
 $prefix = "loop"

# Get containers
 $containers = Get-AzStorageContainer -Prefix $prefix -Context $ctx

# Iterate containers, display properties
 Foreach ($container in $containers) 
 {
    $containerProperties = $container.BlobContainerClient.GetProperties()
    Write-Host $container.Name "properties:"
    $containerProperties.Value
 }

Die Ergebnisse zeigen alle Container mit dem Präfix loop an und listen ihre Eigenschaften auf.

loop-container1 properties:

LastModified                      : 12/7/2021 7:47:17 PM +00:00
LeaseStatus                       : Unlocked
LeaseState                        : Available
LeaseDuration                     : Infinite
PublicAccess                      : 
HasImmutabilityPolicy             : False
HasLegalHold                      : False
DefaultEncryptionScope            : $account-encryption-key
PreventEncryptionScopeOverride    : False
DeletedOn                         : 
RemainingRetentionDays            : 
ETag                              : 0x8D9B9BA602806DA
Metadata                          : {}
HasImmutableStorageWithVersioning : False

loop-container2 properties:
LastModified                      : 12/7/2021 7:47:18 PM +00:00
LeaseStatus                       : Unlocked
LeaseState                        : Available
LeaseDuration                     : Infinite
PublicAccess                      : 
HasImmutabilityPolicy             : False
HasLegalHold                      : False
DefaultEncryptionScope            : $account-encryption-key
PreventEncryptionScopeOverride    : False
DeletedOn                         : 
RemainingRetentionDays            : 
ETag                              : 0x8D9B9BA605996AE
Metadata                          : {}
HasImmutableStorageWithVersioning : False

Lesen und Schreiben von Containermetadaten

Benutzer, die in ihrem Speicherkonto Tausende Objekte gespeichert haben, können bestimmte Container anhand ihrer Metadaten schnell finden. Für den Zugriff auf die Metadaten verwenden Sie das BlobContainerClient-Objekt. Mit diesem Objekt können Sie auf Container und deren Blobs zugreifen und diese bearbeiten. Zum Aktualisieren von Metadaten müssen Sie die SetMetadata()-Methode aufrufen. Die Methode akzeptiert nur Schlüssel-Wert-Paare, die in einem generischen IDictionary-Objekt gespeichert sind. Weitere Informationen finden Sie unter BlobContainerClient-Klasse.

Im folgenden Beispiel werden zunächst die Metadaten eines Containers aktualisiert und anschließend die Metadaten eines Containers abgerufen. Im Beispiel wird der Beispielcontainer aus dem Arbeitsspeicher gelöscht und erneut dann abgerufen, um sicherzustellen, dass keine Metadaten aus dem Objekt im Arbeitsspeicher gelesen werden.

# Create variable
  $containerName = "individual-container"

# Retrieve container
 $container = Get-AzStorageContainer -Name $containerName -Context $ctx

# Create IDictionary, add key-value metadata pairs to IDictionary
 $metadata = New-Object System.Collections.Generic.Dictionary"[String,String]"
 $metadata.Add("CustomerName","Anthony Bennedetto")
 $metadata.Add("CustomerDOB","08/03/1926")
 $metadata.Add("CustomerBirthplace","Long Island City")

# Update metadata
  $container.BlobContainerClient.SetMetadata($metadata, $null)

# Flush container from memory, retrieve updated container
 $container = $null
 $container = Get-AzStorageContainer -Name $containerName -Context $ctx
 
# Display metadata
 $properties = $container.BlobContainerClient.GetProperties()
 Write-Host $container.Name "metadata:" 
 Write-Host $properties.Value.Metadata

In den Ergebnissen werden die vollständigen Metadaten für einen Container angezeigt.

individual-container metadata:

[CustomerName, Anthony Bennedetto] [CustomerDOB, 08/03/1926] [CustomerBirthplace, Long Island City]

Abrufen einer Shared Access Signature für einen Container

Eine Shared Access Signature (SAS) ermöglicht delegierten Zugriff auf Azure-Ressourcen. Mit einer Shared Access Signature können Sie genau steuern, wie ein Client auf Ihre Daten zugreifen kann. Sie können beispielsweise angeben, welche Ressourcen für den Client verfügbar sind. Sie können auch die Typen von Vorgängen einschränken, die der Client ausführen kann, und den Zeitraum angeben, in dem die Aktionen ausgeführt werden können.

Eine Shared Access Signature wird häufig verwendet, um temporären und sicheren Zugriff auf einen Client zu ermöglichen, der normalerweise nicht über Berechtigungen verfügt. Ein Beispiel für dieses Szenario wäre ein Dienst, der Benutzern ermöglicht, eigene Daten in Ihr Speicherkonto zu schreiben und aus ihm zu lesen.

Azure Storage unterstützt drei Arten von Shared Access Signatures: Benutzerdelegierungs-, Dienst- und Konto-SAS. Weitere Informationen zu Shared Access Signatures finden Sie im Artikel Erstellen einer Dienst-SAS für einen Container oder Blob.

Achtung

Jeder Client, der über eine gültige SAS verfügt, kann auf Daten in Ihrem Speicherkonto zugreifen, sofern von dieser SAS zugelassen. Es ist wichtig, eine SAS vor böswilliger oder unbeabsichtigter Verwendung zu schützen. Verteilen Sie eine SAS mit Diskretion, und halten Sie einen Plan für den Widerruf einer kompromittierten SAS bereit.

Das folgende Beispiel veranschaulicht das Konfigurieren einer Dienst-SAS für einen bestimmten Container mithilfe des Cmdlets New-AzStorageContainerSASToken. Im Beispiel wird die SAS mit Start- und Ablaufzeiten und einem Protokoll konfiguriert. Darüber hinaus werden in der SAS mithilfe des Parameters -Permission Berechtigungen zum Lesen, Schreiben und Auflisten angegeben. Die vollständige Tabelle der Berechtigungen finden Sie im Artikel Erstellen einer Dienst-SAS.

# Create variables
 $accountName   = "<storage-account>"
 $containerName = "individual-container"
 $startTime     = Get-Date
 $expiryTime    = $startTime.AddDays(7)
 $permissions   = "rwl"
 $protocol      = "HttpsOnly"

# Create a context object using Azure AD credentials, retrieve container
 $ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount
 
# Approach 1: Generate SAS token for a specific container
 $sas = New-AzStorageContainerSASToken `
 -Context $ctx `
 -Name $containerName `
 -StartTime $startTime `
 -ExpiryTime $expiryTime `
 -Permission $permissions `
 -Protocol $protocol

# Approach 2: Generate SAS tokens for a container list using pipeline
  Get-AzStorageContainer -Container $filterName -Context $ctx | New-AzStorageContainerSASToken `
 -Context $ctx `
 -StartTime $startTime `
 -ExpiryTime $expiryTime `
 -Permission $permissions `
 -Protocol $protocol | Write-Output

Hinweis

Das von Blob Storage zurückgegebene SAS-Token enthält nicht das Trennzeichen („?“) für die URL-Abfragezeichenfolge. Wenn Sie das SAS-Token an eine Ressourcen-URL anfügen, denken Sie daran, auch das Trennzeichen anzufügen.

Löschen von Containern

Abhängig von Ihrem Anwendungsfall können Sie einen Container oder eine Liste von Containern mit dem Cmdlet Remove-AzStorageContainer löschen. Wenn Sie eine Liste von Containern löschen, können Sie bedingte Vorgänge, Schleifen oder die PowerShell-Pipeline nutzen, wie in den folgenden Beispielen gezeigt.

# Create variables
 $accountName    = "<storage-account>"
 $containerName  = "individual-container"
 $prefixName     = "loop-"

# Delete a single named container
 Remove-AzStorageContainer -Name $containerName -Context $ctx

# Iterate a loop, deleting containers
 for ($i = 1; $i -le 2; $i++) { 
     Remove-AzStorageContainer -Name (-join($containerPrefix, $i)) -Context $ctx
    } 

# Retrieve container list, delete using a pipeline
 Get-AzStorageContainer -Prefix $prefixName -Context $ctx | Remove-AzStorageContainer

In einigen Fällen können Container abgerufen werden,die gelöscht wurden. Wenn die Datenschutzoption für vorläufiges Löschen in Ihrem Speicherkonto aktiviert ist, gibt der Parameter -IncludeDeleted Container zurück, die innerhalb des zugewiesenen Aufbewahrungszeitraums gelöscht wurden. Der Parameter -IncludeDeleted kann nur in Verbindung mit dem -Prefix-Parameter verwendet werden, wenn eine Liste von Containern zurückgeben wird. Weitere Informationen zum vorläufigen Löschen finden Sie im Artikel Vorläufiges Löschen für Container.

Verwenden Sie das folgende Beispiel, um eine Liste von Containern abzurufen, die innerhalb des zugewiesenen Aufbewahrungszeitraums des Speicherkontos gelöscht wurden.

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

Wiederherstellen eines vorläufig gelöschten Containers

Wie im Abschnitt Auflisten von Containern erwähnt, können Sie die Datenschutzoption für das vorläufige Löschen in Ihrem Speicherkonto konfigurieren. Wenn diese Option aktiviert ist, können Container, die innerhalb des zugewiesenen Aufbewahrungszeitraums gelöscht wurden, wiederhergestellt werden.

In den folgenden Beispielen wird erläutert, wie ein vorläufig gelöschter Container mit dem Cmdlet Restore-AzStorageContainer wiederhergestellt wird. Bevor Sie dieses Beispiel nutzen können, müssen Sie die Option für das vorläufige Löschen aktivieren und für mindestens eines Ihrer Speicherkonten konfigurieren.

Weitere Informationen zur Datenschutzoption für vorläufiges Löschen finden Sie im Artikel Vorläufiges Löschen für Container.

# Create variables
 $accountName = "<storage-account>"
 $prefixName  = "loop-"

# Create a context object using Azure AD credentials
 $ctx = New-AzStorageContext -StorageAccountName $accountName -UseConnectedAccount

# Retrieve all containers, filter deleted containers, restore deleted containers
 Get-AzStorageContainer -Prefix $prefixName -IncludeDeleted `
    -Context $ctx | ? { $_.IsDeleted } | Restore-AzStorageContainer

In den Ergebnissen werden alle Container mit dem Präfix demo angezeigt, die wiederhergestellt wurden.

    Storage Account Name: demostorageaccount

Name                 PublicAccess         LastModified                   IsDeleted  VersionId        
----                 ------------         ------------                   ---------  ---------        
loop-container3                                                                                       
loop-container4               

Siehe auch