Upgrading storage accounts to v2: the basics
Why does a general-purpose v1 account quietly cost you more than it should?
Azure Storage has shipped three account generations, and the oldest one is still running in plenty of estates. A general-purpose v1 account, the original kind, reports its 'kind' property as 'Storage'. General-purpose v2, the current default, reports 'StorageV2'. They look identical in the portal and serve the same blobs, files, tables and queues, but they price differently and, more importantly, v1 is missing the features that let you optimise what you store. A v1 account cannot use access tiers, so every byte sits at one flat rate whether it is read every minute or never touched again. It cannot use lifecycle management to move cold data down automatically or delete it on a schedule. And it cannot be covered by reserved capacity, the commitment discount that knocks a large slice off the per-gigabyte price.
The Cost Optimization workbook surfaces this directly. Its Storage tab runs a query titled 'Storage accounts which are not v2' that lists every account whose kind is still 'Storage' (or the legacy 'BlobStorage' kind). Each one is an account that is locked out of the three biggest levers for reducing storage spend at once. The workbook is not flagging a misconfiguration that breaks anything; it is flagging money left on the table, because the account is paying v2-or-higher capacity rates with none of v2's ways to bring that bill down.
Most v1 accounts are simply old. They were created years ago, before v2 became the default, and nobody had a reason to touch them. The upgrade closes that gap. It is a one-way change of the account kind, it is free, it carries no downtime and no risk of data loss, and once it lands the account can immediately adopt access tiers, lifecycle rules and reserved-capacity coverage. There is also a deadline now attached to the inertia: Microsoft will retire general-purpose v1 accounts on 13 October 2026, so an account left on v1 is not only paying more than it needs to, it is on a clock.
In this lesson you will learn how Azure Storage distinguishes a general-purpose v1 account from a v2 one, how to find every v1 account left in a subscription, why staying on v1 quietly costs more, and how to upgrade safely with a single command or a Bicep change. You will also learn the one workload profile to check before upgrading in bulk, and the retirement deadline that makes this non-optional.
The account kind that never changes by itself
When Microsoft made general-purpose v2 the default account kind, it did not retroactively upgrade the v1 accounts already out there. The kind is a property you set once at creation, and an account keeps it for life unless someone explicitly changes it. That is why a subscription opened years ago can still be quietly running v1 accounts today: they were created correctly for their time, the default moved on, and nothing ever prompted a change. The upgrade is one-way on purpose, you cannot downgrade a v2 account back to v1, which is exactly why the workbook surfaces the laggards rather than leaving you to find them.
Finding the v1 accounts hiding in a subscription
Priya runs the platform team at a company that has been on Azure for six years. The Cost Optimization workbook's Storage tab shows the 'Storage accounts which are not v2' query returning a handful of accounts she does not recognise from any recent project.
Before scheduling any change, she lists every account whose kind is still the legacy 'Storage' value, so she can see which ones are real, what they hold and whether any are transaction-heavy enough to model before a bulk upgrade.
List every account still on the legacy v1 kind. A 'kind' of 'Storage' is general-purpose v1; 'StorageV2' is the current generation.
A v1 account reports no access tier because the feature does not exist on v1. archivelogs2019 is the clearest win: old log data paying the flat v1 rate that could drop to cool or archive the moment it is v2.
How the workbook decides an account is not v2deep dive
The check is a single property: the account 'kind'. A general-purpose v1 account reports 'kind' as 'Storage', a v2 account reports 'StorageV2', and the older blob-only kind reports 'BlobStorage'. The Cost Optimization workbook's 'Storage accounts which are not v2' query is essentially a filter for any account whose kind is not 'StorageV2', because only v2 (and the specialised premium kinds) can use the full set of cost levers. There is nothing subtle to interpret: the property is either current or it is not.
What sits behind that one property is the feature gap. Access tiers, hot, cool, cold and archive, are a v2 capability, so a v1 account has no access tier at all and every blob is billed at the single v1 rate regardless of how often it is touched. Lifecycle management policies, which tier or delete data automatically by age, only apply to v2 accounts. Reserved capacity, the commitment discount on stored gigabytes, is offered for v2 standard accounts. Each of these is a real saving that the v1 kind structurally cannot access, which is why the workbook treats the kind itself as the cost signal.
The upgrade flips 'kind' from 'Storage' to 'StorageV2' in place. It is a control-plane change to the account, not a data copy, so it is near-instant and the data never moves. It is also one-way: there is no path back to v1, which is deliberate, because v1 is the generation being retired. After the change the account behaves as a normal v2 account and the cost levers become available immediately; the workbook stops listing it on its next refresh.
What is the impact of leaving accounts on v1?
The direct impact is a higher standing bill than the same data would cost on v2. General-purpose v2 delivers the lowest per-gigabyte capacity prices in Azure Storage, so a capacity-heavy v1 account is paying more for the same stored bytes. On top of that base difference, the account is locked out of access tiers, so data that is never read still pays the hot rate instead of dropping to cool, cold or archive, and locked out of reserved capacity, so a predictable, long-lived store cannot take the commitment discount. For an estate with old logs, backups and archives on v1, these add up to a recurring overpayment month after month.
The second-order impact is opportunity cost on every other optimisation. Lifecycle management, the policy engine that automatically tiers cold data and deletes expired data, does not run on v1 accounts. So a v1 account is not just expensive today, it is excluded from the automation that keeps storage cheap over time. Every clean-up has to be manual, which means in practice it mostly does not happen, and the account silently accumulates cold data at the full rate.
Finally there is the deadline. Microsoft will retire general-purpose v1 accounts on 13 October 2026, with new v1 account creation blocked earlier. An account left on v1 is therefore not a stable steady state: it is a forced migration waiting to happen. Doing the upgrade now, while it is a free and unhurried savings exercise, is strictly better than doing it later under a retirement clock, when it becomes mandatory work with no savings framing left to claim.
How do you upgrade v1 accounts to v2 safely?
Treat this as one sweep rather than a per-account chore. The order matters: find the v1 accounts, set aside the one transaction-heavy profile to model first, then upgrade the rest and actually use the levers the upgrade unlocks.
1. Inventory every v1 account
List every account whose kind is still 'Storage' (and the legacy 'BlobStorage' kind, which is also pre-v2). Pull the stored capacity and the transaction count alongside each one, because those two numbers tell you both the size of the saving and whether the account is the rare transaction-heavy exception.
2. Set aside the transaction-heavy outliers
Most accounts are capacity-dominated and upgrade to a clear saving. The exception is an account that stores little but performs a very high volume of operations, where v2's slightly higher per-transaction price could outweigh the capacity saving. Model those few before upgrading; greenlight the rest.
3. Upgrade the kind, then choose a default tier
Run the upgrade, which flips kind from 'Storage' to 'StorageV2' in place with no downtime and no data movement. If you do not specify a default access tier the account upgrades to Hot, so set Cool explicitly on accounts whose data is mostly cold to capture the saving from the first day.
4. Use the levers the upgrade unlocks
The upgrade only removes the block; the saving comes from what you do next. Add lifecycle management rules to tier cold data down and delete expired data automatically, and buy reserved capacity for the large, predictable stores. For new accounts, set kind to StorageV2 in your Bicep so no fresh v1 account is ever created again.
# Upgrade every general-purpose v1 account to v2. Free, no downtime, one-way.
# Default to Cool here for cold-data stores; use --access-tier=Hot for hot workloads.
for row in $(az storage account list \
--query "[?kind=='Storage'].{n:name, g:resourceGroup}" -o tsv); do
name=$(echo "$row" | cut -f1)
rg=$(echo "$row" | cut -f2)
az storage account update \
--name "$name" --resource-group "$rg" \
--set kind=StorageV2 \
--access-tier=Cool
echo "$name: upgraded to general-purpose v2 (default tier Cool)"
done
# For new accounts, pin kind to v2 in Bicep so no fresh v1 account is ever created:
#
# resource sa 'Microsoft.Storage/storageAccounts@2023-05-01' = {
# name: storageAccountName
# location: location
# kind: 'StorageV2'
# sku: { name: 'Standard_LRS' }
# properties: {
# accessTier: 'Cool'
# }
# } Quick quiz
Question 1 of 5The Cost Optimization workbook lists several accounts under 'Storage accounts which are not v2'. What does that query actually filter on?
You scored
0 / 5
Keep learning
Go deeper on the account kinds, the upgrade itself, and the cost levers that v2 unlocks.
- Upgrade to a general-purpose v2 storage account The official upgrade walkthrough for portal, PowerShell and CLI, confirming it is free, one-way and without downtime.
- General-purpose v1 storage account retirement overview The retirement timeline and what happens to accounts left on v1 after the deadline.
- Configure a lifecycle management policy How to tier cold data down and delete expired data automatically once an account is on v2.
You can now treat legacy storage accounts as one capability rather than untouchable old infrastructure: find every account still on the v1 kind, set aside the rare transaction-heavy outlier to model first, upgrade the rest in place for free, and then actually use the access tiers, lifecycle rules and reserved capacity the upgrade unlocks. Pin the kind to v2 in your templates so no new v1 account is ever created, and you have cleared the estate well ahead of the 13 October 2026 retirement deadline.
Back to the library