Skip to content

Commit b3397a1

Browse files
Merge pull request #269984 from normesta/immutability
Setting up a PR for Immutability overhaul
2 parents 8f265ca + ea06bfe commit b3397a1

17 files changed

+305
-309
lines changed

articles/cost-management-billing/manage/cancel-azure-subscription.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Although not required, Microsoft *recommends* that you take the following action
2121
* Consider migrating your data. See [Move resources to new resource group or subscription](../../azure-resource-manager/management/move-resource-group-and-subscription.md).
2222
* Delete all resources and all resource groups.
2323
* To later manually delete a subscription, you must first delete all resources associated with the subscription.
24-
* You might be unable to delete all resources, depending on your configuration. For example, if you have immutable blobs. For more information, see [Immutable Blobs](../../storage/blobs/immutable-storage-overview.md#scenarios-with-version-level-scope).
24+
* You might be unable to delete all resources, depending on your configuration. For example, if you have immutable blobs. For more information, see [Immutable Blobs](../../storage/blobs/immutable-version-level-worm-policies.md#scenarios).
2525
* If you have any custom roles that reference this subscription in `AssignableScopes`, you should update those custom roles to remove the subscription. If you try to update a custom role after you cancel a subscription, you might get an error. For more information, see [Troubleshoot problems with custom roles](../../role-based-access-control/troubleshooting.md#custom-roles) and [Azure custom roles](../../role-based-access-control/custom-roles.md).
2626

2727
Instead of canceling a subscription, you can remove all of its resources to [prevent unwanted charges](../understand/plan-manage-costs.md#prevent-unwanted-charges).
@@ -114,7 +114,7 @@ After you cancel, your services are disabled. That means your virtual machines a
114114

115115
:::image type="content" source="./media/cancel-azure-subscription/cancel-window.png" alt-text="Screenshot showing the cancellation window." lightbox="./media/cancel-azure-subscription/cancel-window.png" :::
116116

117-
After you cancel a subscription, your billing stops immediately. You can delete your subscription directly using the Azure portal seven days after you cancel it, when the **Delete subscription** option becomes available. When your subscription is cancelled, Microsoft waits 30 to 90 days before permanently deleting your data in case you need to access it or recover your data. We don't charge you for retaining the data. For more information, see [Microsoft Trust Center - How we manage your data](https://go.microsoft.com/fwLink/p/?LinkID=822930).
117+
After you cancel a subscription, your billing stops immediately. You can delete your subscription directly using the Azure portal seven days after you cancel it, when the **Delete subscription** option becomes available. When your subscription is canceled, Microsoft waits 30 to 90 days before permanently deleting your data in case you need to access it or recover your data. We don't charge you for retaining the data. For more information, see [Microsoft Trust Center - How we manage your data](https://go.microsoft.com/fwLink/p/?LinkID=822930).
118118

119119
>[!NOTE]
120120
> You must manually cancel your SaaS subscriptions before you cancel your Azure subscription. Only pay-as-you-go SaaS subscriptions are cancelled automatically by the Azure subscription cancellation process.

articles/storage/.openpublishing.redirection.storage.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,16 @@
8585
"redirect_url": "/azure/storage/blobs/data-lake-storage-upgrade",
8686
"redirect_document_id": false
8787
},
88+
{
89+
"source_path_from_root": "/articles/storage/blobs/immutable-time-based-retention-policy-overview.md",
90+
"redirect_url": "/azure/storage/blobs/immutable-storage-overview#time-based-retention-policies",
91+
"redirect_document_id": false
92+
},
93+
{
94+
"source_path_from_root": "/articles/storage/blobs/immutable-legal-hold-overview.md",
95+
"redirect_url": "/azure/storage/blobs/immutable-storage-overview#legal-holds",
96+
"redirect_document_id": false
97+
},
8898
{
8999
"source_path_from_root": "/articles/storage/blobs/data-lake-storage-handle-data-using-databricks.md",
90100
"redirect_url": "/azure/azure-databricks/databricks-extract-load-sql-data-warehouse",

articles/storage/blobs/TOC.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -400,14 +400,14 @@ items:
400400
- name: Immutable storage
401401
href: immutable-storage-overview.md
402402
items:
403-
- name: Time-based retention policies
404-
href: immutable-time-based-retention-policy-overview.md
405-
- name: Legal holds
406-
href: immutable-legal-hold-overview.md
407-
- name: Configure version-level immutability policies
408-
href: immutable-policy-configure-version-scope.md
409-
- name: Configure container-level immutability policies
403+
- name: Container-level policies
404+
href: immutable-container-level-worm-policies.md
405+
- name: Version-level policies
406+
href: immutable-version-level-worm-policies.md
407+
- name: Configure container-level policies
410408
href: immutable-policy-configure-container-scope.md
409+
- name: Configure version-level policies
410+
href: immutable-policy-configure-version-scope.md
411411
- name: Availability and disaster recovery
412412
items:
413413
- name: Design highly available applications
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
---
2+
title: Container-level WORM policies for immutable blob data
3+
titleSuffix: Azure Storage
4+
description: A container-level write once, read many (WORM) policy is a type of immutability policy that can be set at the container-level.
5+
services: storage
6+
author: normesta
7+
8+
ms.service: azure-blob-storage
9+
ms.topic: conceptual
10+
ms.date: 03/26/2024
11+
ms.author: normesta
12+
---
13+
14+
# Container-level write once, read many (WORM) policies for immutable blob data
15+
16+
A container-level write once, read many (WORM) policy is a type of immutability policy that can be set at the container-level. To learn more about immutable storage for Azure Blob Storage, see [Store business-critical blob data with immutable storage in a write once, read many (WORM) state](immutable-storage-overview.md)
17+
18+
## Availability
19+
20+
Container-level WORM (CLW) policies are available for all new and existing containers. These policies are supported for general-purpose v2, premium block blob, general-purpose v1 (legacy), and blob storage (legacy) accounts.
21+
22+
> [!TIP]
23+
> Microsoft recommends upgrading general-purpose v1 accounts to general-purpose v2 so that you can take advantage of more features. For information on upgrading an existing general-purpose v1 storage account, see [Upgrade a storage account](../common/storage-account-upgrade.md).
24+
25+
This feature is supported for hierarchical namespace accounts. If hierarchical namespace is enabled, you can't rename or move a blob when the blob is in the immutable state. Both the blob name and the directory structure provide essential container-level data that can't be modified once the immutable policy is in place.
26+
27+
There's no enablement process for this feature; it's automatically available for all containers. To learn more about how to set a policy on a new or existing container, see [Configure container-level WORM immutability policies](immutable-policy-configure-container-scope.md).
28+
29+
## Deletion
30+
31+
A container with a container-level WORM policy set must be empty before the container can be deleted. If there's a policy set on a container with hierarchical namespace enabled, a directory must be empty before it can be deleted.
32+
33+
> [!div class="mx-imgBorder"]
34+
> ![Diagram that shows the order of operations in deleting an account that has a container-level WORM policy.](media/immutable-version-level-worm-policies/container-level-immutable-storage-deletion.png)
35+
36+
## Scenarios
37+
38+
| Scenario | Prohibited operations | Blob protection | Container protection | Account protection |
39+
|----|----|----|-----|-----|
40+
| A container is protected by an active time-based retention policy with container scope and/or a legal hold is in effect | [Delete Blob](/rest/api/storageservices/delete-blob), [Put Blob](/rest/api/storageservices/put-blob)<sup>1</sup>, [Set Blob Metadata](/rest/api/storageservices/set-blob-metadata), [Put Page](/rest/api/storageservices/put-page), [Set Blob Properties](/rest/api/storageservices/set-blob-properties), [Snapshot Blob](/rest/api/storageservices/snapshot-blob), [Incremental Copy Blob](/rest/api/storageservices/incremental-copy-blob), [Append Block](/rest/api/storageservices/append-block)<sup>2</sup>| All blobs in the container are immutable for content and user metadata. | Container deletion fails if a container-level WORM policy is in effect.| Storage account deletion fails if there's a container with at least one blob present.|
41+
| A container is protected by an expired time-based retention policy with container scope and no legal hold is in effect | [Put Blob](/rest/api/storageservices/put-blob)<sup>1</sup>, [Set Blob Metadata](/rest/api/storageservices/set-blob-metadata), [Put Page](/rest/api/storageservices/put-page), [Set Blob Properties](/rest/api/storageservices/set-blob-properties), [Snapshot Blob](/rest/api/storageservices/snapshot-blob), [Incremental Copy Blob](/rest/api/storageservices/incremental-copy-blob), [Append Block](/rest/api/storageservices/append-block)<sup>2</sup> | Delete operations are allowed. Overwrite operations aren't allowed. | Container deletion fails if at least one blob exists in the container, regardless of whether policy is locked or unlocked. | Storage account deletion fails if there is at least one container with a locked time-based retention policy.<br>Unlocked policies don't provide delete protection.|
42+
43+
<sup>1</sup> Azure Storage permits the [Put Blob](/rest/api/storageservices/put-blob) operation to create a new blob. Subsequent overwrite operations on an existing blob path in an immutable container aren't allowed.
44+
45+
<sup>2</sup> The [Append Block](/rest/api/storageservices/append-block) operation is permitted only for policies with the **allowProtectedAppendWrites** or **allowProtectedAppendWrites**All property enabled.
46+
47+
## Allow protected append blobs writes
48+
49+
Append blobs are composed of blocks of data and optimized for data append operations required by auditing and logging scenarios. By design, append blobs only allow the addition of new blocks to the end of the blob. Regardless of immutability, modification or deletion of existing blocks in an append blob is fundamentally not allowed. To learn more about append blobs, see [About Append Blobs](/rest/api/storageservices/understanding-block-blobs--append-blobs--and-page-blobs#about-append-blobs).
50+
51+
The **allowProtectedAppendWrites** property setting allows for writing new blocks to an append blob while maintaining immutability protection and compliance. If this setting is enabled, you can create an append blob directly in the policy-protected container and then continue to add new blocks of data to the end of the append blob with the Append Block operation. Only new blocks can be added; any existing blocks can't be modified or deleted. Enabling this setting doesn't affect the immutability behavior of block blobs or page blobs.
52+
53+
The **AllowProtectedAppendWritesAll** property setting provides the same permissions as the **allowProtectedAppendWrites** property and adds the ability to write new blocks to a block blob. The Blob Storage API doesn't provide a way for applications to do this directly. However, applications can accomplish this by using append and flush methods that are available in the Data Lake Storage Gen2 API. Also, this property enables Microsoft applications such as Azure Data Factory to append blocks of data by using internal APIs. If your workloads depend on any of these tools, then you can use this property to avoid errors that can appear when those tools attempt to append data to blobs.
54+
55+
Append blobs remain in the immutable state during the effective retention period. Since new data can be appended beyond the initial creation of the append blob, there's a slight difference in how the retention period is determined. The effective retention is the difference between append blob's last modification time and the user-specified retention interval. Similarly, when the retention interval is extended, immutable storage uses the most recent value of the user-specified retention interval to calculate the effective retention period.
56+
57+
For example, suppose that a user creates a time-based retention policy with the **allowProtectedAppendWrites** property enabled and a retention interval of 90 days. An append blob, logblob1, is created in the container today, new logs continue to be added to the append blob for the next 10 days, so that the effective retention period for logblob1 is 100 days from today (the time of its last append + 90 days).
58+
59+
Unlocked time-based retention policies allow the **allowProtectedAppendWrites** and the **AllowProtectedAppendWritesAll** property settings to be enabled and disabled at any time. Once the time-based retention policy is locked, the **allowProtectedAppendWrites** and the **AllowProtectedAppendWritesAll** property settings can't be changed.
60+
61+
## Limits
62+
63+
- For a storage account, the maximum number of containers with an immutable policy (time-based retention or legal hold) is 10,000.
64+
65+
- For a container, the maximum number of legal hold tags at any one time is 10.
66+
67+
- The minimum length of a legal hold tag is three alphanumeric characters. The maximum length is 23 alphanumeric characters.
68+
69+
- For a container, a maximum of 10 legal hold policy audit logs are retained for the policy's duration.
70+
71+
## Next steps
72+
73+
- [Data protection overview](data-protection-overview.md)
74+
- [Store business-critical blob data with immutable storage](immutable-storage-overview.md)
75+
- [Version-level WORM policies](immutable-version-level-worm-policies.md)
76+
- [Configure immutability policies for blob versions](immutable-policy-configure-version-scope.md)
77+
- [Configure immutability policies for containers](immutable-policy-configure-container-scope.md)

0 commit comments

Comments
 (0)