2016-11-23 64 views
0

我試圖用AzCopy 5.1.0下載從使用SAS的Blob存儲容器斑點由存儲資源管理器生成下載的Blob:如何使用SAS

https://myaccount.blob.core.windows.net/mycontainer/[blob-uuid]?st=2016-11-23T18%3A26%3A00Z&se=2016-11-24T18%3A26%3A00Z&sp=rl&sv=2015-12-11&sr=b&sig=[signature]

azcopy /Source:https://myaccount.blob.core.windows.net/mycontainer /SourceSAS:"?st=2016-11-23T18%3A26%3A00Z&se=2016-11-24T18%3A26%3A00Z&sp=rl&sv=2015-12-11&sr=b&sig=[signature]" /Dest:"c:\data" 

如果/ Source應該是blob容器,並且/ SourceSAS應該是SAS 令牌,那麼我需要在實際的Blob密鑰([blob-uuid])中傳遞某個地方。

恕我直言,這應該是/ SourceKey,但指定我的BLOB鍵會返回錯誤:「提供的存儲鍵(SourceKey)不是有效的Base64字符串。」這與將該參數描述爲「存儲帳戶密鑰」的命令行幫助一致。

我能找到的唯一的其他候選人是/ Pattern,但是對於通過枚舉容器內容來下載blob的情況來說,這似乎更多。這似乎與我在這裏指定確切的blob鍵時得到的403錯誤一致;該容器是私人的。

在任何情況下,AzCopy都會抱怨「服務器未能對請求進行身份驗證,請確保授權標頭的值包含簽名正確形成。」這在我的經驗中表明SAS簽名生成的原始URI沒有被正確重構。

我能夠直接通過curl使用原始的SAS URI,所以它不是簽名不一致的問題。

我也嘗試使用SDK以編程方式生成SAS URI,因此我可以指定共享訪問策略,但這也不起作用。我仍然認爲AzCopy需要SAS URI的缺失部分。

回答

0

AzCopy傳輸目標始終是一個目錄,而不是一個blob /文件,所以AzCopy需要容器級別的SAS而不是blob SAS。 該模式僅用於過濾要傳輸的對象。

我們將打開一個任務來跟蹤下載單個斑點與斑點SAS。無論如何,這不符合當前的AzCopy邏輯,我們將把它作爲新的功能請求。

0

閱讀docs

Download single blob:

AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer /Dest:C:\myfolder /SourceKey:key /Pattern:"abc.txt" 

/Source將是你的URI到容器

/SourceKey將是你的鑰匙,但沒有在開始時

/Pattern問號將是你的斑點的名字

/Destination將是您希望的Blob下載

+0

您是否建議/ SourceKey參數的「關鍵」是沒有前面問號的SAS令牌?因爲這會導致我描述的相同錯誤:「提供的存儲密鑰(SourceKey)不是有效的Base64字符串」 命令行幫助:azcopy/?: SourceKey如此描述參數:'/ SourceKey:指定存儲帳戶密鑰「,與錯誤消息一致,但與整體下載操作不一致。 – ayang

+0

上面寫的astaykov是正確的,但讓我澄清更多的例子,你可以像這樣調用AzCopy:azcopy /Source:https://myaccount.blob.core.windows.net/mycontainer/SourceSAS:「?st = 2016-11-23T18%3A26%3A00Z&se = 2016-11-24T18%3A26%3A00Z&sp = rl&sv = 2015-12-11&sr = b&sig = [signature]「/ Dest:」c:\ data「/ Pattern:」[blob- uuid]「 –

+0

根據」sr = b「,您使用的是blob SAS而不是容器SAS,因此請確保您的AzCopy已升級到最新版本,因爲舊的AzCopy不支持blob SAS作爲源SAS。 –

0

我們可以通過使用帳戶鍵容器SAS令牌下載從容器源的BLOB本地文件夾的名稱。並且不支持blob URI作爲下載blob的源。以下快照是我的測試結果。

1.使用容器作爲源和容器SAS令牌。使用模式來選擇下載blob。

AzCopy /Source:https://mystorageAccount.blob.core.windows.net/mycontainer /Dest:C:\myfolder /SourceSAS:"?st=2016-11-24T02%3A34%3A00Z&se=2016-11-25T02%3A34%3A00Z&sp=rl&sv=2015-12-11&sr=c&sig=[s‌​ignature]" /Pattern:blobName 

enter image description here

2.使用容器爲源,佔重點token.It也能正常工作。如果我使用了錯誤的密鑰令牌(的ConnectionString),然後我得到"The supplied storage key (SourceKey) is not a valid Base64 string"錯誤

enter image description here

3.使用容器作爲源和BLOB SAS的道理,這是行不通的

enter image description here

4.使用blob作爲源和容器的SAS令牌,不支持無模式

enter image description here

[更新]

我們可以使用azure storage .Net SDK從與BLOB SAS令牌團塊URI下載BLOB。

StorageCredentials storageCredentials = new StorageCredentials("blob sas token");//without "?" 
      var blobName = "blobName"; 
      var downloadFolder = @"c:\filefolder"; 
      var filePath = Path.Combine(downloadFolder, blobName); 
      CloudBlockBlob sourceBlockBlob = new CloudBlockBlob(new Uri("blob url"), storageCredentials); 
      sourceBlockBlob.DownloadToFile(filePath, FileMode.Create); 
+0

嗨,湯姆,謝謝你通過這些場景 - 它澄清了事情。但是,只有例子3適用於我的情況。我的確嘗試使用Blob SAS URI進行下載。 – ayang

+0

根據AzCopy [文檔](https://docs.microsoft.com/en-us/azure/storage/storage-use-azcopy#blob-download),沒有命令支持使用Blob下載單個Blob URI通過Blob SAS令牌AzCopy工具 –

+0

也許有一種解決方法,我們可以使用Azure存儲.NET SDK來做到這一點。演示代碼請參考更新。 –