1

我正在尝试使用 AzCopy 5.1.0使用存储资源管理器生成的 SAS 从 Blob 存储容器下载单个blob:

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 token,那么我需要在某个地方传入实际的 Blob 键 ([blob-uuid])。

恕我直言,这应该是 /SourceKey,但在那里指定我的 blob 密钥会返回错误:“提供的存储密钥 (SourceKey) 不是有效的 Base64 字符串。” 这与将参数描述为“存储帐户密钥”的命令行帮助一致。

我能找到的唯一其他候选者是 /Pattern,但对于通过枚举容器的内容来下载 blob 的情况似乎更多。这似乎与我在此处指定确切的 blob 键时得到的 403 错误一致;容器是私有的。

在任何情况下,AzCopy 都会抱怨“服务器未能对请求进行身份验证。请确保 Authorization 标头的值包括签名在内的格式正确。” 根据我的经验,这表明生成 SAS 签名的原始 URI 没有被正确重建。

我可以通过 curl 直接使用原始 SAS URI,所以这不是签名不一致的问题。

我还尝试使用 SDK 以编程方式生成 SAS URI,以便我可以指定共享访问策略,但这也不起作用。我仍然认为 AzCopy 需要 SAS URI 的缺失部分。

4

3 回答 3

0

AzCopy 传输目标始终是一个目录,而不是单个 blob/文件,因此 AzCopy 需要容器级 SAS 而不是 blob SAS。该模式仅用于过滤掉要传输的对象。

我们将打开一个任务来使用 blob SAS 跟踪单个 blob 的下载。无论如何,这与当前的 AzCopy 逻辑不符,我们会将其视为新功能请求。

于 2016-11-25T02:24:37.173 回答
0

阅读文档

下载单个 blob:

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

/Source将是您到容器的 URI

/SourceKey将是您的关键,但开头没有问号

/Pattern将是您的 blob 的名称

/Destination将是您希望下载 blob 的本地文件夹名称

于 2016-11-23T21:26:13.917 回答
0

我们可以使用帐户密钥容器 SAS Token从容器源下载 blob 。并且不支持将 blob URI 作为下载 blob 的源。以下快照是我的测试结果。

1.使用容器作为源和容器SAS令牌。使用 Pattern 选择下载 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

在此处输入图像描述

2.使用容器作为来源和帐户密钥令牌。它也可以工作。如果我使用了错误的密钥令牌(连接字符串),则会"The supplied storage key (SourceKey) is not a valid Base64 string"出现错误

在此处输入图像描述

3.使用容器作为源和blob SAS令牌,它不起作用

在此处输入图像描述

4.使用blob作为源和容器SAS令牌,不支持无模式

在此处输入图像描述

[更新]

我们可以使用azure storage .Net SDK使用 blob SAS 令牌从 blob 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);
于 2016-11-24T06:15:56.807 回答