使用适用于Java的Azure存储SDK将VM页面Blob从一个Azure订阅复制到另一个

简布洛克

我正在尝试使用适用于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”。

艾米丽·格纳(Emily Gerner)

复制品发布在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Azure 使用 rest API 将 blob 从一个存储帐户复制到同一订阅中的另一个

来自分类Dev

如何使用Azure Blob存储SDK将Blob从一个容器复制到另一个容器

来自分类Dev

Azure:无法将存档Blob从一个存储帐户复制到另一个存储帐户?

来自分类Dev

使用.Net API startCopy将页面Blob从一个存储帐户复制到另一个存储帐户

来自分类Dev

将 azure 数据库从一个订阅复制到 azure 门户上的另一个订阅

来自分类Dev

如何将Azure中的Blob复制到带有节点sdk的另一个容器

来自分类Dev

如何将证书从一个Azure密钥保管库复制到另一个?

来自分类Dev

使用Java将数据从一个表复制到Cassandra中的另一个表

来自分类Dev

AzCopy - 如何从 root$ 开始递归地将所有 blob 从一个存储帐户复制到另一个存储帐户

来自分类Dev

无法将Blob从一个容器复制到另一个容器

来自分类Dev

自动将推送的文件从一个GitHub存储库复制到另一个

来自分类Dev

将像素从一个图像复制到另一个

来自分类Dev

将文件从一个目录复制到另一个

来自分类Dev

将元素从一个内存复制到另一个

来自分类Dev

将数据从一个hbase表复制到另一个

来自分类Dev

将Android Activity从一个应用复制到另一个

来自分类Dev

将数据从一个表复制到另一个表

来自分类Dev

将内容从一个元素复制到另一个

来自分类Dev

将条件从一个对象复制到另一个对象

来自分类Dev

将特定的列从一个DataTable复制到另一个

来自分类Dev

将JS事件从一个元素复制到另一个

来自分类Dev

将消息从一个队列复制到另一个队列

来自分类Dev

将范围从一个容器复制到另一个容器

来自分类Dev

将文件从一个目录复制到另一个目录

来自分类Dev

将几列从一个表复制到另一个

来自分类Dev

将文件从一个拉链复制到另一个?

来自分类Dev

将文件从一个拉链复制到另一个?

来自分类Dev

将文件从一个NAS复制到另一个

来自分类Dev

将特定的列从一个DataTable复制到另一个

Related 相关文章

  1. 1

    Azure 使用 rest API 将 blob 从一个存储帐户复制到同一订阅中的另一个

  2. 2

    如何使用Azure Blob存储SDK将Blob从一个容器复制到另一个容器

  3. 3

    Azure:无法将存档Blob从一个存储帐户复制到另一个存储帐户?

  4. 4

    使用.Net API startCopy将页面Blob从一个存储帐户复制到另一个存储帐户

  5. 5

    将 azure 数据库从一个订阅复制到 azure 门户上的另一个订阅

  6. 6

    如何将Azure中的Blob复制到带有节点sdk的另一个容器

  7. 7

    如何将证书从一个Azure密钥保管库复制到另一个?

  8. 8

    使用Java将数据从一个表复制到Cassandra中的另一个表

  9. 9

    AzCopy - 如何从 root$ 开始递归地将所有 blob 从一个存储帐户复制到另一个存储帐户

  10. 10

    无法将Blob从一个容器复制到另一个容器

  11. 11

    自动将推送的文件从一个GitHub存储库复制到另一个

  12. 12

    将像素从一个图像复制到另一个

  13. 13

    将文件从一个目录复制到另一个

  14. 14

    将元素从一个内存复制到另一个

  15. 15

    将数据从一个hbase表复制到另一个

  16. 16

    将Android Activity从一个应用复制到另一个

  17. 17

    将数据从一个表复制到另一个表

  18. 18

    将内容从一个元素复制到另一个

  19. 19

    将条件从一个对象复制到另一个对象

  20. 20

    将特定的列从一个DataTable复制到另一个

  21. 21

    将JS事件从一个元素复制到另一个

  22. 22

    将消息从一个队列复制到另一个队列

  23. 23

    将范围从一个容器复制到另一个容器

  24. 24

    将文件从一个目录复制到另一个目录

  25. 25

    将几列从一个表复制到另一个

  26. 26

    将文件从一个拉链复制到另一个?

  27. 27

    将文件从一个拉链复制到另一个?

  28. 28

    将文件从一个NAS复制到另一个

  29. 29

    将特定的列从一个DataTable复制到另一个

热门标签

归档