You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 10:49:36