Zarządzanie kontenerami obiektów blob przy użyciu programu PowerShell

Usługa Azure Blob Storage umożliwia przechowywanie dużych ilości danych obiektów bez struktury. Magazyn obiektów blob służy do zbierania lub uwidaczniania danych multimediów, zawartości lub aplikacji dla użytkowników. Ponieważ wszystkie dane obiektów blob są przechowywane w kontenerach, przed rozpoczęciem przekazywania danych należy utworzyć kontener magazynu. Aby dowiedzieć się więcej na temat magazynu obiektów blob, przeczytaj wprowadzenie do usługi Azure Blob Storage.

W tym artykule z instrukcjami wyjaśniono, jak pracować z pojedynczymi i wieloma obiektami kontenera magazynu.

Wymagania wstępne

Przed użyciem przykładów w tym artykule musisz uzyskać autoryzację do subskrypcji platformy Azure. Autoryzacja może wystąpić, uwierzytelniając się przy użyciu konta Microsoft Entra lub używając klucza współużytkowanego. Przykłady w tym artykule używają uwierzytelniania Microsoft Entra w połączeniu z obiektami kontekstu. Obiekty kontekstowe hermetyzują poświadczenia firmy Microsoft Entra i przekazują je do kolejnych operacji danych, eliminując konieczność ponownego uwierzytelnienia.

Aby zalogować się do konta platformy Azure przy użyciu konta Microsoft Entra, otwórz program PowerShell i wywołaj polecenie cmdlet Połączenie-AzAccount.

# Connect to your Azure subscription
 Connect-AzAccount

Po nawiązaniu połączenia utwórz kontekst konta magazynu, wywołując New-AzStorageContext polecenie cmdlet . Dołącz parametr , -UseConnectedAccount aby operacje na danych były wykonywane przy użyciu poświadczeń firmy Microsoft Entra.

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

Pamiętaj, aby zastąpić wartości symboli zastępczych w nawiasach własnymi wartościami. Aby uzyskać więcej informacji na temat logowania się do platformy Azure przy użyciu programu PowerShell, zobacz Logowanie się przy użyciu programu Azure PowerShell.

Tworzenie kontenera

Aby utworzyć kontenery za pomocą programu PowerShell, wywołaj polecenie cmdlet New-AzStorageContainer . Nie ma żadnych ograniczeń liczby obiektów blob ani kontenerów, które można utworzyć na koncie magazynu. Kontenery nie mogą być zagnieżdżone w innych kontenerach.

Poniższy przykład ilustruje trzy opcje tworzenia kontenerów obiektów blob za New-AzStorageContainer pomocą polecenia cmdlet . Pierwsze podejście tworzy pojedynczy kontener, podczas gdy pozostałe dwa podejścia wykorzystują operacje programu PowerShell do automatyzowania tworzenia kontenerów.

Aby użyć tego przykładu, podaj wartości zmiennych i upewnij się, że utworzono połączenie z subskrypcją platformy Azure. Pamiętaj, aby zastąpić wartości symboli zastępczych w nawiasach własnymi wartościami.

# 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

Wynik zawiera nazwę konta magazynu i potwierdza utworzenie nowego kontenera.

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          

Wyświetlanie listy kontenerów

Użyj polecenia cmdlet , Get-AzStorageContainer aby pobrać kontenery magazynu. Aby pobrać pojedynczy kontener, dołącz -Name parametr . Aby zwrócić listę kontenerów rozpoczynających się od danego ciągu znaków, określ wartość parametru -Prefix.

Poniższy przykład pobiera zarówno pojedynczy kontener, jak i listę zasobów kontenera.

# 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

Wynik zawiera identyfikator URI punktu końcowego obiektu blob i wyświetla listę kontenerów pobranych według nazwy i prefiksu.

   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 

Odczytywanie właściwości i metadanych kontenera

Kontener uwidacznia zarówno właściwości systemu, jak i metadane zdefiniowane przez użytkownika. Właściwości systemu istnieją w każdym zasobie magazynu obiektów blob. Niektóre właściwości są tylko do odczytu, podczas gdy inne mogą być odczytywane lub ustawiane. Pod osłonami niektóre właściwości systemu są mapowanie na niektóre standardowe nagłówki HTTP.

Metadane zdefiniowane przez użytkownika składają się z co najmniej jednej pary nazwa-wartość określonej dla zasobu magazynu obiektów blob. Za pomocą metadanych można przechowywać dodatkowe wartości z zasobem. Wartości metadanych są przeznaczone tylko do własnych celów i nie mają wpływu na zachowanie zasobu.

Właściwości kontenera

Poniższy przykład pobiera wszystkie kontenery z prefiksem pokazu i wykonuje iterację po nich, wyświetlając ich właściwości.

# 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
 }

Wyniki wyświetlają wszystkie kontenery z pętlą prefiksu i wyświetlają ich właściwości.

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

Odczytywanie i zapisywanie metadanych kontenera

Użytkownicy, którzy mają wiele tysięcy obiektów na koncie magazynu, mogą szybko zlokalizować określone kontenery na podstawie ich metadanych. Aby uzyskać dostęp do metadanych, użyjesz BlobContainerClient obiektu . Ten obiekt umożliwia uzyskiwanie dostępu do kontenerów i ich obiektów blob oraz manipulowanie nimi. Aby zaktualizować metadane, należy wywołać metodę SetMetadata() . Metoda akceptuje tylko pary klucz-wartość przechowywane w obiekcie ogólnym IDictionary . Aby uzyskać więcej informacji, zobacz klasę BlobContainerClient

Poniższy przykład najpierw aktualizuje metadane kontenera, a następnie pobiera metadane kontenera. Przykład opróżnia przykładowy kontener z pamięci i pobiera go ponownie, aby upewnić się, że metadane nie są odczytywane z obiektu w pamięci.

# 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

Wyniki zawierają pełne metadane dla kontenera.

individual-container metadata:

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

Uzyskiwanie sygnatury dostępu współdzielonego dla kontenera

Sygnatura dostępu współdzielonego (SAS) zapewnia delegowany dostęp do zasobów platformy Azure. Sygnatura dostępu współdzielonego zapewnia szczegółową kontrolę nad sposobem uzyskiwania dostępu do danych przez klienta. Można na przykład określić, które zasoby są dostępne dla klienta. Można również ograniczyć typy operacji, które klient może wykonać, i określić czas, dla którego można wykonać akcje.

Sygnatura dostępu współdzielonego jest często używana do zapewnienia tymczasowego i bezpiecznego dostępu do klienta, który normalnie nie ma uprawnień. Przykładem tego scenariusza jest usługa, która umożliwia użytkownikom odczytywanie i zapisywanie własnych danych na koncie magazynu.

Usługa Azure Storage obsługuje trzy typy sygnatur dostępu współdzielonego: delegowanie użytkownika, usługę i sygnaturę dostępu współdzielonego konta. Aby uzyskać więcej informacji na temat sygnatur dostępu współdzielonego, zobacz artykuł Tworzenie sygnatury dostępu współdzielonego usługi dla kontenera lub obiektu blob .

Uwaga

Każdy klient, który posiada prawidłową sygnaturę dostępu współdzielonego, może uzyskać dostęp do danych na koncie magazynu zgodnie z zezwoleniem na ten sygnaturę dostępu współdzielonego. Ważne jest, aby chronić sygnaturę dostępu współdzielonego przed złośliwym lub niezamierzonym użyciem. Użyj uznania w dystrybucji sygnatury dostępu współdzielonego i zaplanuj odwołanie naruszonej sygnatury dostępu współdzielonego.

Poniższy przykład ilustruje proces konfigurowania sygnatury dostępu współdzielonego usługi dla określonego kontenera New-AzStorageContainerSASToken przy użyciu polecenia cmdlet . W przykładzie zostanie skonfigurowana sygnatura dostępu współdzielonego z czasem rozpoczęcia i wygaśnięcia oraz protokołem. Określi również uprawnienia do odczytu, zapisu i listy w sygnaturze dostępu współdzielonego przy użyciu parametru -Permission . Pełną tabelę uprawnień można uzyskać w artykule Tworzenie sygnatury dostępu współdzielonego usługi .

# 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

Uwaga

Token SAS zwrócony przez usługę Blob Storage nie zawiera znaku ogranicznika ('?') dla ciągu zapytania adresu URL. Jeśli dołączasz token SAS do adresu URL zasobu, pamiętaj, aby również dołączyć znak ogranicznika.

Usuwanie kontenerów

W zależności od przypadku użycia można usunąć kontener lub listę kontenerów za Remove-AzStorageContainer pomocą polecenia cmdlet . Podczas usuwania listy kontenerów można korzystać z operacji warunkowych, pętli lub potoku programu PowerShell, jak pokazano w poniższych przykładach.

# 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

W niektórych przypadkach można pobrać kontenery, które zostały usunięte. Jeśli opcja ochrony danych usuwania nietrwałego konta magazynu jest włączona, -IncludeDeleted parametr zwróci kontenery usunięte w skojarzonym okresie przechowywania. Parametr -IncludeDeleted można używać tylko w połączeniu z parametrem -Prefix podczas zwracania listy kontenerów. Aby dowiedzieć się więcej na temat usuwania nietrwałego, zapoznaj się z artykułem Usuwanie nietrwałe dla kontenerów .

Skorzystaj z poniższego przykładu, aby pobrać listę kontenerów usuniętych w skojarzonym okresie przechowywania konta magazynu.

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

Przywracanie kontenera usuniętego nietrwale

Jak wspomniano w sekcji Wyświetlanie kontenerów , możesz skonfigurować opcję ochrony danych usuwania nietrwałego na koncie magazynu. Po włączeniu można przywrócić kontenery usunięte w skojarzonym okresie przechowywania.

W poniższym przykładzie wyjaśniono, jak przywrócić kontener usunięty nietrwale za Restore-AzStorageContainer pomocą polecenia cmdlet . Zanim będzie można skorzystać z tego przykładu, musisz włączyć usuwanie nietrwałe i skonfigurować je na co najmniej jednym z kont magazynu.

Aby dowiedzieć się więcej na temat opcji ochrony danych usuwania nietrwałego, zapoznaj się z artykułem Usuwanie nietrwałe dla kontenerów .

# 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

Wyniki zawierają wszystkie kontenery z pokazem prefiksu, który został przywrócony.

    Storage Account Name: demostorageaccount

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

Zobacz też