Хранилище Azure - создание токена SAS (портал против PowerShell)
В нашем конвейере CI/CD я пытаюсь автоматизировать создание токенов SAS для контейнеров, используемых другими системами. Каждый токен SAS "указывает" на Политику общего доступа.
Моей первой мыслью было добавить это в наш сценарий пост-развертывания PowerShell, чтобы мы могли добавлять новые сценарии (включая токены SAS и политики общего доступа) в сценарий по мере его расширения. Все работает, и я получаю как политику, так и токен SAS, но я застрял в одном, что отличается от того, когда я генерирую токен SAS через портал Azure. Я надеюсь, что кто-то может пролить свет на несоответствие.
Скрипт PowerShell (запускается как часть конвейера развертывания в VSTS)
Select-AzureRmSubscription -SubscriptionId $useSubscription
Set-AzureRmContext -SubscriptionId $useSubscription
$accountKeys = Get-AzureRmStorageAccountKey -ResourceGroupName $useResourceGroupName -Name $storageAccountName
$storageContext = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $accountKeys[0].Value
$expiryTime = (get-date).AddYears(1)
$permission = "rwl"
New-AzureStorageContainerStoredAccessPolicy -Context $storageContext -Container "test-container" -Policy "testPolicy" -ExpiryTime $expiryTime -Permission $permission
$sasToken = New-AzureStorageContainerSASToken -Name "test-container" -Policy "testPolicy" -Context $storageContext
$sasToken = $sasToken.substring(1)
Write-Host "SAS token (ref shared access policy): $sasToken"
$sasToken2 = New-AzureStorageContainerSASToken -Context $storageContext -Container tibp-userprofiles -Permission rwl
Write-Host 'SAS token: ' $($sasToken2)
Выход в настоящее время:
SAS token (ref shared access policy): sv=2015-04-05&sr=c&si=tibpsaptest2&sig=rkzN3ocRZUrz5ub2IcVPKGIARvw3%2B2rh1G3yKmnSXhA%3D
SAS token: ?sv=2015-04-05&sr=c&sig=9kMVFE7U61P1ikK27ylXqXiIkSaj71OImdM88RrtJfs%3D&se=2017-05-22T08%3A40%3A39Z&sp=rwl
Мой вопрос: почему sv установлен на 2015-04-05 с использованием командлета Pwershell, а не на самую новую версию 2016-05-31? Я получаю тот же результат для sv, если генерирую чистый токен SAS (не подкрепленный политикой общего доступа).
Если я сгенерирую токен SAS с помощью портала Azure (используя ту же учетную запись хранения и контейнер), я получу sv с последней версией (2016-05-31).
Вывод с использованием портала Azure:
?sv=2016-05-31&ss=b&srt=sco&sp=rwl&se=2017-05-22T17:36:58Z&st=2017-05-22T09:36:58Z&spr=https&sig=UTibTnwmwYl3k3iIYj63VbYItL5eV4K4t6PEZ7ihi3E%3D
Трубопровод CI/CD запускается с использованием VSTS, и я использую стандартную задачу Azure PowerShell для запуска сценария.
1 ответ
Вы можете использовать следующий командлет для генерации токена SAS, результат такой же, как и у Portal.
$now=get-date
New-AzureStorageContainerSASToken -Name <container name> -Context $storageContext -Permission rwl -StartTime $now.AddHours(-1) -ExpiryTime $now.AddMonths(1)
Мой результат теста ниже
?sv=2015-04-05&sr=c&sig=tMG2TwiAGXkDqwFbj7%2BRjI52qXUKU9NDI%2BmkxMY%2BjtM%3D&st=2017-05-22T00%3A41%3A50Z&se=2017-06-22T01%3A41%3A50Z&sp=rwl
Вы можете проверить, что они одинаковы, кроме версии API ?sv=2015-04-05
, Более подробную информацию о SAS можно найти по этой ссылке.
Обновить:
Я знаю причину: Azure Portal использует последнюю версию API для генерации токена SAS, но локальный Azure PowerShell не использует последнюю версию.
Вы можете использовать следующий командлет, чтобы проверить версию Azure PowerShell.
Get-Module -ListAvailable -Name Azure -Refresh
На последней версии (на данный момент 4.01) используйте последнюю версию API. Вы можете скачать установщик mis по ссылке.
PS C:\Users\v-shshui> New-AzureStorageContainerSASToken -Name vhds -Context $storageContext -Permission rwl -StartTime $now.AddHours(-1) -ExpiryTime $now.AddMonths(1)
?sv=2016-05-31&sr=c&sig=zdrwTEEmvTn6rjoJPVWOdQYzggrvygTHGoBsOBYgzuI%3D&st=2017-05-22T07%3A56%3A21Z&se=2017-06-22T08%3A56%3A21Z&sp=rwl