使用AzCopy和共享访问密钥的Azure跨帐户副本

时间:2014-02-08 19:01:20

标签: azure azure-storage

我想使用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。

3 个答案:

答案 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从一个容器复制到另一个容器。根据我的试用/错误,您需要记住的一些事项是:

  • 源SAS用于源容器而不是blob。同时确保您对SAS中的blob容器同时拥有 Read List 权限。
  • 如果要复制单个文件,请确保将其定义为&#34; filepattern&#34;参数。

基于这些,您可以尝试以下方法:

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的访问权限。

示例:使用SAS令牌将本地目录中的所有文件上传到容器,该令牌提供列表和写入许可

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链接。检查底部,你会看到一个脚本图标。将光标放在它上面就会显示出来。

但是,在试用版中,您无法复制脚本,您需要手动输入,但这样做不会很长。