Хранилище 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 для запуска сценария.

Версия Azure PowerShell в VSTS


person soderstromOlov    schedule 21.05.2017    source источник


Ответы (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 использует последнюю версию API для создания токена SAS, но ваша локальная оболочка Azure PowerShell не использует последнюю версию.

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

Get-Module -ListAvailable -Name Azure -Refresh

В последней версии (на данный момент 4.01) используйте последнюю версию API. Вы можете загрузить неправильный установщик по ссылке.

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
person Shui shengbao    schedule 22.05.2017
comment
Я получаю тот же результат при использовании вашего скрипта. Я предлагаю вам изменить свой сценарий. - person Shui shengbao; 22.05.2017
comment
Я не вижу разницы в результате использования вашего скрипта. Я отредактировал свой вопрос, чтобы прояснить проблему. Цель состоит в том, чтобы сгенерировать токен SAS, поддерживаемый политикой общего доступа, которая использует sv 2016-05-31. - person soderstromOlov; 22.05.2017
comment
@soderstromOlov Привет, я знаю причину, вы можете проверить свою версию Azure PowerShell. Когда вы используете последнюю версию PowerShell (4.01), вы можете сгенерировать токен SAS с последней версией API. - person Shui shengbao; 22.05.2017
comment
Спасибо @Walter - MSFT за отзыв! Локальный запуск сценария с версией 4 не приводит к генерации желаемого токена. Но ... После быстрой проверки во время задачи развертывания VSTS я увидел, что он использует Azure PowerShell версии 3.5, что дает мне более старую версию службы хранилища. Есть идеи, как это решить? Или мне нужно вместо этого запускать задачу Powershell на целевом компьютере, чтобы получить новейшую версию Azure PS? - person soderstromOlov; 22.05.2017
comment
@soderstromOlov Нет, версия API инкапсулирована в командлет PowerShell, мы не могли ее изменить. Вам следует использовать последнюю версию. - person Shui shengbao; 23.05.2017