Поделиться через


Копирование большого двоичного объекта из URL-адреса исходного объекта с помощью Go

В этой статье показано, как скопировать BLOB-объект из URL-адреса исходного объекта с помощью клиентского модуля Azure Storage для Go. Блоб можно скопировать из источника в той же учетной записи хранения, из источника в другой учетной записи хранения или из любого доступного объекта, полученного с помощью HTTP GET-запроса по указанному URL.

Методы клиентской библиотеки, описанные в этой статье, используют операции Put Blob From URL и Put Block From URL REST API. Эти методы предпочтительны для сценариев копирования, в которых требуется переместить данные в учетную запись хранения и иметь URL-адрес исходного объекта. Операции копирования, в которых требуется асинхронное планирование, см. в разделе "Копирование большого двоичного объекта с асинхронным планированием с помощью Go".

Предварительные условия

Настройка среды

Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентским модулем Хранилище BLOB-объектов Azure для Go. Ниже приведены действия по установке модуля, добавлению import путей и созданию авторизованного клиентского объекта. Дополнительные сведения см. в Начало работы с объектами Blob хранилища Azure и Go.

Установка модулей

Установите модуль azblob с помощью следующей команды:

go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

Чтобы выполнить проверку подлинности с помощью идентификатора Microsoft Entra (рекомендуется), установите azidentity модуль с помощью следующей команды:

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

Добавление путей импорта

В файле кода добавьте следующие пути импорта:

import (
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

Эти пути импорта представляют собой минимальное необходимое для начала. В некоторых примерах кода в этой статье могут потребоваться дополнительные пути импорта. Дополнительные сведения и примеры использования см. в примерах кода.

Создание клиентского объекта

Чтобы подключить приложение к хранилищу BLOB-объектов, создайте клиентский объект с помощью azblob. NewClient. В следующем примере показано, как создать клиентский объект с помощью DefaultAzureCredential авторизации:

func getServiceClientTokenCredential(accountURL string) *azblob.Client {
    // Create a new service client with token credential
    credential, err := azidentity.NewDefaultAzureCredential(nil)
    handleError(err)

    client, err := azblob.NewClient(accountURL, credential, nil)
    handleError(err)

    return client
}

Авторизация

Механизм авторизации должен иметь необходимые разрешения для выполнения операции копирования. Для авторизации с помощью Microsoft Entra ID (рекомендуется) требуется встроенная роль Azure RBAC Storage Blob Data Contributor или более высокая. Дополнительные сведения см. в руководстве по авторизации для Put Blob From URL или Put Block From URL.

Сведения о копировании BLOB из URL исходного объекта

Операция Put Blob From URL создает новый блочный BLOB-объект, содержимое которого считывается из заданного URL-адреса. Операция выполняется синхронно.

Источник может быть любым объектом, извлекаемым через стандартный HTTP-запрос GET по указанному URL-адресу. К ним относятся блочные BLOB-объекты, добавляемые BLOB-объекты, страничные BLOB-объекты, моментальные снимки BLOB-объектов, версии BLOB-объектов или любой доступный объект внутри или за пределами Azure.

Когда исходный объект является блоком блоба, копируется все зафиксированное содержимое. Содержимое целевого блоба идентично содержимому исходного блоба, однако список зафиксированных блоков не сохраняется, и незафиксированные блоки не копируются.

Целью всегда является блоковый объект, либо существующий, либо новый, созданный в результате операции. Содержимое существующего блока перезаписывается содержимым нового блока.

Операция Put Blob From URL всегда копирует весь исходный блоб. Копирование диапазона байтов или набора блоков не поддерживается. Чтобы выполнить частичные обновления содержимого блочного BLOB-объекта с помощью исходного URL-адреса, используйте API Put Block From URL вместе с Put Block List.

Дополнительные сведения об Put Blob From URL операции, включая ограничения размера BLOB-объектов и учет выставления счетов, см. в статье Put Blob From URL (примечания).

Скопировать blob из URL-адреса исходного объекта

В этом разделе представлен обзор методов, предоставляемых клиентской библиотекой Azure Storage для Go, для копирования из URL-адреса исходного объекта.

Следующий метод обертывает операцию REST API Put Blob From URL и создает новый блочный BLOB-объект, содержимое которого считывается из указанного URL-адреса.

Этот метод предпочтителен для сценариев, в которых требуется переместить данные в учетную запись хранения и иметь URL-адрес исходного объекта.

Для больших объектов можно использовать отдельные блоки. Следующий метод оборачивает операцию Put Block From URL REST API. Этот метод создает новый блок для фиксации в составе большого двоичного объекта, в котором содержимое считывается из исходного URL-адреса:

Копирование большого двоичного объекта из источника в Azure

Если вы копируете абстрактный блоб из источника в Azure, доступ к исходному блобу можно авторизовать с помощью Microsoft Entra ID (рекомендуется), подписанного URL-адреса (SAS) или ключа учетной записи.

В следующем примере кода показан сценарий копирования исходного объекта внутри Azure. В этом примере мы также зададим уровень доступа для целевого BLOB-объекта Cool с помощью структуры UploadBlobFromURLOptions .

func copyFromSourceURL(srcBlob *blockblob.Client, destBlob *blockblob.Client) {
    // Set copy options
    copyOptions := blockblob.UploadBlobFromURLOptions{
        Tier: to.Ptr(blob.AccessTierCool),
    }

    // Copy the blob from the source URL to the destination blob
    _, err := destBlob.UploadBlobFromURL(context.TODO(), srcBlob.URL(), &copyOptions)
    handleError(err)
}

В следующем примере показан пример использования:

// TODO: replace <storage-account-name> placeholders with actual storage account names
srcURL := "https://<src-storage-account-name>.blob.core.windows.net/"
destURL := "https://<dest-storage-account-name>.blob.core.windows.net/"

credential, err := azidentity.NewDefaultAzureCredential(nil)
handleError(err)

srcClient, err := azblob.NewClient(srcURL, credential, nil)
handleError(err)
destClient, err := azblob.NewClient(destURL, credential, nil)
handleError(err)

srcBlob := srcClient.ServiceClient().NewContainerClient("source-container").NewBlockBlobClient("source-blob")
destBlob := destClient.ServiceClient().NewContainerClient("destination-container").NewBlockBlobClient("destination-blob-1")

copyFromSourceURL(srcBlob, destBlob)

Копирование большого двоичного объекта из источника за пределами Azure

Вы можете выполнить операцию копирования для любого исходного объекта, который можно получить через HTTP-запрос GET по указанному URL-адресу, включая доступные объекты за пределами Azure. В следующем примере кода показан сценарий копирования объекта BLOB с URL доступного исходного объекта.

func copyFromExternalSource(srcURL string, destBlob *blockblob.Client) {
    // Set copy options
    copyOptions := blockblob.UploadBlobFromURLOptions{
        Tier: to.Ptr(blob.AccessTierCool),
    }

    // Copy the blob from the source URL to the destination blob
    _, err := destBlob.UploadBlobFromURL(context.TODO(), srcURL, &copyOptions)
    handleError(err)
}

В следующем примере показан пример использования:

externalURL := "<source-url>"

destBlob = destClient.ServiceClient().NewContainerClient("destination-container").NewBlockBlobClient("destination-blob-2")

copyFromExternalSource(externalURL, destBlob)

Ресурсы

Чтобы узнать больше о копировании объектов BLOB с помощью клиентской библиотеки Хранилища BLOB-объектов Azure для Go, см. в следующих ресурсах.

Примеры кода

  • Просмотр примеров кода из этой статьи (GitHub)

Операции REST API

Пакет SDK Azure для Go содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API через знакомые парадигмы Go. Методы клиентской библиотеки, описанные в этой статье, используют следующие операции REST API:

Ресурсы модуля клиента

  • Эта статья является частью руководства разработчика для работы с хранилищем блобов в Go. Дополнительные сведения см. в полном списке статей руководства разработчика по созданию приложения Go.