【问题标题】:azcopy - remote server returned 403 forbiddenazcopy - 远程服务器返回 403 禁止
【发布时间】:2020-07-17 20:29:03
【问题描述】:

我有几个 Azure 帐户。我想将一个大型博客(250GB vhd)从一个帐户复制到另一个帐户,而不是下载然后上传到本地计算机。

我尝试使用 Microsoft 实用程序 AZCOPY 来执行此操作(用 x 替换键):

azcopy https://accountfrom.blob.core.windows.net/neo4j/neo4j-250gb.db.vhd https://accountto.blob.core.windows.net/neo4j/neo4j-250gb.db.vhd /DestKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /SourceKey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

但这给了我错误信息: 解析目标位置时出错远程服务器返回错误:(403) Forbidden。

我通过在 CloudBerry 中开设帐户来测试密钥和帐户。我也从 CloudBerry 获得了网址,所以我认为我也正确。

403 的原因可能是什么?

【问题讨论】:

  • 听起来目的地的密钥是错误的。或者,也许该密钥没有写入权限?
  • 我建议的一件事是通过 Fiddler 之类的工具跟踪您的请求/响应。您将获得有关 403 错误的更多详细信息。通常 403 错误意味着@PeterRitchie 提到的密钥存在问题。
  • 尝试了您的两个建议,但均无济于事。我放弃了 AzCopy,用 PowerShell 写了一个解决方案。
  • 您的目的地是否有足够的可用存储空间?

标签: azure


【解决方案1】:

我尝试了 Gaurav 关于使用 Fiddler 的建议。这让我可以看到来自 Azure 存储的 XML 响应。在那里我看到“AuthenticationErrorDetail: Request date header too old”原来我使用的是虚拟机,它的时间已经过去了。更新 VM 上的时钟修复了授权问题。

【讨论】:

  • 你可能为我节省了一个小时。谢谢你。该死的 Parallels 及其恢复错误。
【解决方案2】:

AzCopy 命令行模式为“azcopy [source] [dest] [file pattern] [options]”,[source] 将被视为文件夹(如果从本地文件夹复制)或虚拟目录(如果它是从 blob 中复制的), 即 AzCopy 将复制源文件夹/虚拟目录下的所有文件。

因此,在您的命令行中,azcopy 将尝试查找等于“xxxx.core.windows.net/neo4j/neo4j-250gb.db.vhd”的虚拟目录,但我们知道它不是虚拟目录,而是文件。

要从 blob 中复制单个文件,您可以尝试使用以下命令与 [file pattern] 和选项 /s。

azcopy accountfrom.blob.core.windows.net/neo4j/ accountto.blob.core.windows.net/neo4j/ /sourcekey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /destkey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx neo4j-250gb.db.vhd /s

注意,“从 Blob 复制”和“从本地文件夹复制”的文件模式不同。从blob复制时,文件模式被视为前缀,而从本地复制时,文件模式是通用文件系统文件模式。

例如您可以在从本地复制时使用文件模式 ab* 来指定所有 文件以“ab”开头,但从 blob 复制时,您只能指定 像'ab'这样的前缀。

选项/s的使用方法请到http://blogs.msdn.com/b/windowsazurestorage/archive/2012/12/03/azcopy-uploading-downloading-files-for-windows-azure-blobs.aspx

对于“403禁止”的错误,与你使用的命令行模式无关,而是key或账号有问题。

最后但并非最不重要的一点是,您始终可以通过aka.ms/azcopy获取最新的 azcopy

【讨论】:

    【解决方案3】:

    不仅要检查 Destination Blob 的 SAS 令牌权限,还要检查 Source Blob 的权限。

    【讨论】:

      【解决方案4】:

      您是否尝试过 CopyFromBlob 方法?我不确定它是否适用于订阅,如果我有多个订阅,我会对其进行测试。但它非常快,不做上下。

      类似这样的:

      //set the azure container
      string sourceContainerName = "mySourceContainer";
      string destinationContainerName = "myDestinationContainer";
      //azure connection string
      string sourceSettingKey = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", "xxxx",
                                                  "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
      string destinationSettingKey = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", "xxxx",
                                                  "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
      //setup the container object
      CloudStorageAccount sourceStorageAccount = CloudStorageAccount.Parse(sourceSettingKey);
      CloudStorageAccount destinationStorageAccount = CloudStorageAccount.Parse(destinationSettingKey);
      CloudBlobClient sourceClient = sourceStorageAccount.CreateCloudBlobClient();
      CloudBlobClient destinationClient = destinationStorageAccount.CreateCloudBlobClient();
      CloudBlobContainer sourceContainer = blobClient.GetContainerReference(sourceContainerName);
      CloudBlobContainer destinationContainer = blobClient.GetContainerReference(destinationContainerName);
      
      // Set permissions on the container.
      BlobContainerPermissions permissions = new BlobContainerPermissions();
      permissions.PublicAccess = BlobContainerPublicAccessType.Blob;
      sourceContainer.SetPermissions(permissions);
      destinationContainer.SetPermissions(permissions);
      
      //grab the blob
      CloudBlob sourceBlob = sourceContainer.GetBlobReference("mySourceBlobName");
      CloudBlob destinationBlob = destinationContainer.GetBlobReference("myDestinationBlobName");
      //create a new blob
      destinationBlob.CopyFromBlob(sourceBlob);
      

      【讨论】:

        【解决方案5】:

        我得到了 403,因为我使用的第一个密钥(为存储帐户生成)在某种程度上存在缺陷。 只需更改为使用第二个密钥即可解决问题 - 当然还需要重新生成第一个密钥。

        【讨论】:

          【解决方案6】:

          AzCopy 需要从中复制文件的存储容器,而不是文件的完整路径。

          因此,

          AzCopy /Source:https://accountfrom.blob.core.windows.net/neo4j /Dest:https://accountto.blob.core.windows.net/neo4j /SourceKey:key /DestKey:key /Pattern:neo4j-250gb.db.vhd
          

          /Pattern 指的是正在复制的文件。默认情况下,跨 Azure 存储复制的文件是在服务器端完成的。看 https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy#copy-blobs-in-blob-storage 了解更多信息。

          【讨论】:

            【解决方案7】:

            第一次创建“对象”时,需要以允许的“资源类型”在 SAS 密钥生成表单中进行检查。 调试的默认方法是获取一个 SAS 密钥并检查所有内容,如果它有效,则将其缩小。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-08-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-05
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多