使用AzCopy和共享访问密钥的Azure跨帐户复制

使用AzCopy和共享访问密钥的Azure跨帐户复制,azure,azure-storage,Azure,Azure Storage,我想使用AzCopy将blob从帐户a复制到帐户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

我想使用AzCopy将blob从帐户a复制到帐户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找不到。如果我更改签名使其无效,AzCopy将抛出403禁止。请确保您使用的是AzCopy的最新版本,并且 检查这个

/DestSAS和/或SourceSAS:此选项允许使用SAS(共享访问签名)令牌访问存储容器和blob。由存储帐户所有者生成的SAS令牌授予对具有特定权限的特定容器和Blob的访问权限,并授予其特定时间段的访问权限

示例:使用SAS令牌将本地目录中的所有文件上载到容器,SAS令牌提供列表和写入许可
/DestSAS用于指定访问存储容器的SAS令牌,它应该用引号括起来。

您是正确的。仅当源Blob和目标Blob位于同一存储帐户中时,才支持在源Blob和目标Blob上使用SAS进行复制操作。Windows Azure存储仍然不支持使用SAS跨存储帐户进行复制。存储团队的这篇博文(尽管只有一行代码)对此进行了介绍。从职位:

复制blob现在允许将共享访问签名(SAS)用于 如果副本位于同一存储帐户内,则为目标blob

更新

所以我尝试了它,我意识到它是用来将所有blob从一个容器复制到另一个容器的。根据我的尝试/错误,您需要记住以下几点:

  • 源SAS用于源容器,而不是blob。另外,请确保您对SAS中的blob容器具有读取和列表权限
  • 如果要复制单个文件,请确保将其定义为“filepattern”参数
基于这些,请尝试以下方法:

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"
AzCopy”https://.blob.core.windows.net/?" "https://.blob.core.windows.net/“”/DestKey:“目标帐户密钥”
更新2

分析源位置[容器位置]:对象引用时出错 未设置为对象的实例

我能够重现这个错误。我认为此错误的原因是用于创建SAS令牌的存储客户端库(以及RESTAPI)的版本。如果我尝试使用使用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>
<?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>

test.vhd
2013年5月17日星期五15:23:39 GMT
0x8D02129A4ACFFD7
10486272
应用程序/八位字节流
uflK5qFmBmek/zyqad7/WQ==
0
PageBlob
解锁
可获得的
但是,如果我尝试使用使用库的版本2.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>
<?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>

test.vhd
https://cynapta.blob.core.windows.net/vhds/test.vhd
2013年5月17日星期五15:23:39 GMT
0x8D02129A4ACFFD7
10486272
应用程序/八位字节流
uflK5qFmBmek/zyqad7/WQ==
0
PageBlob
解锁
可获得的
请注意
XElement中的差异

现在,
AzCopy
使用2.1.0.4版存储客户端库。作为复制操作的一部分,它首先使用SAS令牌列出源容器中的BLOB。现在,正如我们在上面看到的,返回的XML在两个版本中是不同的,因此storage client library 2.1.0.4无法解析存储服务返回的XML。由于它无法解析XML,因此无法创建
Blob
对象,因此您将获得
NullReferenceException

解决方案:

此问题的一个可能解决方案是使用2.1.0.4版库创建SAS令牌。我尝试过这样做,并成功地复制了blob。一定要试一试。这将解决您面临的问题。

您可以使用它为您生成powershell脚本。这是一个商业工具,但您可以在试用版中使用它。虽然它不使用AzCopy,但使用powershell中的经典BlobAPI

只需“共享VHD”即可获得SAS链接。然后“从共享链接导入”,复制先前获得的SAS链接。选中底部,您将看到一个脚本图标。把光标放在上面,它就会出现


但是,在试用版中,您不能复制脚本,您需要手动键入,但这样做的时间不长。

真不敢相信我错过了。然而,它似乎不起作用。我仍然得到404错误。这是我使用的命令:AzCopy[source blob url][destination blob url]/SourceSAS:“[source sas]”/DestKey:[destination key]我有目标blob的访问密钥。我只需要对源blob使用SAS。从博客文章来看,似乎相同的帐户限制仅适用于在目标blob上使用SAS?对不起。。。我的错:(.我以为你的源和目标都只有SAS,因此答案也是如此。请查看我的更新答案。感谢更新。我也尝试过,但仍然没有成功。我还编写了一个小型控制台应用程序,它肯定可以这样移动Blob,而且AzCopy似乎肯定支持它。不知道我哪里做错了。最后一条评论:can请检查您的帐户中的权限