我正在尝试使用适用于Java的Azure存储SDK将Azure VM(已停止并已分配)的页面Blob从一个Azure订阅复制到另一个Azure订阅。
这是我正在使用的代码:
public class BlobCopyExampleClean {
public static final String sourceStorageConnectionString =
"DefaultEndpointsProtocol=https;"
+ "AccountName=sourceStorageAccount;"
+ "AccountKey=key123";
public static final String destinationStorageConnectionString =
"DefaultEndpointsProtocol=https;"
+ "AccountName=destinationStorageAccount;"
+ "AccountKey=key321";
public static void main(String[] args) {
try {
CloudStorageAccount srcAccount = CloudStorageAccount.parse(sourceStorageConnectionString);
CloudBlobClient srcSrvClient = srcAccount.createCloudBlobClient();
CloudBlobContainer srcContainer = srcSrvClient.getContainerReference("vhds");
CloudStorageAccount destAccount = CloudStorageAccount.parse(destinationStorageConnectionString);
CloudBlobClient destSrvClient = destAccount.createCloudBlobClient();
CloudBlobContainer destContainer = destSrvClient.getContainerReference("vhds");
boolean result = destContainer.createIfNotExists();
CloudBlob srcBlob = srcContainer.getPageBlobReference("testvm-2015-11-06.vhd");
if (srcBlob.exists()) {
CloudBlob destBlob = destContainer.getPageBlobReference("testvm-2015-11-06-copied.vhd");
System.out.println("Starting blob copy...");
String copyJobId = destBlob.startCopyFromBlob(srcBlob);
CopyState copyState = destBlob.getCopyState();
while (copyState.getStatus().equals(CopyStatus.PENDING)) {
System.out.println("... copying ...");
Thread.sleep(30000);
}
System.out.println("Copy complete, status was: " + copyState.getStatus() + "!");
} else {
System.out.println("Source blob does not exist!");
}
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (StorageException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
无论我尝试什么,我总是会收到以下错误消息:
Starting blob copy...
com.microsoft.azure.storage.StorageException: The specified resource does not exist.
at com.microsoft.azure.storage.StorageException.translateException(StorageException.java:89)
at com.microsoft.azure.storage.core.StorageRequest.materializeException(StorageRequest.java:305)
at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:175)
at com.microsoft.azure.storage.blob.CloudBlob.startCopy(CloudBlob.java:883)
at com.microsoft.azure.storage.blob.CloudBlob.startCopyFromBlob(CloudBlob.java:788)
at com.company.azure.storage.BlobCopyExampleClean.main(BlobCopyExampleClean.java:44)
我试过使用SDK库的v1.3.1,v3.1.0和v4.0.0,并使用blob.startCopyFromBlob()(v1.3.1和v3.1.0)和blob.startCopy()(v4)遇到相同的错误。 0.0)。
有问题的页面Blob没有租约,因为Azure管理门户网站说租约状态为“未锁定”,并且确实存在,即使Azure API通过在第42行输入代码块也确认了这一点。
我尝试将Blob复制到同一订阅中的另一个存储帐户,这也给出相同的错误。
更详细地查看异常,错误代码为“ CannotVerifyCopySource”。
复制品发布在azure-storage-java库第59期中。从那里复制我和mirobers的答案:
要跨帐户复制Blob,您需要使用SAS令牌作为源或将源容器标记为公共访问。请参阅以下页面的“授权”部分:https : //msdn.microsoft.com/zh-cn/library/azure/dd894037.aspx
因此,例如,您的代码可以生成SAS令牌,以授予对源blob的读取访问权限,将其附加到源blob URL的查询字符串中,然后从URL开始复制。如果要查找特定的API,请在blob对象上签出generateSharedAccessSignature。您可以使用由此返回的令牌创建新的CloudStorageAccount并按照上面的代码流程从中获取Blob引用,或者将其附加到Blob URL并使用CloudBlockBlob(URL)构造函数直接获取Blob引用。
您的代码还有另一个问题,就是getCopyState不会进行服务调用。这只是获取先前由startCopy设置的Blob复制状态。在while循环内,您应该尝试使用downloadAttributes代替,它实际上会进行服务调用以从Blob获取更新的副本信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句