gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:09:11 25 4
gpt4 key购买 nike

我想使用 AzCopy 将 blob 从帐户 A 复制到帐户 B。但我没有使用源的访问 key ,而是只能访问共享访问 key 。我尝试在 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。

最佳答案

你是对的。仅当源 Blob 和目标 Blob 位于同一存储帐户中时,才支持在源 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 。摘自帖子:

Copy blob now allows Shared Access Signature (SAS) to be used for the destination blob if the copy is within the same storage account.

更新

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

  • 源 SAS 适用于源容器,而非 Blob。另请确保您同时拥有 Read List 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"

更新2

Error parsing source location [container-location]: Object reference not set to an instance of an object.

我能够重现该错误。我认为此错误的原因是用于创建 SAS token 的存储客户端库(以及 REST API)的版本。如果我尝试使用使用 3.x 版库创建的 SAS token 来列出 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 token 来列出 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 token 列出源容器中的 blob。现在,正如我们在上面看到的,两个版本返回的 XML 不同,因此存储客户端库 2.1.0.4 无法解析存储服务返回的 XML。由于它无法解析 XML,因此无法创建 Blob对象,因此你得到 NullReferenceException .

解决方案:

此问题的一种可能解决方案是使用 2.1.0.4 版本的库创建 SAS token 。我尝试这样做并成功复制了该 Blob 。一定要尝试一下。这应该可以解决您面临的问题。

关于使用 AzCopy 和共享访问 key 的 Azure 跨帐户复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21650463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com