Использование пакета SDK службы хранилища Azure для Java для копирования большого двоичного объекта страницы виртуальной машины из одной подписки Azure в другую.

Я пытаюсь использовать пакет SDK службы хранилища Azure для Java, чтобы скопировать большой двоичный объект страницы виртуальной машины 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)

Я пробовал использовать v1.3.1, v3.1.0 и v4.0.0 библиотеки SDK и получил ту же ошибку, используя как blob.startCopyFromBlob () (v1.3.1 & v3.1.0), так и blob.startCopy () (v4. 0,0).

У рассматриваемого страничного большого двоичного объекта нет аренды, поскольку портал управления Azure сообщает, что статус аренды - «Разблокирован», и он существует, даже API Azure подтверждает это, вводя блок кода в строке 42.

Я попытался скопировать большой двоичный объект в другую учетную запись хранения в рамках той же подписки, и это тоже дает ту же ошибку.

При более подробном рассмотрении исключения код ошибки: CannotVerifyCopySource.


person jonbullock    schedule 09.11.2015    source источник
comment
Я просмотрел документацию по REST API для этого кода ошибки здесь (msdn.microsoft .com / en-us / library / azure / dd179439.aspx) и там написано Could not verify the copy source within the specified time. Examine the HTTP status code and message for more information about the failure.. Не могли бы вы проверить сообщение? Это должно дать вам больше информации.   -  person Gaurav Mantri    schedule 09.11.2015


Ответы (1)


Дубликат размещен в выпуске 59 библиотеки azure-storage-java. Копирование моего и mirobers ответа оттуда:

Чтобы скопировать большой двоичный объект между учетными записями, вам необходимо использовать токен SAS для источника или пометить исходный контейнер для общего доступа. См. Раздел «Авторизация» на следующей странице: https://msdn.microsoft.com/en-us/library/azure/dd894037.aspx

Так, например, ваш код может сгенерировать маркер SAS, предоставляющий доступ для чтения к исходному BLOB-объекту, добавить его в строку запроса URL-адреса исходного BLOB-объекта, а затем запустить копирование с URL-адреса. Если вы ищете конкретные API-интерфейсы, проверьте generateSharedAccessSignature на объекте большого двоичного объекта. Вы можете использовать возвращенный этим токен либо для создания нового CloudStorageAccount и следовать приведенному выше потоку кода, чтобы получить ссылку на большой двоичный объект, либо добавить его к URL-адресу большого двоичного объекта и использовать конструктор CloudBlockBlob (URL), чтобы напрямую получить ссылку на большой двоичный объект.

У вашего кода есть еще одна проблема: getCopyState не выполняет вызов службы. Это просто получение состояния копии большого двоичного объекта, ранее установленного startCopy. Внутри цикла while вы должны попробовать вместо этого использовать downloadAttributes, который фактически выполнит вызов службы для получения обновленной информации о копии из большого двоичного объекта.

person Emily Gerner    schedule 09.11.2015
comment
См. Также лазурный. microsoft.com/en-us/documentation/articles/. - person Tamra Myers - Microsoft; 11.11.2015