自动删除/过期Azure Blob在一段时间后

58

使用Azure Blob存储,是否可以像Amazon AWS S3的对象过期功能一样,在特定时间后删除单个Blob或容器内的所有Blob?或者Azure存储不提供这样的功能?


参见:https://stackoverflow.com/questions/tagged/azure-logic-apps - dreftymac
7个回答


15

因为我错过了这个功能好多年,所以我写了一个小项目,并加入了一个漂亮的'Deploy to Azure button'。虽然还不完美,但是可以使用。https://github.com/nulllogicone/ExpireBlobFunction

现在我发现Microsoft已经在2019年3月27日将此作为新功能发布

以下是文章中的摘录:

Azure Blob存储生命周期管理为GPv2和Blob存储帐户提供丰富的基于规则的策略。 使用策略将数据转换为适当的访问层或在数据生命周期结束时过期。

生命周期管理策略可让您执行以下操作:

  • 将Blob转换为更冷的存储层(热到低温、热到归档或低温到归档),以优化性能和成本
  • 删除Blob在其生命周期结束时
  • 定义每天在存储帐户级别运行一次的规则 将规则应用于容器或一组blob(使用前缀作为过滤器)

2
截至2019年1月,该功能仍处于预览阶段,但可能即将推出GA版本。 - Simon Opelt
2
该功能现已普遍可用 - LowlyDBA - John M
您可以使用生命周期管理策略;https://learn.microsoft.com/zh-cn/azure/storage/blobs/storage-lifecycle-management-concepts?tabs=azure-portal - Vinayak Shenoy

10

您可以以各种方式自动删除。早些时候,甚至可以通过逻辑应用程序进行操作,但有时并不那么清楚。 今天,您可以直接在存储帐户中使用此功能: 存储账户菜单

在那里,您可以使用简单而明确的任务生成器(模板)来删除旧的 Blob。 输入图像说明



4
Azure存储团队最近发布了一篇(2017年10月5日)关于过期Blob的更新。现在可以使用Azure逻辑应用程序模板实现这一点,他们将在今年晚些时候推出本地blob存储解决方案。
链接:为Blobs提供生存时间功能 我们很高兴宣布,我们已经提供了一个Azure逻辑应用程序模板来过期旧的Blob。要在您的环境中设置这个自动化解决方案:创建一个新的逻辑应用程序实例,选择“删除旧的Azure Blob”模板,进行自定义和运行。在接下来的几周里,我们将发布详细指导说明并提供更多的模板。
允许用户从存储中本地定义Blob的到期策略仍然计划在未来的一年内实现。我们会在有进展时及时分享。我们将至少每个季度继续提供更新。
如果您有任何进一步的问题,或者想讨论您特定的情况,请发送电子邮件至azurestoragefeedback@microsoft.com。

8
我们已经实施了Azure Logic App,但实际上这意味着创建一个列出Blob、过滤旧Blob并删除它们的应用程序。您需要为逻辑应用程序付费,而且费用似乎非常昂贵。我们的订阅账单在短短两天内就增加了超过230美元!此外,这个逻辑应用程序还需要监控和维护,因此我认为它不是一种托管的解决方案。在实施之前请注意,并注意跟踪您的费用! - Ramon de Klein

3
Azure存储没有过期功能,您必须通过应用程序删除blob。如何做取决于您; 您需要在某个地方存储到期日期目标(无论是在数据库中还是在blob属性中)。
您可以通过共享访问签名(通过在SAS上设置结束日期)有效地创建TTL,以便在需要移除访问权限时有一种有效的方式,然后有一个后续过程来删除现在已过期的blob。

1

是的,这是可能的。参考以下两个链接,这些示例代码并不好找。

规则参考:https://learn.microsoft.com/en-us/azure/storage/blobs/lifecycle-management-overview?tabs=azure-portal

Python 示例代码参考:https://github.com/Azure-Samples/azure-samples-python-management/blob/master/samples/storage/manage_management_policy.py

我使用的代码片段:

def add_expiry_rule(self):
        token_credential = ClientSecretCredential(
            tenant_id=tenant_id,
            client_id=client_id,
            client_secret=client_secret,
        )
        storage_client = StorageManagementClient(
            credential=token_credential, subscription_id=subscription_id
        )
        rule = {
            "id": "test",
            "prefix": "test/",
            "expiration": 91,
        }
        azure_rule = {
            "enabled": True,
            "name": rule.get("id"),
            "type": "Lifecycle",
            "definition": {
                "filters": {"blob_types": ["blockBlob"], "prefix_match": [rule.get("prefix")]},
                "actions": {
                    "base_blob": {
                        "delete": {
                            "days_after_modification_greater_than": str(rule.get("expiration"))
                        }
                    }
                },
            },
        }
        try:
            management_policy = storage_client.management_policies.get(
                group_name, storage_account, "default"
            )
            existing_rules = management_policy.policy.as_dict()
            existing_rules.get("rules").append(azure_rule)
            management_policy_rules = existing_rules
        except Exception as e:
            management_policy_rules = {"rules": [azure_rule]}
        try:
            management_policy = storage_client.management_policies.create_or_update(
                group_name,
                storage_account,
                "default",
                {"policy": management_policy_rules},
            )
            print("Azure: Added rule {} successfully".format(rule.get("id")))
        except Exception as e:
            if e.message.endswith("conflicting rule name."):
                print("Azure: Rule ID: {} exists".format(rule.get("id")))
            else:
                raise Exception("Azure: Error adding rule. {}".format(e.message))

1
欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接的页面中最相关的部分,以防目标页面无法访问。 - cursorrux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接