Управление контейнерами BLOB-объектов с помощью PowerShell
В Хранилище BLOB-объектов Azure могут быть размещены большие объемы неструктурированных данных объектов. С помощью Хранилища BLOB-объектов можно собирать данные мультимедиа, содержимое и данные приложений и предоставлять все эти данные пользователям. Так как все данные BLOB-объектов хранятся в контейнерах, перед началом отправки данных необходимо создать контейнер хранилища. Дополнительные сведения о Хранилище BLOB-объектов см. в статье Общие сведения о хранилище BLOB-объектов Azure.
В этой статье объясняется, как работать с одиночными и множественными объектами контейнера хранилища.
Необходимые компоненты
Подписка Azure. См. страницу бесплатной пробной версии Azure.
Модуль Az Azure PowerShell, который является рекомендуемым модулем PowerShell для взаимодействия с Azure. Чтобы начать работу с модулем Az PowerShell, ознакомьтесь со статьей Установка Azure PowerShell.
Чтобы использовать примеры из этой статьи, необходимо получить авторизацию для подписки 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