Azure python SDK - AzureHttpError:不满足使用HTTP条件标头指定的条件

时间:2016-12-06 13:08:34

标签: python azure azure-storage-blobs azure-sdk azure-sdk-python

我尝试使用以下代码从Azure Blob Storage下载大型VHD文件(30GB):

blob_service.get_blob_to_path('vhds', '20161206092429.vhd', '20161206092429.vhd')

其中第一个参数是容器名称,第二个参数是blob名称,第三个参数是保存它的本地文件/路径。这个30GB的下载工作正常,但突然间我开始收到这个错误:

  

AzureHttpError:使用HTTP条件指定的条件   标头不符合。 ConditionNotMet的   不符合使用HTTP条件标头指定的条件。   请求ID:88b6ac24-0001-0001-5ec0-4f490d000000   时间:2016-12-06T12:57:13.5389237Z

立即下载可以随机运行一段时间:有时真的很短,有时很长。甚至高达9或10GB的完整30GB下载。

根据这个问题:

Azure Blob: "The condition specified using HTTP conditional header(s) is not met"

304: The condition specified using HTTP conditional header(s) is not met

这似乎是一种竞争条件,但如果不深入研究和处理SDK代码,这对解决问题并没有多大帮助。有什么可能导致这种情况的建议,因为下载工作以前?也许是Azure云的中断?

2 个答案:

答案 0 :(得分:2)

随着VHD的变化,其相关的ETag将发生变化。一旦发生这种情况,文件复制操作将不再有效。我相信这是您通过拨打blob_service.get_blob_to_path()时所看到的内容,因为您的vhd正在与正在运行的VM一起使用。并且......即使虚拟机空闲 - 正在运行的操作系统永远不会空闲 - 总会有一些后台操作,可能会写入磁盘。

并不是说它能确保成功的文件复制操作,但您需要在启动副本之前先关闭VM。

或者,您可以制作VHD的快照,然后通过快照而不是原始vhd进行复制(这样可以让您在复制操作期间继续使用vhd。)

答案 1 :(得分:0)

如果您使用sas_token创建blob服务,它可能只设置为持续一个小时。如果是这种情况,您可以将创建时令牌的到期时间更改为以后的时间点。