Пакетное удаление файлов из хранилища BLOB-объектов Azure с помощью учетной записи службы

Я использую лазурное хранилище BLOB-объектов для хранения файлов проекта.

У меня есть учетная запись службы хранилища BLOB-объектов Azure (client_id и client_secret). Я создал CloudBlobClient, используя StorageCredentialsToken, как показано ниже:

StorageCredentialsToken credentialsToken = new StorageCredentialsToken("account name", "access token generated uing client_id and client_secret");
CloudBlobClient blobClient = new CloudBlobClient(new URI("https://accountname.blob.core.windows.net/"), credentialsToken);
CloudBlobContainer cloudBlobContainer = blobClient.getContainerReference("conteiner name");

Теперь, используя CloudBlobContainer, я могу удалять по одному файлу за раз:

CloudBlockBlob blockBlobReference = cloudBlobContainer.getBlockBlobReference(key);
if (blockBlobReference.exists()) {
    blockBlobReference.delete();
}

Как я могу удалить несколько файлов за один вызов?

Я нахожу этот документ, в котором говорится, что мы можем удалить несколько файлов с помощью BlobBatchClient. В документе я не могу найти никаких способов создания BlobBatchClient с использованием учетной записи службы (с использованием токена доступа, полученного с помощью client_id и client_secret).

Можем ли мы удалить файлы в асинхронном вызове, поскольку мне нужно удалить сотни файлов? Есть ли альтернативные решения для пакетного удаления файлов?

Версия SDK compile group: 'com.microsoft.azure', name: 'azure-storage', version: '8.6.5'


person Nitin    schedule 19.10.2020    source источник
comment
doc показывает, что вы можете создать BlobBatchClient из BlobServiceClient. Вы пробовали использовать BlobServiceClient?   -  person Pamela Peng    schedule 19.10.2020
comment
Невозможно создать BlobServiceClient с помощью учетной записи службы (StorageCredentialsToken) ref: github.com/Azure/azure-sdk-for-java/tree/master/sdk/storage/   -  person Nitin    schedule 19.10.2020
comment
Извините, ссылка в моем предыдущем комментарии относится к Python. Я могу просто найти метод с использованием StorageSharedKeyCredential с account_name и account_key для создания BlobServiceClient.   -  person Pamela Peng    schedule 19.10.2020
comment
@NitinVavdiya В новом SDK хранилища java v12, StorageCredentialsToken был удален. Если вы хотите использовать аутентификацию Azure AD для доступа к BLOB-объекту, нам необходимо предоставить объект TokenCredential . Дополнительные сведения см. На странице github.com/Azure/azure-sdk. -for-java / issues / 6509   -  person Jim Xu    schedule 19.10.2020
comment
Эй, чтобы создать StorageSharedKeyCredential нам нужен accountKey. что здесь accountKey? Я попытался передать токен доступа, созданный с использованием client_id и client_secret, но он выдает ошибку java.lang.IllegalArgumentException: Illegal base64 character 2e Он не может декодировать токен доступа   -  person Nitin    schedule 19.10.2020


Ответы (1)


Согласно комментарию Джима, я создал BlobServiceAsyncClient, используя метод образца токена доступа:

public void delete(List<String> files) {
        String endpoint = "https://azureaccount.blob.core.windows.net/";
        AccessToken accessToken = new AccessToken("access token created with client id and client secret", OffsetDateTime.now().plusHours(1)); 
        BlobServiceAsyncClient storageClient = new BlobServiceClientBuilder().credential(request -> Mono.just(accessToken))
                .endpoint(endpoint)
                .buildAsyncClient();
        BlobBatchClient blobBatchClient = new BlobBatchClientBuilder(storageClient).buildClient();
        List<String> blobUrls = new ArrayList<>();
        files.forEach(name -> {
            try {
                String blobUrl = endpoint + "conteinerName/" + URLEncoder.encode(name, "UTF-8");
                blobUrls.add(blobUrl);
            } catch (UnsupportedEncodingException e) {
                LOGGER.debug("Can not encode blob name={}", name);
            }
        });
        blobBatchClient.deleteBlobs(blobUrls, DeleteSnapshotsOptionType.INCLUDE).forEach(response -> {
                    LOGGER.debug("File with name={} deleted, status code={}", response.getRequest().getUrl(), response.getStatusCode());
                }
        );
}

Зависимости Gradle:

compile group: 'com.azure', name: 'azure-storage-blob', version: '12.0.0'
compile group: 'com.azure', name: 'azure-storage-blob-batch', version: '12.6.0'
person Nitin    schedule 19.10.2020
comment
Каждый пакетный запрос поддерживает максимум 256 подзапросов. ref: docs.microsoft.com/en-us/rest/ api / storageservices / blob-batch - person Nitin; 21.10.2020