使用服务帐户从 Azure Blob 存储中批量删除文件

Posted

技术标签:

【中文标题】使用服务帐户从 Azure Blob 存储中批量删除文件【英文标题】:Delete files in batch from azure blob storage using service account 【发布时间】:2021-02-02 00:22:29 【问题描述】:

我正在使用 azure blob 存储来存储我的项目文件。

我有一个 azure blob 存储的服务帐户(client_id 和 client_secret)。我使用StorageCredentialsToken 创建了CloudBlobClient,如下所示:

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();

如何使用一次调用删除多个文件?

我发现this 文档说我们可以使用BlobBatchClient 删除多个文件。在文档中,我找不到任何使用服务帐户创建BlobBatchClient 的方法(使用由client_id 和client_secret 获得的访问令牌)。

我们可以在异步调用中删除文件,因为我需要删除 100 个文件吗? 批量删除文件的任何替代解决方案?

SDK版本compile group: 'com.microsoft.azure', name: 'azure-storage', version: '8.6.5'

【问题讨论】:

doc 表明您可以从 BlobServiceClient 创建 BlobBatchClient。你试过用BlobServiceClient吗? 无法使用服务帐户创建BlobServiceClient (StorageCredentialsToken) ref: github.com/Azure/azure-sdk-for-java/tree/master/sdk/storage/… 对不起,我之前评论中的链接是关于 Python 的。我可以使用 StorageSharedKeyCredential 和 account_name 和 account_key 找到 method 来创建 BlobServiceClient。 @NitinVavdiya 在新的 java 存储 SDK v12 中,StorageCredentialsToken 已被删除。如果要使用 Azure AD auth 访问 blob,我们需要提供一个 TokenCredential 对象。更多详情请参考github.com/Azure/azure-sdk-for-java/issues/6509 嘿,要创建StorageSharedKeyCredential,我们需要accountKey。这里的 accountKey 是什么?我尝试传递使用 client_id 和 client_secret 生成的访问令牌,但它给出错误 java.lang.IllegalArgumentException: Illegal base64 character 2e 它无法解码访问令牌 【参考方案1】:

根据Jim 的评论,我使用访问令牌创建了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'

【讨论】:

每个批处理请求最多支持 256 个子请求。参考:docs.microsoft.com/en-us/rest/api/storageservices/blob-batch

以上是关于使用服务帐户从 Azure Blob 存储中批量删除文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 azure 逻辑应用将 blob 从 azure 存储帐户动态发送到电子邮件

使用 @azure/storage-blob 将 blob 从一个存储帐户复制到另一个

Azure 存储帐户:Blob 服务 (SAS) 连接检查失败

无法从在存储帐户的允许子网中创建的 Azure 虚拟机下载 blob

从 Azure 存储 Blob 中批量删除“x”天前的对象

Azure 门户在存储帐户中创建 Blob 容器时出错