Condividi tramite


Gestire i contenitori BLOB con PowerShell

Archiviazione BLOB di Azure consente di archiviare grandi quantità di dati di oggetti non strutturati. È possibile usare l'archiviazione BLOB per raccogliere o esporre file multimediali, contenuti o applicazioni per gli utenti. Poiché tutti i dati BLOB vengono archiviati all'interno di contenitori, è necessario creare un contenitore di archiviazione prima di iniziare a caricare i dati. Per altre informazioni su archiviazione BLOB, leggere l'Introduzione all'archiviazione BLOB di Azure.

Questo articolo illustra come usare oggetti contenitore di archiviazione singoli e multipli.

Prerequisiti

È necessario ottenere l'autorizzazione per una sottoscrizione di Azure prima di poter usare gli esempi in questo articolo. L'autorizzazione può essere concessa eseguendo l'autenticazione con un account Microsoft Entra o usando una chiave condivisa. Gli esempi in questo articolo usano l'autenticazione di Microsoft Entra insieme ai contesti di ambiente. I contesti di ambiente incapsulano le credenziali di Microsoft Entra e le passano alle successive operazioni sui dati, rimuovendo la necessità di effettuare una nuova autenticazione.

Per accedere all'account Azure con un account Microsoft Entra, aprire PowerShell e chiamare il cmdletConnect-AzAccount.

# Connect to your Azure subscription
 Connect-AzAccount

Dopo aver stabilito la connessione, creare il contesto dell'account di archiviazione chiamando il cmdlet New-AzStorageContext. Includere il parametro -UseConnectedAccount in modo che le operazioni sui dati vengano eseguite usando le credenziali di Microsoft Entra.

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

Ricordare di sostituire i valori segnaposto tra parentesi con i valori personalizzati. Per altre informazioni sull'accesso ad Azure con PowerShell, vedere Accedere con Azure PowerShell.

Creazione di un contenitore

Per creare contenitori con PowerShell, chiamare il cmdlet New-AzStorageContainer. Non esistono limiti al numero di BLOB o contenitori che è possibile creare all'interno di un account di archiviazione. I contenitori non possono essere annidati all'interno di altri contenitori.

Nell'esempio seguente vengono illustrate tre opzioni per la creazione di contenitori BLOB con il cmdlet New-AzStorageContainer. Il primo approccio crea un singolo contenitore, mentre i due approcci rimanenti sfruttano le operazioni di PowerShell per automatizzare la creazione di contenitori.

Per usare questo esempio, specificare i valori per le variabili e assicurarsi di aver creato una connessione alla sottoscrizione di Azure. Ricordare di sostituire i valori segnaposto tra parentesi con i valori personalizzati.

# 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

Il risultato fornisce il nome dell'account di archiviazione e conferma la creazione del nuovo contenitore.

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          

Elencare i contenitori

Usare il cmdlet Get-AzStorageContainer per recuperare i contenitori di archiviazione. Per recuperare un singolo contenitore, includere il parametro -Name. Per restituire un elenco di contenitori che inizia con una determinata stringa di caratteri, specificare un valore per il parametro -Prefix.

Nell'esempio seguente vengono recuperati sia un singolo contenitore che un elenco di risorse del contenitore.

# 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

Il risultato fornisce l'URI dell'endpoint BLOB ed elenca i contenitori recuperati per nome e prefisso.

   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 

Leggere i metadati e le proprietà del contenitore

Un contenitore restituisce sia le proprietà di sistema che i metadati definiti dall'utente. Le proprietà di sistema esistono su ogni risorsa di archiviazione BLOB. Alcune proprietà sono di sola lettura, mentre altre possono essere lette o impostate. Anche se in modo non esplicito, alcune proprietà di sistema eseguono il mapping a determinate intestazioni HTTP standard.

I metadati definiti dall'utente sono costituiti da una o più coppie nome-valore specificate per una risorsa di archiviazione BLOB. È possibile usare i metadati per archiviare valori aggiuntivi con la risorsa. I valori dei metadati sono solo per gli scopi dell'utente e non influiscono sul comportamento della risorsa.

Proprietà del contenitore

Nell'esempio seguente vengono recuperati tutti i contenitori con il prefisso demo e ne viene eseguita l'iterazione, elencando le relative proprietà.

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

I risultati visualizzano tutti i contenitori con il prefisso loop (ciclo) ed elencano le relative proprietà.

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

Leggere e scrivere i metadati del contenitore

Gli utenti che hanno molte migliaia di oggetti all'interno dell'account di archiviazione possono individuare rapidamente contenitori specifici in base ai metadati. Per accedere ai metadati, si userà l'oggetto BlobContainerClient. Questo oggetto consente di accedere e modificare i contenitori e i relativi BLOB. Per aggiornare i metadati, è necessario chiamare il metodo SetMetadata(). Il metodo accetta solo coppie chiave-valore archiviate in un oggetto generico IDictionary. Per altre informazioni, vedere la classe BlobContainerClient

L'esempio seguente aggiorna prima i metadati di un contenitore e successivamente recupera i metadati di un contenitore. L'esempio scarica il contenitore di esempio dalla memoria e lo recupera nuovamente per assicurarsi che i metadati non vengano letti dall'oggetto in memoria.

# 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

I risultati visualizzano i metadati completi per un contenitore.

individual-container metadata:

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

Ottenere una firma di accesso condiviso per un contenitore

Una firma di accesso condiviso fornisce l'accesso delegato alle risorse di Azure. Una firma di accesso condiviso offre un controllo granulare sul modo in cui un client può accedere ai dati. Ad esempio, è possibile specificare le risorse disponibili per il client. È anche possibile limitare i tipi di operazioni che il client può eseguire e specificare la quantità di tempo per cui è possibile eseguire le azioni.

Una firma di accesso condiviso viene comunemente usata per fornire l'accesso temporaneo e sicuro a un client che normalmente non dispone delle autorizzazioni. Un esempio di questo scenario è un servizio che consente agli utenti di leggere e scrivere i propri dati nell'account di archiviazione.

Archiviazione di Azure supporta tre tipi di firme di accesso condiviso: delega utente, servizio e firma di accesso condiviso dell'account. Per altre informazioni sulle firme di accesso condiviso, vedere l'articolo Creare una firma di accesso condiviso del servizio per un contenitore o un BLOB.

Attenzione

Qualsiasi client che disponga di una firma di accesso condiviso valida può accedere ai dati nell'account di archiviazione, in base alle autorizzazioni di tale firma. È importante proteggere una firma di accesso condiviso da eventi dannosi o imprevisti. Prestare attenzione durante la distribuzione di una firma di accesso condiviso e predisporre un piano di revoca di eventuali firme di accesso condiviso compromesse.

L'esempio seguente illustra il processo di configurazione di una firma di accesso condiviso del servizio per un contenitore specifico usando il cmdlet New-AzStorageContainerSASToken. L'esempio configurerà la firma di accesso condiviso con orari di inizio e scadenza e un protocollo. Specifica inoltre le autorizzazioni di lettura, scrittura, elenco nella firma di accesso condiviso usando il parametro -Permission. È possibile fare riferimento alla tabella completa delle autorizzazioni nell'articolo Creare una firma di accesso condiviso del servizio.

# 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

Nota

Il token di firma di accesso condiviso restituito da Archiviazione BLOB non include il carattere delimitatore ('?') per la stringa di query URL. Se si aggiunge il token di firma di accesso condiviso a un URL della risorsa, ricordarsi di aggiungere anche il carattere delimitatore.

Eliminare i contenitori

A seconda del caso d'uso, è possibile eliminare un contenitore o un elenco di contenitori con il cmdlet Remove-AzStorageContainer. Quando si elimina un elenco di contenitori, è possibile sfruttare le operazioni condizionali, i cicli o la pipeline di PowerShell, come illustrato negli esempi seguenti.

# 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 alcuni casi, è possibile recuperare i contenitori eliminati. Se l'opzione di protezione dei dati di eliminazione temporanea dell'account di archiviazione è abilitata, il parametro -IncludeDeleted restituirà i contenitori eliminati entro il periodo di conservazione associato. Il parametro -IncludeDeleted può essere usato solo insieme al parametro -Prefix quando restituisce un elenco di contenitori. Per altre informazioni sull'eliminazione temporanea, vedere l'articolo Eliminazione temporanea per contenitori.

Considerare l'esempio seguente per recuperare un elenco di contenitori eliminati entro il periodo di conservazione associato all'account di archiviazione.

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

Ripristinare un contenitore eliminato predefinito

Come indicato nella sezione Contenitori di elenco, è possibile configurare l'opzione di protezione dei dati di eliminazione temporanea nell'account di archiviazione. Se abilitata, è possibile ripristinare i contenitori eliminati entro il periodo di conservazione associato.

Nell'esempio seguente viene illustrato come ripristinare un contenitore eliminato predefinito con il cmdlet Restore-AzStorageContainer. Prima di seguire questo esempio, è necessario abilitare l'eliminazione temporanea e configurarla in almeno uno degli account di archiviazione.

Per altre informazioni sull'opzione di protezione dei dati di eliminazione temporanea, vedere l'articolo Eliminazione temporanea per contenitori.

# 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

I risultati visualizzano tutti i contenitori con il prefisso demo che sono stati ripristinati.

    Storage Account Name: demostorageaccount

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

Vedi anche