This article gives you a snippet to clean up your blob storage frequent, to keep only a specific time of data.
Azure Blob Storage offers a brilliant and straightforward solution for storing vast amounts of data. However, when it’s unnecessary to retain all data indefinitely, such as data only needed for a few days, it becomes essential to periodically clean up the storage. This ensures optimal resource management and cost-effectiveness within your Azure environment.
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace OliverSamples
{
public class CleanupFunction(ILoggerFactory loggerFactory)
{
private readonly ILoggerFactory _loggerFactory = loggerFactory;
private readonly ILogger _logger = loggerFactory.CreateLogger<CleanupFunction>();
[Function("StorageCleanup")]
public async Task Run([TimerTrigger("0 */2 * * * *")] TimerInfo myTimer)
{
_logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
StorageService storageService = new(_loggerFactory);
await storageService.DeleteOldData();
if (myTimer.ScheduleStatus is not null)
{
_logger.LogInformation($"Next timer schedule at: {myTimer.ScheduleStatus.Next}");
}
}
}
}
The logic for cleaning up the storage resides within a small service helper that I’ve personally developed.
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using System.Text.Json;
public class OliverSamples
{
private readonly string _blogStorageConnectionString;
private readonly ILogger<StorageService> _logger;
private CloudStorageAccount? _storageAccount;
private CloudBlobClient? _blobClient;
private int _maxHoursToKeep = 24;
public StorageService(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<StorageService>();
string blogStorageConnectionString = Environment.GetEnvironmentVariable(Const.AppSettings.STORAGE_ACCOUNT_CONNECTION_STRING) ?? "";
if (string.IsNullOrEmpty(blogStorageConnectionString))
{
throw new Exception($"Configuration '{Const.AppSettings.STORAGE_ACCOUNT_CONNECTION_STRING}' is not set.");
}
_blogStorageConnectionString = blogStorageConnectionString;
}
private CloudBlobClient GetBlobClient()
{
if (_blobClient != null)
{
return _blobClient;
}
_storageAccount ??= CloudStorageAccount.Parse(_blogStorageConnectionString);
_blobClient = _storageAccount.CreateCloudBlobClient();
return _blobClient;
}
public async Task DeleteOldData()
{
List<string> containerToClean =
[
"MyContainer1",
"MyContainer2",
"MyContainer3"
];
foreach(var container in containerToClean)
{
await CleanContainer(container);
}
}
private async Task CleanContainer(string containerName)
{
CloudBlobClient blobClient = GetBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
BlobContinuationToken continuationToken = null;
do
{
var resultSegment = await container.ListBlobsSegmentedAsync(null, true, BlobListingDetails.Metadata, null, continuationToken, null, null);
continuationToken = resultSegment.ContinuationToken;
foreach (IListBlobItem item in resultSegment.Results)
{
if (item is CloudBlockBlob blockBlob)
{
DateTimeOffset? created = blockBlob.Properties.Created;
if (created.HasValue && DateTimeOffset.UtcNow.Subtract(created.Value).TotalHours > _maxHoursToKeep)
{
await blockBlob.DeleteAsync();
}
}
}
} while (continuationToken != null);
}
}
Conclusion
With this Azure Function you clean containers in your blob storage ever 5 minutes. Files that are older than 24 hours, will be removed.