Blob lifecycle tiering: the basics
Why is so much storage spend sitting on the wrong access tier?
Azure Blob storage has four access tiers, and the price you pay per gigabyte differs sharply between them. Hot is built for data read and written constantly and carries the highest storage price. Cool is for data accessed roughly monthly, with a lower storage price but higher read costs and a 30-day minimum. Cold is for data touched a few times a year, cheaper still to store, with a 90-day minimum. Archive is an offline tier for data you almost never read, with the lowest storage price of all, a 180-day minimum and a rehydration step measured in hours. The default for a new account is hot, so unless someone changes it, every backup, log, export and old asset keeps paying the top rate forever.
Azure Advisor turns this into a specific cost recommendation, 'Use lifecycle management', and surfaces it in the Cost Optimization workbook on the Storage tab. The point it is making is simple: most of the data in a typical account is written once and read rarely, yet it sits on hot. A lifecycle management policy is a rule-based engine on the account that automatically transitions blobs to a cooler tier as they age or go unread, and deletes them once they pass a retention threshold. You write the rules once and Azure runs them every day.
Almost all of this overspend is drift, not intent. An account created with the hot default, a logging pipeline that never set a tier, an export job that piles up files nobody deletes. The work is to find the accounts where cold data is sitting hot, decide the right tiering and retention for each data type, and let a policy move it automatically, so you are paying hot prices only for the data that is genuinely hot.
In this lesson you will learn how Azure Blob access tiers are priced, how to find the accounts paying hot rates for cold data, and how to write a lifecycle management policy that tiers and expires data automatically without putting frequently read data behind a slow tier. The keep-learning section links the Microsoft references for the policy structure, the access tiers and last-access tracking.
The tier nobody chose
When you create a blob and never set an access tier, Azure puts it on hot, the most expensive tier to store, and there it stays for the life of the object unless something moves it. That default is sensible for active data and quietly wasteful for everything else, which is why a years-old account is often a sediment of logs and exports all paying the top rate. The catch that trips people up runs the other way: cool, cold and archive each have a minimum retention period, 30, 90 and 180 days. Move a blob down too soon, or delete it before the minimum, and Azure bills an early-deletion charge as if it had stayed. The art of a good lifecycle policy is matching the transition days to how the data is actually read, so you bank the storage saving without paying penalties to get there.
Finding hot data that should be cold
Priya runs the platform team at a growing SaaS company. The monthly Azure bill has crept up and the Cost Optimization workbook shows the 'Use lifecycle management' recommendation against several storage accounts, with the storage line dominated by a single logs-and-exports account.
Rather than guess at retention rules, Priya starts by listing the accounts and their default access tier, so she can see which ones are defaulting everything to hot before deciding what a sensible lifecycle policy looks like for each.
Start by listing storage accounts and the default access tier set on each. Accounts defaulting to Hot are where cold data is most likely sitting on the expensive tier.
An account full of write-once logs or exports sitting on Hot is the highest-value target: the storage saving from tiering it down is recurring and the data is rarely read.
How a lifecycle policy decides what to tier and whendeep dive
A lifecycle management policy is a JSON document of rules attached to the account. Each rule has a filter that selects which blobs it applies to, typically 'blobTypes' set to 'blockBlob' and an optional 'prefixMatch' to scope it to a container or path, and a set of actions on the 'baseBlob'. The actions are the transitions: 'tierToCool', 'tierToCold' and 'tierToArchive', each gated by a condition, and 'delete' to expire data. The condition is either 'daysAfterModificationGreaterThan', counting from when the blob was last written, or 'daysAfterLastAccessTimeGreaterThan', counting from when it was last read. Last-access conditions require last-access tracking to be enabled on the account first.
Azure evaluates the policy once per day. After you create or change a policy it can take up to 24 hours for the first run, and large backlogs can take another cycle or two to finish moving, so the saving appears on the bill gradually rather than instantly. This is why you set the rules and then watch the next billing period, rather than expecting the line to drop overnight.
The conditions interact with each tier's minimum retention, and that is where cost discipline lives. Cool has a 30-day minimum, cold 90 and archive 180. If a rule moves a blob to cool and another moves it to archive a week later, or a delete fires before the minimum, Azure charges an early-deletion fee as though the blob had stayed for the full minimum. Last-access tiering with 'enableAutoTierToHotFromCool' set guards the other failure mode: if a blob you tiered down is read again, it is promoted back to hot automatically, so an occasional read does not get stranded paying cool read prices.
What is the impact of leaving everything on the hot tier?
The direct impact is recurring overspend. Every gigabyte of write-once data sitting on hot is billed at the premium storage rate every month, when the same data on cool, cold or archive would cost a fraction of that to store. Because storage only ever accumulates, the gap widens over time: each month adds more cold data to the hot tier and the wasted spend grows with it. This is exactly the pattern Azure Advisor's 'Use lifecycle management' recommendation is built to catch.
The second-order impact is that the saving is left on the table indefinitely. Without a policy, tiering is a manual job nobody does, so even data the team knows is cold keeps paying hot prices. A lifecycle policy converts a one-time decision into an ongoing saving: once the rules are set, every new log, export and backup is tiered automatically as it ages, so the optimisation compounds without further effort.
There is a trade-off to respect, which is why this is not a blanket 'tier everything down' move. The cooler tiers have higher per-read costs and minimum retention periods, so tiering data that turns out to be read often, or moving it down faster than the minimums allow, can cost more than it saves through read charges and early-deletion fees. The impact of getting the policy right is a lower bill with no loss of availability; the impact of getting it wrong is read costs and penalties that erode the saving. The discipline is to match the tiering schedule to how each data type is actually read.
How do you tier blob data down safely?
Work the capability as one loop rather than tiering account by account on instinct. The order matters: classify data by how it is read before you write any rule, so you do not put frequently read data behind a slow, expensive-to-read tier.
1. Inventory accounts and their data profile
List the storage accounts, their default access tier and what each one holds. Separate the write-once, rarely read data, logs, backups, exports and old assets, from the genuinely active data. The Advisor 'Use lifecycle management' recommendation and the Cost Optimization workbook Storage tab point you at the accounts with the most to gain.
2. Decide the tiering schedule per data type
For each rarely read data type, choose transition days that respect the tier minimums: cool after 30 days or more, cold after 90 or more, archive after 180 or more, and a delete action once data passes its retention requirement. Match the days to how the data is read, not to the most aggressive possible discount, so you avoid early-deletion fees and surprise read costs.
3. Handle uncertain read patterns with last-access tiering
Where you are unsure how often data is read, enable last-access tracking and tier on 'daysAfterLastAccessTimeGreaterThan' with auto-rehydration from cool to hot. Data that goes quiet tiers down and saves money; data that is read again is promoted back to hot automatically, so an occasional read does not strand a blob paying cool read prices.
4. Apply the policy and let it run
Attach the lifecycle policy to the account and let Azure run it daily. The backlog tiers down over the first day or two and the saving appears on the next billing period; from then on every new blob is tiered automatically. Codify the policy in Bicep so the same rules apply to every account by default and the saving is enforced rather than remembered.
# 1. (Optional) Enable last-access tracking so you can tier on read time, not just write time.
az storage account blob-service-properties update \
--account-name applogsprod \
--resource-group rg-platform \
--enable-last-access-tracking true
# 2. Define the lifecycle policy. Transition days respect each tier's minimum
# (cool 30, cold 90, archive 180) so no early-deletion fees are incurred.
cat > lifecycle-policy.json <<'JSON'
{
"rules": [
{
"name": "tier-down-write-once-data",
"enabled": true,
"type": "Lifecycle",
"definition": {
"actions": {
"baseBlob": {
"tierToCool": { "daysAfterModificationGreaterThan": 30 },
"tierToCold": { "daysAfterModificationGreaterThan": 90 },
"tierToArchive": { "daysAfterModificationGreaterThan": 180 },
"delete": { "daysAfterModificationGreaterThan": 2555 }
}
},
"filters": {
"blobTypes": [ "blockBlob" ]
}
}
}
]
}
JSON
# 3. Apply the policy to the account. Azure runs it daily; the backlog tiers
# down over the first 24-48 hours and the saving lands on the next bill.
az storage account management-policy create \
--account-name applogsprod \
--resource-group rg-platform \
--policy @lifecycle-policy.json Quick quiz
Question 1 of 5Azure Advisor shows the 'Use lifecycle management' recommendation against several storage accounts. What is the most efficient way to think about it?
You scored
0 / 5
Keep learning
Go deeper on how Azure Blob access tiers are priced and how to express the right tiering and retention rules in a lifecycle policy.
- Optimise costs by automatically managing the data lifecycle How lifecycle management policies transition and expire data automatically to lower storage cost.
- Access tiers for blob data How hot, cool, cold and archive are priced, and the minimum retention period for each.
- Configure a lifecycle management policy The policy JSON structure and how to apply it in the portal, the CLI and Bicep.
You can now treat blob storage cost as one capability rather than a line that only rises: inventory which accounts hold cold data on the hot tier, classify each by how it is read, set lifecycle policies that tier write-once data to cool, cold and archive on a schedule and expire it past retention, and leave the active data on hot. With the policy attached, Azure captures the saving on new data automatically, so the bill tracks how data is used rather than the full history of what was written.
Back to the library