#azure #powershell #azure-blob-storage
Вопрос:
Я пытаюсь использовать участника службы для доступа и отображения содержимого контейнера для хранения Azure с помощью PowerShell. Я смог получить токен для участника службы и использовать его для доступа к учетной записи хранилища, но когда я запускаю эту команду
$iwrParams = @{
'Uri' = 'https://myaccount.blob.core.windows.net/mycontainer?restype=containeramp;comp=list'
'UseBasicParsing' = $true
'ContentType' = 'application/xml'
'Headers' = @{
'Authorization' = "Bearer $($token.access_token)"
'x-ms-version' = '2017-11-09'
}
}
Invoke-WebRequest @iwrParams
Я получаю возврат от этого, но возвращаемый XML-контент никогда не показывает URL-адрес для каждого возвращаемого большого двоичного объекта. Если вы посмотрите на возврат в https://docs.microsoft.com/en-us/rest/api/storageservices/enumerating-blob-resources#list-blobs-and-snapshots это показывает, что для каждого большого двоичного объекта он должен возвращать имя, URL-адрес и различные другие свойства. Когда я запускаю приведенный выше код, я получаю все, кроме URL.
Теперь действительно интересно, что если я изменю доступ к контейнеру на анонимный общедоступный и выполню этот код, я получу URL, возвращенный, как и ожидалось.
$iwrParams = @{
'Uri' = 'https://myaccount.blob.core.windows.net/mycontainer?comp=list'
'UseBasicParsing' = $true
'ContentType' = 'application/xml'
}
Invoke-WebRequest @iwrParams
Честно говоря, проблема заключается в том, что ее необходимо включать restype=container
при доступе с помощью любого вида аутентификации.
Мой вопрос в том, знает ли кто-нибудь способ получить URL-адрес для каждого возвращаемого большого двоичного объекта, если не используется анонимный доступ к содержимому контейнера списка?
Я бы хотел сделать это, не прибегая к модулям Az.
Ответ №1:
Причина, по которой вы не можете увидеть возвращаемый URL-адрес в ответе, заключается в версии API REST API хранилища, используемой вашим code ( 2017-11-09
). По сути Blob URL
, свойство было удалено из ответа, начиная с версии REST API 2013-08-15
. Из этого link
:
В версии 2013-08-15 и новее элемент EnumerationResults содержит атрибут ServiceEndpoint, указывающий конечную точку большого двоичного объекта, и поле ContainerName, указывающее имя контейнера. В предыдущих версиях эти два атрибута были объединены вместе в поле ContainerName . Также в версии 2013-08-15 и новее элемент Url в Blob-объекте был удален.
Что касается вашего комментария о том, почему вы можете видеть свойство URL, если вы перечисляете большие двоичные объекты анонимно, это происходит потому, что, если в запросе не указана версия REST API, служба хранения использует самую старую версию REST API для обработки запроса, если версия по умолчанию не установлена. Из этого link
:
Если в анонимном запросе к учетной записи хранилища общего назначения не указан заголовок x-ms-version, а версия по умолчанию для службы не была установлена с помощью Set Blob Свойства службы, то служба использует самую раннюю возможную версию для обработки запроса.
Учитывая, что вы хотели бы использовать авторизацию на основе Azure AD, самая ранняя версия, которую вы сможете использовать, — это 2017-11-09
то, что будет невозможно вернуть URL-адрес большого двоичного объекта в теле ответа.
Одним из вариантов было бы вручную создать URL-адрес большого двоичного объекта, используя URL-адрес контейнера больших двоичных объектов и имя большого двоичного объекта. Другим вариантом было бы использовать Shared Key Authorization
вместо авторизации Azure AD и указывать версию раньше, чем 2013-08-15
для x-ms-version
заголовка запроса в ваших запросах. В этом случае вам нужно будет вручную вычислить Authorization
значение заголовка, используя предоставленные инструкции here
.