我希望能够使用Powershell以非常特定的方式在Datalake文件夹上创建SAS令牌。我能够在Azure门户中创建SAS令牌,但无法找到与在Powershell中完全相同的创建方法。
SAS令牌必须满足以下条件:
- 允许访问Datalake目录
- 使用访问策略
- 访问策略不提供开始时间或到期时间
- 访问策略不提供权限
- SAS令牌本身提供开始时间和到期时间
- SAS令牌本身提供权限
我使用现有的存储帐户“gfcssa 002 t”并创建了一个Datalake容器“datalake”。在这个容器中,我创建了一个文件夹结构“basefolder/testfolder”并上传了一个文件“testfile.png”:
在下一步中,我创建了一个访问策略“testpolicy”,它具有无权限、无开始时间和无终止时间:
现在我可以开始为文件夹“basefolder/testfolder”生成SAS令牌了:
我使用帐户密钥签名(密钥1)、访问策略“testpolicy”、5个权限(读取、添加、创建、写入、列表)、开始时间“01.01.2023 00:00:00”和到期时间“01.01.2024 00:00:00”生成了SAS令牌:
我复制了生成的SAS令牌URI,在URI中的“/datalake/basefolder/testfolder”部分后面插入了“/testfile.png”,打开了一个新的私有Firefox窗口并插入了以下URI:
所以,SAS令牌按我预期的方式工作。
现在我试着用Powershell来做同一代的SAS令牌。不幸的是,要找到要使用的cmdlet并不容易。对我来说,使用cmdlet New-AzStorageBlobSASToken
(Documentation)似乎是最好的,代码如下:
$accountname="gfcssa0002t"
$accountkey="<.. key ..>"
$containername="datalake"
$blob="basefolder/testfolder"
$policy="testpolicy"
$ctx = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey
New-AzStorageBlobSASToken `
-Context $ctx `
-Container $containername `
-Blob $blob `
-Policy $policy `
-Protocol HttpsOnly `
-FullUri
但只有在您至少为访问策略“testpolicy”定义了权限的情况下,这个方法才有效。如果我没有定义权限,开始时间,到期时间,我会得到错误
New-AzStorageBlobSASToken : Der Wert darf nicht NULL sein.
Parametername: accessPolicy
In C:\Users\...\Projects\Create SAS token.ps1:10 Zeichen:1
+ New-AzStorageBlobSASToken `
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [New-AzStorageBlobSASToken], ArgumentNullException
+ FullyQualifiedErrorId : ArgumentNullException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.NewAzureStorageBlobSasTokenCommand
当我将Start Time和Expiry Time添加到cmdlet中时,会出现相同的错误:
$accountname="gfcssa0002t"
$accountkey="<.. key ..>"
$containername="datalake"
$blob="basefolder/testfolder"
$policy="testpolicy"
$ctx = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey
New-AzStorageBlobSASToken `
-Context $ctx `
-Container $containername `
-Blob $blob `
-Policy $policy `
-Protocol HttpsOnly `
-StartTime (Get-Date).AddDays(-1) `
-ExpiryTime (Get-Date).AddDays(10) `
-FullUri
如果我尝试使用参数“Permission”:
$accountname="gfcssa0002t"
$accountkey="<.. key ..>"
$containername="datalake"
$blob="basefolder/testfolder"
$policy="testpolicy"
$ctx = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey
New-AzStorageBlobSASToken `
-Context $ctx `
-Container $containername `
-Blob $blob `
-Policy $policy `
-Protocol HttpsOnly `
-StartTime (Get-Date).AddDays(-1) `
-ExpiryTime (Get-Date).AddDays(10) `
-Permission racwl `
-FullUri
错误更改为:
New-AzStorageBlobSASToken : Der Parametersatz kann mit den angegebenen benannten Parametern nicht aufgelöst werden.
In C:\Users\...\Projects\Create SAS token.ps1:10 Zeichen:1
+ New-AzStorageBlobSASToken `
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [New-AzStorageBlobSASToken], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.NewAzureStorageBlobSasTokenCommand
根据cmdlet的documentation,似乎没有有效的参数集来同时使用访问策略、开始时间、到期时间和权限。
这就是我没有主意的地方。
如何生成与我能够使用Azure Portal创建的SAS令牌完全相同的类型?
1条答案
按热度按时间ncgqoxb01#
根据您的描述,您正在尝试使用不包括任何权限、开始时间或过期时间的访问策略为Datalake文件夹创建SAS令牌。但是,使用PowerShell cmdlet New-AzStorageBlobSASToken时,要求至少为访问策略指定权限。
一种可能的解决方法是创建一个包括权限、开始时间和过期时间的访问策略。然后,使用New-AzStorageBlobSASToken cmdlet创建引用该策略的SAS令牌,并使用该SAS令牌访问所需的文件夹。
或者,你可以尝试使用Azure Data Lake Storage REST API创建按你所述方式工作的SAS令牌。这将需要额外的开发和测试,但它将使你能够更好地控制SAS令牌的特定详细信息。