Управление контейнерами BLOB-объектов с помощью PowerShell

В Хранилище BLOB-объектов Azure могут быть размещены большие объемы неструктурированных данных объектов. С помощью Хранилища BLOB-объектов можно собирать данные мультимедиа, содержимое и данные приложений и предоставлять все эти данные пользователям. Так как все данные BLOB-объектов хранятся в контейнерах, перед началом отправки данных необходимо создать контейнер хранилища. Дополнительные сведения о Хранилище BLOB-объектов см. в статье Общие сведения о хранилище BLOB-объектов Azure.

В этой статье объясняется, как работать с одиночными и множественными объектами контейнера хранилища.

Необходимые компоненты

Чтобы использовать примеры из этой статьи, необходимо получить авторизацию для подписки Azure. Авторизация может возникать путем проверки подлинности с помощью учетной записи Microsoft Entra или с помощью общего ключа. Примеры, приведенные в этой статье, используют проверку подлинности Microsoft Entra в сочетании с объектами контекста. Объекты контекста инкапсулируют учетные данные Microsoft Entra и передают их при последующих операциях данных, устраняя необходимость повторной проверки подлинности.

Чтобы войти в учетную запись Azure с помощью учетной записи Microsoft Entra, откройте PowerShell и вызовите командлет Подключение-AzAccount.

# Connect to your Azure subscription
 Connect-AzAccount

После того как подключение будет установлено, создайте контекст учетной записи хранения, вызвав командлет New-AzStorageContext. -UseConnectedAccount Включите параметр, чтобы операции с данными выполнялись с помощью учетных данных Microsoft Entra.

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

Не забудьте заменить значения заполнителей в скобках собственными значениями. Дополнительные сведения о входе в Azure с помощью PowerShell см. в разделе Вход с помощью Azure PowerShell.

Создание контейнера

Чтобы создать контейнеры с помощью PowerShell, вызовите командлет New-AzStorageContainer. Количество BLOB-объектов или контейнеров, которые можно создать в учетной записи хранения, не ограничено. Контейнеры не могут быть созданы внутри других контейнеров.

В следующем примере показано три варианта создания контейнеров BLOB-объектов с помощью командлета New-AzStorageContainer. В первом варианте создается один контейнер, а двух других создание контейнера автоматизируется с помощью операций PowerShell.

Чтобы использовать этот пример, укажите необходимые значения для переменных и убедитесь, что вы создали подключение к подписке Azure. Не забудьте заменить значения заполнителей в скобках собственными значениями.

# 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

Результат содержит имя учетной записи хранения и подтверждает создание нового контейнера.

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          

Перечисление контейнеров

Для получения контейнеров хранилища используйте командлет Get-AzStorageContainer. Чтобы получить один контейнер, укажите параметр -Name. Чтобы получить список контейнеров, названия которых начинаются с заданной строки символов, укажите значение для параметра -Prefix.

В следующем примере извлекаются как отдельный контейнер, так и список ресурсов контейнера.

# 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

Результат содержит URI конечной точки BLOB-объекта и список контейнеров, полученных по имени и префиксу.

   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 

Чтение свойств и метаданных контейнера

Контейнер содержит как системные свойства, так и пользовательские метаданные. Системные свойства есть у каждого ресурса Хранилища BLOB-объектов. Некоторые свойства доступны только для чтения, а другие можно прочитать и записать. На самом деле, некоторые системные свойства соответствуют определенным стандартным заголовкам HTTP.

Определяемые пользователем метаданные состоят из одной или нескольких пар "имя-значение", которые можно указать для ресурса Хранилища BLOB-объектов. Вы можете использовать метаданные для хранения дополнительных значений с помощью ресурса хранилища. Значения метаданных предназначены только для ваших собственных целей и не влияют на поведение ресурса.

Свойства контейнера

В следующем примере извлекаются все контейнеры с префиксом demo и выполняется перебор контейнеров с получением их свойств.

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

Результаты содержат все контейнеры с префиксом loop и их свойства.

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

Чтение и запись метаданных контейнера

Пользователи, в учетных записях хранения которых содержится несколько тысяч объектов, могут быстро найти нужные контейнеры по их метаданным. Для доступа к метаданным используется объект BlobContainerClient. Этот объект позволяет получать доступ к контейнерам и их BLOB-объектам и управлять ими. Чтобы обновить метаданные, необходимо вызвать метод SetMetadata(). Этот метод принимает только пары "ключ-значение", хранящиеся в общем объекте IDictionary. Дополнительные сведения см. в разделе, посвященном классу BlobContainerClient.

В примере ниже сначала обновляются, а затем извлекаются метаданные контейнера. Пример контейнера из памяти очищается, а затем извлекается снова, чтобы подтвердить, что метаданные не считываются из объекта в памяти.

# 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

В результатах отображаются полные метаданные контейнера.

individual-container metadata:

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

Получение подписанного URL-адреса для контейнера

Подписанный URL-адрес (SAS) предоставляет делегированный доступ к ресурсам Azure. Благодаря SAS вы получаете детальный контроль над тем, как клиент может обращаться к вашим данным. Например, вы можете указать, какие ресурсы будут доступны клиенту. Вы также можете ограничить типы операций, которые может выполнять клиент, и указать допустимую продолжительность выполнения операций.

SAS обычно используется для предоставления временного и безопасного доступа клиенту, у которого нет разрешений. Примером такого сценария может быть служба, которая позволяет пользователям считывать свои данные из вашей учетной записи хранения и записывать данные в эту учетную запись.

Служба хранилища Azure поддерживает три типа подписанных URL-адресов: SAS делегирования пользователя, SAS службы и SAS учетной записи. Дополнительные сведения о подписанных URL-адресах см. в статье Создание подписанного URL-адреса службы для контейнера или BLOB-объекта.

Внимание

Любой клиент, обладающий действительным SAS, может получить доступ к данным в вашей учетной записи хранения в соответствии с тем, как это допускается этим SAS. Важно обеспечить для SAS защиту от вредоносного или непреднамеренного использования. Распространять SAS нужно с осторожность и следует подготовить план для отзыва скомпрометированного SAS.

В следующем примере показано, как настроить SAS службы для определенного контейнера с помощью командлета New-AzStorageContainerSASToken. В этом примере для SAS будут заданы время начала и окончания срока действия, а также протокол. Также будут заданы разрешения на чтение, запись и получение списка в SAS с помощью параметра -Permission. Полный список разрешений можно найти в статье Создание 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

Примечание.

Маркер SAS, возвращаемый служба хранилища BLOB-объектов, не включает символ разделителя ('?') для строки запроса URL-адреса. Если вы добавляете маркер SAS к URL-адресу ресурса, не забудьте также добавить символ разделителя.

Удаление контейнеров

В зависимости от вашего варианта использования вы можете удалить контейнер или список контейнеров с помощью командлета Remove-AzStorageContainer. При удалении списка контейнеров можно использовать условные операции, циклы или конвейер PowerShell, как показано в примерах ниже.

# 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

В некоторых случаях можно восстановить удаленные контейнеры. Если в вашей учетной записи хранения включена защита данных с помощью обратимого удаления, то при указании параметра -IncludeDeleted будут возвращены контейнеры, удаленные в течение связанного периода хранения. Параметр -IncludeDeleted можно использовать только в сочетании с параметром -Prefix при возврате списка контейнеров. Дополнительные сведения об обратимом удалении см. в статье Обратимое удаление для контейнеров.

Используйте следующий пример, чтобы получить список контейнеров, удаленных в течение связанного периода хранения для учетной записи хранения.

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

Восстановление обратимо удаленного контейнера

Как уже упоминалось в разделе Перечисление контейнеров, вы можете настроить защиту данных с помощью обратимого удаления в учетной записи хранения. Если такая защита данных включена, то вы сможете восстановить контейнеры, удаленные в течение связанного периода хранения.

В следующем примере объясняется, как восстановить контейнер, к которому было применено обратимое удаление, с помощью командлета Restore-AzStorageContainer. Прежде чем использовать этот пример, необходимо включить обратимое удаление и настроить его по крайней мере в одной из ваших учетных записей хранения.

Дополнительные сведения о защите данных с помощью обратимого удаления см. в статье Обратимое удаление для контейнеров.

# 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

Результаты содержат все контейнеры с префиксом demo, которые были восстановлены.

    Storage Account Name: demostorageaccount

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

См. также