如何自动删除Azure Blob存储中无"production"标签且超过1个月的旧Blob以实现存储维护?
如何自动删除Azure Blob存储中无"production"标签且超过1个月的旧Blob以实现存储维护?
我完全懂你的困扰——Azure Blob存储的标签查询确实只支持等值匹配,没法直接筛选“没有production标签”的Blob,但咱们可以通过几个实用的方法绕开这个限制,实现自动清理的需求。下面给你分享几个可行的方案:
方案一:用PowerShell脚本批量清理(适合手动触发或定时自动化)
这个方案适合熟悉PowerShell的用户,你可以编写脚本遍历Blob,先筛选出超过1个月的旧Blob,再检查它们是否带有production标签,没有的就执行删除。
示例脚本:
# 配置参数 $storageAccountName = "你的存储账户名称" $containerName = "目标容器名称" $daysOld = 30 # 按30天定义1个月 $cutoffDate = (Get-Date).AddDays(-$daysOld) # 获取存储账户上下文(会自动弹出登录验证,或使用服务主体认证) $ctx = New-AzStorageContext -StorageAccountName $storageAccountName -UseConnectedAccount # 遍历容器内所有Blob并执行清理逻辑 Get-AzStorageBlob -Container $containerName -Context $ctx | ForEach-Object { # 先判断Blob创建时间是否超过截止日期 if ($_.ICreatedOn -lt $cutoffDate) { # 获取当前Blob的标签集合 $blobTags = Get-AzStorageBlobTag -Blob $_.Name -Container $containerName -Context $ctx # 检查是否存在"production"标签(注意标签键名大小写敏感) if (-not $blobTags.ContainsKey("production")) { Write-Host "准备删除旧的非生产Blob: $($_.Name)" # 执行删除(-Force参数会跳过确认) Remove-AzStorageBlob -Blob $_.Name -Container $containerName -Context $ctx -Force } } }
自动化建议:
你可以把这个脚本放到Azure Automation中,创建一个定时作业(比如每周运行一次),实现完全自动的清理。
方案二:用Azure CLI脚本实现跨平台清理
如果习惯用命令行或者需要跨平台运行,可以用Azure CLI结合jq工具来处理JSON格式的Blob数据:
示例脚本:
# 配置参数 STORAGE_ACCOUNT="你的存储账户名称" CONTAINER="目标容器名称" DAYS_OLD=30 # 计算截止日期(UTC格式) CUTOFF_DATE=$(date -d "-$DAYS_OLD days" +%Y-%m-%dT%H:%M:%SZ) # 列出所有超过截止日期的Blob,同时获取标签信息 az storage blob list \ --account-name $STORAGE_ACCOUNT \ --container-name $CONTAINER \ --query "[?properties.creationTime < '$CUTOFF_DATE']" \ --output json | jq -r '.[] | .name, .tags' | while read -r BLOB_NAME; do read -r TAGS # 检查标签中是否包含"production"键 if ! echo "$TAGS" | jq -e '.production' > /dev/null 2>&1; then echo "准备删除旧的非生产Blob: $BLOB_NAME" az storage blob delete \ --account-name $STORAGE_ACCOUNT \ --container-name $CONTAINER \ --name $BLOB_NAME fi done
注意:
需要提前安装jq工具来解析JSON数据,同样可以通过Cron(Linux)或任务计划程序(Windows)定时运行脚本。
方案三:用Azure Functions实现全自动定时清理
如果想要更“云原生”的自动化方案,可以用Azure Functions的定时触发器(Timer Trigger),每次触发时执行清理逻辑,支持多种编程语言(Python、C#、JavaScript等)。
Python示例代码:
import logging import os from datetime import datetime, timedelta import azure.functions as func from azure.storage.blob import BlobServiceClient def main(mytimer: func.TimerRequest) -> None: utc_timestamp = datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat() if mytimer.past_due: logging.info('定时器已延迟执行!') # 初始化Blob服务客户端 connection_string = os.environ["AzureWebJobsStorage"] blob_service_client = BlobServiceClient.from_connection_string(connection_string) container_name = "目标容器名称" days_old = 30 cutoff_date = datetime.utcnow() - timedelta(days=days_old) container_client = blob_service_client.get_container_client(container_name) # 列出所有Blob并包含标签信息 for blob in container_client.list_blobs(include='tags'): # 检查Blob创建时间是否超过截止日期 if blob.creation_time < cutoff_date: # 检查是否存在"production"标签 if 'production' not in blob.tags: container_client.delete_blob(blob.name) logging.info(f"已删除旧的非生产Blob: {blob.name}")
配置建议:
把函数的触发器设置为每天或每周运行一次,函数会自动在后台执行清理任务,无需手动干预。
一些关键注意事项
- 标签键名是大小写敏感的,确保你检查的键名和标记生产Blob时用的完全一致(比如不要把
Production和production搞混) - 测试脚本时建议先去掉删除命令,只打印要删除的Blob列表,确认筛选逻辑正确后再执行删除
- 如果Blob数量极大(十万级以上),建议在脚本中添加分页查询逻辑,避免一次性加载过多数据导致性能问题
- 可以给删除操作添加日志记录,方便后续排查问题
备注:内容来源于stack exchange,提问作者Chaouki Tiouassiouine
相关产品推荐
相关产品推荐

