3

在我们的 CI/CD 管道中,我试图为其他系统使用的容器自动创建 SAS 令牌。每个 SAS 令牌“指向”一个共享访问策略。

我的第一个想法是将其添加到我们的 PowerShell 部署后脚本中,以便我们可以在扩展时将新容器的创建(包括 SAS 令牌和共享访问策略)添加到脚本中。一切正常,我得到了他的策略和生成的 SAS 令牌,但我遇到了一件与通过 Azure 门户生成 SAS 令牌时不同的事情。我希望有人可以阐明这种差异。

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

我的问题是为什么使用 Pwershell cmdlet 将 sv 设置为 2015-04-05 而不是最新版本 2016-05-31?如果我生成一个干净的 SAS 令牌(不受共享访问策略的支持),我会为 sv 得到相同的结果。

如果我使用 Azure 门户(使用相同的存储帐户和容器)生成 SAS 令牌,我会将 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 任务来运行脚本。

VSTS 中的 Azure PowerShell 版本

4

1 回答 1

3

您可以使用以下 cmdlet 生成 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 没有使用最新版本。

您可以使用以下 cmdlet 检查您的 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
于 2017-05-22T01:46:33.013 回答