我想使用AzCopy将帐户A中的blob复制到帐户B.但是,我只能访问共享访问密钥,而不是使用访问密钥。我尝试在URL之后附加SAS,但它会引发404错误。这是我试过的语法
AzCopy "https://source-blob-object-url?sv=blah-blah-blah-source-sas" "https://dest-blob-object-url" /destkey:base64-dest-access-key
我得到的错误是
Error parsing source location "https://source-blob-object-url?sv=blah-blah-blah-source-sas":
The remote server returned an error: (404) Not Found.
如何让AzCopy使用SAS URL?或者它不支持SAS?
更新 使用SourceSAS和FilePattern选项,我仍然收到404错误。这是我使用的命令:
AzCopy [source-container-url] [destination-container-url] [file-pattern] /SourceSAS:"?sv=2013-08-15&sr=c&si=ReadOnlyPolicy&sig=[signature-removed]" /DestKey:[destination-access-key]
这将让我找到404 Not Found。如果我更改签名使其无效,AzCopy将抛出403 Forbidden。
答案 0 :(得分:2)
你是对的。仅当源和目标blob位于同一存储帐户中时,才支持在源和目标blob上使用SAS进行复制操作。 Windows Azure存储仍不支持使用SAS复制存储帐户。这篇文章已在此存储团队的博文中介绍({仅限一个班轮):http://blogs.msdn.com/b/windowsazurestorage/archive/2013/11/27/windows-azure-storage-release-introducing-cors-json-minute-metrics-and-more.aspx。从帖子:
复制blob现在允许使用共享访问签名(SAS) 如果副本位于同一存储帐户中,则为目标blob。
<强>更新强>
所以我尝试了,我意识到的一件事是它用于将所有blob从一个容器复制到另一个容器。根据我的试用/错误,您需要记住的一些事项是:
Read
和 List
权限。基于这些,您可以尝试以下方法:
AzCopy "https://<source account>.blob.core.windows.net/<source container>?<source container sas with read/list permission>" "https://<destination account>.blob.core.windows.net/<destination container>" "<source blob name to copy>" /DestKey:"destination account key"
更新2
解析源位置[container-location]时出错:对象引用 没有设置为对象的实例。
我能够重新创建错误。我相信这个错误的原因是用于创建SAS令牌的存储客户端库(以及REST API)的版本。如果我尝试使用使用库的3.x版创建的SAS令牌列出blob容器的内容,这是我得到的输出:
<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults ServiceEndpoint="https://cynapta.blob.core.windows.net/" ContainerName="vhds">
<Blobs>
<Blob>
<Name>test.vhd</Name>
<Properties>
<Last-Modified>Fri, 17 May 2013 15:23:39 GMT</Last-Modified>
<Etag>0x8D02129A4ACFFD7</Etag>
<Content-Length>10486272</Content-Length>
<Content-Type>application/octet-stream</Content-Type>
<Content-Encoding />
<Content-Language />
<Content-MD5>uflK5qFmBmek/zyqad7/WQ==</Content-MD5>
<Cache-Control />
<Content-Disposition />
<x-ms-blob-sequence-number>0</x-ms-blob-sequence-number>
<BlobType>PageBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Blob>
</Blobs>
<NextMarker />
</EnumerationResults>
但是,如果我尝试使用使用库的2.x版创建的SAS令牌列出blob容器的内容,这是我得到的输出:
<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults ContainerName="https://cynapta.blob.core.windows.net/vhds">
<Blobs>
<Blob>
<Name>test.vhd</Name>
<Url>https://cynapta.blob.core.windows.net/vhds/test.vhd</Url>
<Properties>
<Last-Modified>Fri, 17 May 2013 15:23:39 GMT</Last-Modified>
<Etag>0x8D02129A4ACFFD7</Etag>
<Content-Length>10486272</Content-Length>
<Content-Type>application/octet-stream</Content-Type>
<Content-Encoding />
<Content-Language />
<Content-MD5>uflK5qFmBmek/zyqad7/WQ==</Content-MD5>
<Cache-Control />
<x-ms-blob-sequence-number>0</x-ms-blob-sequence-number>
<BlobType>PageBlob</BlobType>
<LeaseStatus>unlocked</LeaseStatus>
<LeaseState>available</LeaseState>
</Properties>
</Blob>
</Blobs>
<NextMarker />
</EnumerationResults>
注意<EnumerationResults>
XElement中的差异。
现在AzCopy
使用版本2.1.0.4版本的存储客户端库。作为复制操作的一部分,它首先使用SAS令牌列出源容器中的blob。现在我们在上面看到,返回的XML在两个版本中都是不同的,因此存储客户端库2.1.0.4无法解析存储服务返回的XML。由于无法解析XML,因此无法创建Blob
对象,因此您获得了NullReferenceException
。
解决方案:
此问题的一种可能解决方案是使用版本2.1.0.4版本的库创建SAS令牌。我试过这样做,并能够成功复制blob。试一试。这应该可以解决你所面临的问题。
答案 1 :(得分:1)
确保您使用的是最新版本的AzCopy和 检查此http://blogs.msdn.com/b/windowsazurestorage/archive/2013/09/07/azcopy-transfer-data-with-re-startable-mode-and-sas-token.aspx
/ DestSAS和/ SourceSAS :此选项允许使用SAS(共享访问签名)令牌访问存储容器和Blob。由存储帐户所有者生成的SAS令牌授予对具有特定权限且在指定时间段内的特定容器和Blob的访问权限。
AzCopy C:\blobData https://xyzaccount.blob.core.windows.net/xyzcontainer /DestSAS:”?sr=c&si=mypolicy&sig=XXXXX” /s
/ DestSAS这里是您指定访问存储容器的SAS令牌,它应该用引号括起来。
答案 2 :(得分:0)
您可以使用IaaS Management Studio为您生成powershell脚本。它是一种商业工具,但您可以在试用版中使用它。它虽然不使用AzCopy,但是在PowerShell中使用了经典的blob API。
只需“共享VHD”即可获得SAS链接。然后“从共享链接导入”,复制先前获得的SAS链接。检查底部,你会看到一个脚本图标。将光标放在它上面就会显示出来。
但是,在试用版中,您无法复制脚本,您需要手动输入,但这样做不会很长。