Powershell подключается к BLOB-объекту Azure, используя SAS вместо ключа
У меня есть сценарий, который работает для получения файла из BLOB-объекта на основе имени и ключа учетной записи хранения (что, как я понимаю, не является хорошим решением), во временное хранилище. Я пытаюсь сделать то же самое (получить тот же файл), но вместо этого использую токен SAS. В учетной записи хранения есть контейнер с именем "Autoparams", а затем в этом контейнере находится файл с именем "nsgscript.ps1".
Я сгенерировал токен SAS для контейнера, но не смог найти способ сгенерировать токен для всей учетной записи хранения; это должно было быть на уровне контейнера ниже (отдельный файл).
Итак, старый сценарий (который работает) был:
$StorageAccountName = "storagename"
$StorageAccountKey = "abcdefghijkstorageaccountkeyhere"
$ContainerName = "automationparams"
$Blob1Name = "nsgscript.ps1"
$TargetFolderPath = ($env:TEMP)
$context = New-AzureStorageContext `
-StorageAccountName $StorageAccountName `
-StorageAccountKey $StorageAccountKey
$result = Get-AzureStorageBlobContent `
-Blob $Blob1Name `
-Container $ContainerName `
-Context $context `
-Destination $TargetFolderPath
Это приведет к загрузке файла nsgscript.ps1 в контейнере automaparams в учетной записи хранения storageName.
Вот скрипт, который я пытаюсь получить, который получает текст хранения с помощью токена SAS:
$StorageAccountName = "storagename"
$Blob1Name = "nsgscript.ps1"
$TargetFolderPath = ($env:TEMP)
$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -SASToken "https://storagelocation.blob.core.windows.net/automationparams?st=2018-10-25T19%3A57%3A00Z&se=2020-10-26T19%3A57%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=abcdefghijklmnorestofkey"
$result = Get-AzureStorageBlobContent `
-Blob $Blob1Name `
-Container $ContainerName `
-Context $context `
-Destination $TargetFolderPath
Когда я запускаю это, я получаю это сообщение об ошибке: Get-AzureStorageBlobContent: удаленный сервер возвратил ошибку: (403) Запрещено. Код состояния HTTP: 403 - Сообщение об ошибке HTTP: серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись. В строке:1 символ:11
Есть идеи?
2 ответа
Я могу правильно запустить твои скрипы на моей стороне. Вы можете проверить следующее на вашей стороне.
- Убедитесь, что вы используете токен уровня учетной записи хранения SAS, его можно найти на странице учетной записи хранения, нажмите "Создать SAS и строку подключения". Затем скопируйте токен SAS в свои скрипты.
- Обновите модуль AzureRM до последней версии. Командлеты Powershell работают на 5.5.0 и более поздних версиях.
- Добавьте параметр -debug, чтобы найти некоторые подсказки в журнале отладки.
Для более подробной информации, вы можете увидеть этот вопрос.
Я считаю, что проблема заключается в том, что вы указываете URL в SAS Token
$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -SASToken "https://storagelocation.blob.core.windows.net/automationparams?st=2018-10-25T19%3A57%3A00Z&se=2020-10-26T19%3A57%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=abcdefghijklmnorestofkey"
Попробуйте заменить приведенный выше код следующим:
$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -SASToken "st=2018-10-25T19%3A57%3A00Z&se=2020-10-26T19%3A57%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=abcdefghijklmnorestofkey"