CloudBrum
CloudBrum · Cloud decision-support platform
Azure Storage

Azure Blob StorageLast reviewedReading time~12 minLevelBeginner to advanced

Microsoft Azure · Storage · Object storage

Object storage that lives inside a storage account. You create the account once, choose how many copies Azure keeps and where, then drop blobs into containers. Hot, Cool, Cold and Archive tiers trade storage price against read price. Sign people in with Entra ID where you can, and treat account keys like a master password.

On this page (17 sections)

    Mind map: Azure Blob Storage at a glance

    Azure Blob Storage mind map Azure Blob Storage at a glance: Structure: Storage account, Container, Block, append, page; Access tiers: Hot and Cool, Cold, Archive (offline); Redundancy: LRS and ZRS, GRS and GZRS, Read-access options; Access control: Entra ID and RBAC, SAS and user delegation, Keys, anonymous off; Data protection: Soft delete, Versioning, Immutable storage; Lifecycle: Tier by age, Delete by age, Rehydrate from Archive; Networking: Firewall rules, Private endpoint, Service endpoint; Pricing: Capacity by tier, Operations, Retrieval and transfer. Azure Blob Storage at a glance Blobs, tiers and protection on Azure: the main building blocks and decisions CloudBrum Cloud decision-support platform CloudBrum Storage account Container Block, append, page Structure Hot and Cool Cold Archive (offline) Access tiers LRS and ZRS GRS and GZRS Read-access options Redundancy Entra ID and RBAC SAS and user delegation Keys, anonymous off Access control Soft delete Versioning Immutable storage Data protection Tier by age Delete by age Rehydrate from Archive Lifecycle Firewall rules Private endpoint Service endpoint Networking Capacity by tier Operations Retrieval and transfer Pricing Blob Storage17-point analysis CloudBrum· 17-point cloud service analysis cloudbrum.com
    CloudBrum Blob Storage at a glance · 17-point analysis Structure Storage account Container Block, append, page Access tiers Hot and Cool Cold Archive (offline) Redundancy LRS and ZRS GRS and GZRS Read-access options Access control Entra ID and RBAC SAS and user delegation Keys, anonymous off Data protection Soft delete Versioning Immutable storage Lifecycle Tier by age Delete by age Rehydrate from Archive Networking Firewall rules Private endpoint Service endpoint Pricing Capacity by tier Operations Retrieval and transfer CloudBrum · cloudbrum.com

    Free to share. The downloaded image includes the CloudBrum link.

    Key features (summary)

    • Three kinds of blobBlock blobs hold files and are what you’ll use most. Append blobs suit logs that only grow. Page blobs back virtual machine disks. A block blob can reach about 190.7 TiB.
    • Four access tiersHot for active data, Cool for data you touch now and then, Cold for rarer access, and Archive for data you almost never read. Cool, Cold and Archive have minimum storage periods.
    • You choose the redundancyLocally redundant (three copies in one data centre), zone-redundant, geo-redundant, or geo-zone-redundant, with read access to the second Region as an option.
    • Sign in with Entra IDGive people and apps a role such as Storage Blob Data Reader instead of a shared key. Time-limited SAS links are available when someone outside your tenant needs a file.
    • Ways to undo a mistakeSoft delete keeps deleted blobs and containers for a set time, versioning keeps older copies, and point-in-time restore can roll block blobs back.
    • Immutable storageTime-based retention and legal holds make blobs write-once-read-many, for records that must not be changed or deleted.
    • Lifecycle managementA policy can move blobs to cooler tiers as they age, delete them, and clean up old versions and snapshots on a schedule.
    • Data lake and file protocolsTurn on a hierarchical namespace to get Azure Data Lake Storage Gen2, with real folders and POSIX-style permissions. SFTP and NFS access are available on suitable accounts.

    Basic concepts

    Storage account
    The top-level resource that holds your data and sets its redundancy, networking and encryption. Its name is unique across Azure.
    Container
    A group of blobs inside a storage account, a bit like a bucket. Access control and policies often apply at this level.
    Blob
    One stored object: the data, its name and its metadata. Names can contain slashes, which the portal shows as folders.
    Block blob
    The standard blob type, built from blocks that upload in parallel. Up to 50,000 blocks of up to 4,000 MiB each.
    Append blob
    A blob you can only add to at the end, so it fits log files.
    Page blob
    A blob made of 512-byte pages for random reads and writes, used mostly for virtual machine disks.
    Access tier
    Hot, Cool, Cold or Archive. It sets the price of storing the blob and of reading it, and the tier can be changed per blob.
    Redundancy
    How many copies Azure holds and where: LRS, ZRS, GRS, GZRS, and the read-access versions of the geo options.
    Soft delete
    A deleted blob or container is kept, hidden, for a retention period so you can restore it.
    Blob versioning
    Each change to a blob keeps the earlier state as a version you can read or promote.
    Immutable storage
    WORM protection with a retention period or a legal hold, applied to a container or to individual versions.
    Shared access signature (SAS)
    A signed link or token that grants limited access to blobs for a limited time. A user delegation SAS is signed with Entra ID credentials and is the safer kind.
    Hierarchical namespace
    An option that makes folders real and renames fast, and turns the account into Azure Data Lake Storage Gen2. It has to be chosen when the account is created or upgraded.
    Lifecycle management policy
    Rules on the storage account that move or delete blobs based on age or last access.

    How to create & configure it

    Create a storage account and a container in the Azure portal

    1. Start a storage accountSearch for Storage accounts, choose Create, then pick the subscription and resource group. Choose a region near your users or your compute.
    2. Name it and set the basicsThe name is 3 to 24 characters, lower-case letters and numbers only, and unique across Azure. Choose Standard performance unless you know you need Premium block blobs.
    3. Choose redundancyLocally redundant is cheapest. Zone-redundant protects against the loss of a data centre. Geo-redundant options add a copy in a paired region. Match the choice to how much you’d mind losing a day of data.
    4. Close the doorsOn the advanced settings, keep Require secure transfer on, set the minimum TLS version to 1.2, and turn off anonymous access. Disable shared key access if your applications can use Entra ID.
    5. Set the default tierHot suits most new data, and Cool suits backups and older files. You can still change individual blobs afterwards.
    6. Limit the networkUnder Networking use selected networks or a private endpoint if the data shouldn’t be reachable from the whole internet.
    7. Turn on data protectionEnable soft delete for blobs and containers, and versioning. They cost a little for the extra copies and rescue you from the usual mistakes.
    8. Create a container and uploadOpen the account, choose Containers, add a private container, and upload a test file. Assign yourself or an app the Storage Blob Data Contributor role first, otherwise the portal may deny you.
    9. Add a lifecycle rule and a budgetUnder Lifecycle management move blobs to Cool after the number of days that matches your reads, and set a cost alert on the resource group.

    Tip: after one manual run-through, move the account into code (Bicep, ARM templates or Terraform, see the code references) so each environment starts with the safe settings and changes get reviewed.

    Common issues after configuration

    SymptomLikely causeWhat to check / fix
    403 AuthorizationPermissionMismatchThe signed-in identity has no data-plane roleBeing Owner on the subscription isn’t enough for blob data. Assign Storage Blob Data Reader or Contributor on the account or container, and give it a few minutes to take effect.
    403 AuthorizationFailure or a firewall messageThe caller isn’t on an allowed networkCheck the account’s networking: selected networks, IP rules and private endpoints. Add the client’s address or call from inside the allowed network.
    KeyBasedAuthenticationNotPermittedShared key access is turned offThat’s the safer setting. Switch the client to Entra ID (DefaultAzureCredential) or a user delegation SAS instead of an account key or connection string.
    AuthenticationFailed with a SAS URLExpired token, clock skew, wrong permissions or a changed keyCheck the start and expiry times, give a few minutes of clock tolerance, and make sure the SAS grants the operation you’re attempting.
    PublicAccessNotPermittedAnonymous access is disabledGood. If you really want public files, serve them through a CDN or a website setup, or use SAS links, instead of re-enabling anonymous access.
    BlobArchived or This operation is not permitted on an archived blobArchive blobs are offlineRehydrate the blob to Hot, Cool or Cold, either by changing its tier or by copying it. It takes hours, so plan restores ahead.
    ServerBusy or OperationTimedOut (503, 500)A partition or the account is being throttledRetry with exponential backoff, spread names across prefixes and keep any one blob below its request target.
    ContainerNotFound or BlobNotFoundWrong account, container or nameNames are case sensitive for blobs, and container names must be lower case. Check you’re using the right storage account endpoint.
    LeaseIdMissing or a lease conflictThe blob or container is leased by another processPass the lease ID in the request, or break the lease if the owner is gone.
    Upload fails above a certain sizeToo many blocksA block blob takes at most 50,000 blocks, so with 4 MiB blocks the ceiling is about 195 GiB. Use bigger blocks, and let the SDK pick the size for large files.
    Deleted data still shows on the billSoft delete and versions are retained and billedThat’s by design. Reduce the retention if you can live with it, and let lifecycle rules delete versions you don’t need.
    Browser blocks the requestCORS isn’t configured for the blob serviceAdd a CORS rule on the Blob service with your origin, methods and headers. Avoid * for anything except public assets.

    Use cases: when and where to use it

    Good fit

    • Pictures, video and documents that users upload
    • Backups and archives you keep for years
    • A data lake for analytics, with Data Lake Storage Gen2 on top
    • Logs and telemetry from applications and devices
    • Static websites, served from a container behind a CDN
    • Files arriving from partners, scanners and line-of-business systems

    Consider something else

    • A shared file system for servers → Azure Files or Azure NetApp Files
    • A disk for one virtual machine → Azure managed disks
    • Messages between services → Service Bus, Event Hubs or Azure Queue Storage
    • Tables of rows you query by key → Azure Cosmos DB or Azure Table Storage
    • The same job on other clouds → compare Amazon S3 and Cloud Storage

    Pros: why consider it?

    Why teams choose it

    • Choose your own redundancy, from one data centre to two regions
    • Four tiers, including an archive tier that’s very cheap to hold
    • Entra ID and RBAC fit neatly with the rest of Azure
    • Soft delete, versioning and immutable storage cover most mistakes and compliance needs
    • One account can serve blobs, files, queues and tables
    • Data Lake Storage Gen2 gives real folders for analytics

    Trade-offs to weigh

    • Account settings, tiers and redundancy are different things, and it takes a while to keep them straight
    • Archive blobs are offline, so a restore takes hours
    • The data-plane roles confuse people who are Owner and still get a 403
    • Early deletion charges apply to Cool, Cold and Archive
    • A hierarchical namespace has to be planned up front, and some features aren’t available with it
    • Leaving Azure means copying data out, and egress is billed

    Common threats, vulnerabilities & risks

    RiskSeverityWhy it mattersMitigation
    Anonymous (public) access left onHighA container with public read access exposes every blob in it to the internet.Disable anonymous access at the account level and audit for exceptions with Azure Policy.
    Account keys in code or configHighA leaked key gives full control of the whole account, and it doesn’t expire by itself.Disable shared key access and use Entra ID with managed identities. Store any key you must keep in Key Vault.
    Over-long or over-broad SAS tokensHighA SAS can’t be revoked individually unless it’s tied to a stored access policy or a delegation key.Prefer user delegation SAS, keep expiry to minutes or hours, and grant the minimum permissions.
    No protection against deletionMediumOne bad script or one stolen credential can wipe data for good.Turn on soft delete and versioning, add resource locks, and use immutable storage for records.
    Open network accessMediumBy default the endpoint is reachable from the internet, protected only by authentication.Use the storage firewall and private endpoints for sensitive accounts.
    Weak encryption choicesMediumEverything is encrypted at rest, but some data needs its own key and an audit of key use.Use customer-managed keys in Key Vault where policy demands it, and require secure transfer with TLS 1.2 or later.
    Roles that grant too muchMediumContributor on the account lets someone read the keys and so reach all the data.Separate management roles from data roles, and use the narrowest data role.
    Runaway costs from tiers and retrievalLow–MedPulling data out of Cool, Cold or Archive, or deleting early, adds charges.Understand the minimum periods, and test lifecycle rules on a small dataset first.
    No loggingLow–MedYou can’t investigate access without resource logs.Send storage diagnostic logs to Log Analytics and alert on unusual deletions and failed authentications.

    Performance optimisation

    • Upload in parallel. The SDKs and AzCopy split large files into blocks and send them together, so raise the concurrency for big transfers.
    • A single blob has a request-rate target, so spread very hot objects over several names rather than hammering one.
    • Keep the account in the same region as the compute that uses it. Cross-region reads are slower and cost more.
    • Use a CDN, such as Azure Front Door or Azure CDN, in front of content many people download.
    • Premium block blob accounts give low, steady latency for workloads with many small operations, at a higher storage price.
    • Avoid millions of tiny blobs where you can. Batch them into larger files for analytics, and use a hierarchical namespace when you rename or list folders heavily.
    • Use private endpoints in the same virtual network as the workload, so traffic stays on Microsoft’s own network.
    • Retry with exponential backoff on 500 and 503 responses; the SDKs have retry policies you can tune.

    Reduce monthly cost

    FinOps is the habit of managing cloud spend together with engineering. These are the FinOps checks that matter most for Azure Blob Storage.

    • Match the tier to real access. Look at access patterns before moving data, because reading from Cool, Cold or Archive costs more than from Hot.
    • Write lifecycle rules: tier by age or last access, delete old versions and snapshots, and remove expired data.
    • Remember the minimum periods: 30 days for Cool, 90 for Cold and 180 for Archive. Early deletion or a tier change is billed for the rest of the period.
    • Choose redundancy with intent. ZRS and geo options cost more than LRS, so use them where the data justifies it, and not everywhere.
    • Watch operations. Many small reads and writes, and listing huge containers, add up faster than the capacity charge.
    • Keep data and compute in one region, and use private networking, to avoid transfer charges.
    • Soft-deleted data and old versions are billed like live data, so trim how long they stay.
    • Delete test accounts, old snapshots and orphaned containers.
    • Consider reservations for capacity you know you’ll hold for one or three years.
    • Tag storage accounts by team and product, and set a budget alert on the resource group.

    Read the prices and free-account terms in this guide as examples. They differ by region and move over time, so look up current figures first (see Pricing).

    Security optimisation

    • Disable anonymous access at the account level.
    • Use Entra ID and managed identities for applications, with the narrowest data role (for example Storage Blob Data Reader).
    • Turn off shared key access once your clients can use Entra ID, and rotate keys if you must keep them.
    • Prefer user delegation SAS over account SAS, keep it short-lived, and scope it to one container or blob.
    • Require secure transfer and a minimum TLS 1.2.
    • Use the storage firewall and private endpoints so the account isn’t open to the whole internet.
    • Encrypt with customer-managed keys in Key Vault where policy requires them, and consider infrastructure encryption for extra assurance.
    • Enable soft delete, versioning and, for records, immutable storage. Add a resource lock on important accounts.
    • Send diagnostic logs to Log Analytics and alert on deletes, failed authentications and changes to account settings.
    • Use Microsoft Defender for Storage to detect unusual access and malware uploads.

    Governance & compliance

    Guardrails

    • A tagging policy for storage accounts that covers owner, environment and data class
    • Azure Policy that denies anonymous access, requires TLS 1.2 and secure transfer, and audits shared key access
    • A shared Bicep or Terraform module for storage accounts with the safe defaults built in
    • A data classification that decides which accounts need private endpoints, customer-managed keys or immutable storage

    Continuous checks (Azure Policy and Defender for Cloud)

    • “Storage accounts should prevent shared key access”
    • “Storage account public access should be disallowed”
    • “Secure transfer to storage accounts should be enabled”
    • “Storage accounts should restrict network access”
    • “Storage accounts should have infrastructure encryption” where required

    Use the Activity log and storage resource logs to see who changed an account or read a blob, Azure Policy to enforce settings, Microsoft Defender for Cloud for recommendations and alerts, and the Service Trust Portal for compliance reports. Azure Storage is in scope for many assurance programmes, but responsibility is shared: Microsoft runs the service, and you own the identities, network rules, encryption choices and data.

    Reduce carbon footprint

    • Delete data nobody needs. Every byte you keep sits on powered hardware, and removing it is the cheapest saving.
    • Compress files and pick compact formats, which leaves less to hold, move and process.
    • Use lifecycle rules so cold data moves to cooler tiers, and choose LRS when the data truly doesn’t need extra copies.
    • A CDN in front of busy content means the storage account serves each file once and the edge does the rest.
    • Place accounts in the region of the compute that reads them, which also trims long-distance transfer.
    • Pick a region on a lower-carbon grid for large archives that have no latency needs.
    • The Microsoft Emissions Impact Dashboard reports estimated emissions for your Azure usage. Find out how it treats storage before quoting a figure.

    Pricing

    Purchase options

    Capacity Per GB-month

    You pay per gigabyte stored, at a rate that depends on the tier (Hot is dearest, Archive cheapest), the redundancy level and the region.

    Operations Per 10,000

    Reads, writes, lists and other calls are billed per ten thousand, with higher rates for writes and for the cooler tiers.

    Retrieval and early deletion Cool, Cold, Archive

    Reading data from cooler tiers costs per GB, and removing or moving it before the minimum period costs the remaining days.

    Transfer and replication Out and between regions

    Data leaving Azure is billed after a monthly allowance, and geo-redundant options bill for copying data to the second region.

    What you actually pay for

    • Capacity, by tier, redundancy and region
    • Operations, per ten thousand
    • Data retrieval for Cool, Cold and Archive, and early-deletion charges
    • Outbound data transfer, and geo-replication data transfer
    • Features: premium performance, hierarchical namespace transactions, point-in-time restore, Defender for Storage and others

    Prices vary by region and over time. Check the official Azure Blob Storage pricing page and the Azure Pricing Calculator for current figures, and read the Azure free account page for what a new account includes.

    Important code references

    A private storage account for user uploads, set up as you’d want it in production: no anonymous access, no account keys, TLS 1.2, versioning, soft delete and a lifecycle rule. The CLI and Terraform tabs create it. The Python and C# tabs upload an invoice and return a read-only link that lapses after 15 minutes, signed with Entra ID instead of a key. Use your own account name, region and blob names.

    # The account name must be 3-24 lower-case letters and numbers, unique across Azure
    RG=rg-uploads
    ACCOUNT=acmeuploads123456
    LOCATION=centralindia
    
    az group create --name $RG --location $LOCATION
    
    # Zone-redundant, no anonymous access, no account keys, TLS 1.2 or later
    az storage account create --name $ACCOUNT --resource-group $RG --location $LOCATION \
      --sku Standard_ZRS --kind StorageV2 --access-tier Hot \
      --min-tls-version TLS1_2 --https-only true \
      --allow-blob-public-access false --allow-shared-key-access false
    
    # Let yourself use the data plane (keys are off, so the role is what lets you in; it can take a few minutes)
    ACCOUNT_ID=$(az storage account show --name $ACCOUNT --resource-group $RG --query id --output tsv)
    ME=$(az ad signed-in-user show --query id --output tsv)
    az role assignment create --assignee $ME --role "Storage Blob Data Contributor" --scope $ACCOUNT_ID
    
    # Keep older versions, and deleted blobs and containers for 14 days
    az storage account blob-service-properties update --account-name $ACCOUNT --resource-group $RG \
      --enable-versioning true \
      --enable-delete-retention true --delete-retention-days 14 \
      --enable-container-delete-retention true --container-delete-retention-days 14
    
    az storage container create --account-name $ACCOUNT --name uploads --auth-mode login
    
    # Cool after 30 days, old versions removed after 90
    cat > policy.json <<'JSON'
    {
      "rules": [{
        "name": "age-out",
        "enabled": true,
        "type": "Lifecycle",
        "definition": {
          "filters": {"blobTypes": ["blockBlob"]},
          "actions": {
            "baseBlob": {"tierToCool": {"daysAfterModificationGreaterThan": 30}},
            "version": {"delete": {"daysAfterCreationGreaterThan": 90}}
          }
        }
      }]
    }
    JSON
    az storage account management-policy create --account-name $ACCOUNT --resource-group $RG --policy @policy.json
    
    # Upload, then make a read-only link that works for 15 minutes (signed with Entra ID, not a key)
    az storage blob upload --account-name $ACCOUNT --container-name uploads \
      --name invoices/2026/10/invoice-1042.pdf --file ./invoice-1042.pdf --auth-mode login
    
    az storage blob generate-sas --account-name $ACCOUNT --container-name uploads \
      --name invoices/2026/10/invoice-1042.pdf --permissions r \
      --expiry $(date -u -d "+15 minutes" "+%Y-%m-%dT%H:%MZ") \
      --auth-mode login --as-user --full-uri
    # Assumes var.location and var.account_name (3-24 lower-case letters and numbers).
    # With shared keys off, set storage_use_azuread = true in the azurerm provider block so Terraform signs in with Entra ID.
    resource "azurerm_resource_group" "uploads" {
      name     = "rg-uploads"
      location = var.location
    }
    
    resource "azurerm_storage_account" "uploads" {
      name                     = var.account_name
      resource_group_name      = azurerm_resource_group.uploads.name
      location                 = azurerm_resource_group.uploads.location
      account_kind             = "StorageV2"
      account_tier             = "Standard"
      account_replication_type = "ZRS"
      access_tier              = "Hot"
    
      min_tls_version                 = "TLS1_2"
      https_traffic_only_enabled      = true
      allow_nested_items_to_be_public = false  # no anonymous access
      shared_access_key_enabled       = false  # Entra ID only
    
      blob_properties {
        versioning_enabled = true
    
        delete_retention_policy {
          days = 14
        }
        container_delete_retention_policy {
          days = 14
        }
      }
    }
    
    resource "azurerm_storage_container" "uploads" {
      name                  = "uploads"
      storage_account_id    = azurerm_storage_account.uploads.id
      container_access_type = "private"
    }
    
    resource "azurerm_storage_management_policy" "uploads" {
      storage_account_id = azurerm_storage_account.uploads.id
    
      rule {
        name    = "age-out"
        enabled = true
    
        filters {
          blob_types = ["blockBlob"]
        }
    
        actions {
          base_blob {
            tier_to_cool_after_days_since_modification_greater_than = 30
          }
          version {
            delete_after_days_since_creation = 90
          }
        }
      }
    }
    # pip install azure-storage-blob azure-identity
    from datetime import datetime, timedelta, timezone
    
    from azure.identity import DefaultAzureCredential
    from azure.storage.blob import BlobSasPermissions, BlobServiceClient, ContentSettings, generate_blob_sas
    
    ACCOUNT = "acmeuploads123456"
    CONTAINER = "uploads"
    
    # DefaultAzureCredential finds a managed identity in Azure, or your own login (az login) on a laptop
    service = BlobServiceClient(f"https://{ACCOUNT}.blob.core.windows.net", credential=DefaultAzureCredential())
    container = service.get_container_client(CONTAINER)
    
    
    def upload_invoice(path, name):
        """Upload one file. The SDK splits large files into blocks and sends them in parallel."""
        with open(path, "rb") as data:
            container.upload_blob(
                name,
                data,
                overwrite=True,
                content_settings=ContentSettings(content_type="application/pdf"),
                metadata={"origin": "billing-service"},
            )
    
    
    def download_link(name, minutes=15):
        """A read-only link signed with a user delegation key, so no account key is involved."""
        now = datetime.now(timezone.utc)
        expiry = now + timedelta(minutes=minutes)
        key = service.get_user_delegation_key(now, expiry)
        token = generate_blob_sas(
            account_name=ACCOUNT,
            container_name=CONTAINER,
            blob_name=name,
            user_delegation_key=key,
            permission=BlobSasPermissions(read=True),
            expiry=expiry,
        )
        return f"https://{ACCOUNT}.blob.core.windows.net/{CONTAINER}/{name}?{token}"
    
    
    def list_prefix(prefix):
        """All blob names under a prefix. The SDK handles paging."""
        return [blob.name for blob in container.list_blobs(name_starts_with=prefix)]
    
    
    if __name__ == "__main__":
        name = "invoices/2026/10/invoice-1042.pdf"
        upload_invoice("invoice-1042.pdf", name)
        print(download_link(name))
        print(list_prefix("invoices/2026/10/"))
    // Program.cs: upload a blob, then print a read-only link signed with Entra ID that lapses in 15 minutes
    // NuGet packages: Azure.Storage.Blobs (a recent version), Azure.Identity
    using Azure.Identity;
    using Azure.Storage.Blobs;
    using Azure.Storage.Blobs.Models;
    using Azure.Storage.Sas;
    
    const string account = "acmeuploads123456";
    const string blobName = "invoices/2026/10/invoice-1042.pdf";
    
    // DefaultAzureCredential finds a managed identity in Azure, or your own login on a laptop
    var service = new BlobServiceClient(new Uri($"https://{account}.blob.core.windows.net"), new DefaultAzureCredential());
    var container = service.GetBlobContainerClient("uploads");
    var blob = container.GetBlobClient(blobName);
    
    // Upload; the SDK sends large files in parallel blocks
    await blob.UploadAsync("invoice-1042.pdf", new BlobUploadOptions
    {
        HttpHeaders = new BlobHttpHeaders { ContentType = "application/pdf" },
        Metadata = new Dictionary<string, string> { ["origin"] = "billing-service" }
    });
    
    // A read-only link signed with a user delegation key, so no account key is involved
    var starts = DateTimeOffset.UtcNow;
    var expires = starts.AddMinutes(15);
    var key = (await service.GetUserDelegationKeyAsync(new BlobGetUserDelegationKeyOptions(expires) { StartsOn = starts })).Value;
    
    var sas = new BlobSasBuilder
    {
        BlobContainerName = container.Name,
        BlobName = blobName,
        Resource = "b",
        StartsOn = starts,
        ExpiresOn = expires
    };
    sas.SetPermissions(BlobSasPermissions.Read);
    
    var link = new BlobUriBuilder(blob.Uri) { Sas = sas.ToSasQueryParameters(key, account) }.ToUri();
    Console.WriteLine(link);
    
    // Walk the blobs under a prefix; the SDK pages for you
    await foreach (var item in container.GetBlobsAsync(BlobTraits.None, BlobStates.None, "invoices/2026/10/", CancellationToken.None))
    {
        Console.WriteLine($"{item.Name}  {item.Properties.ContentLength} bytes");
    }

    Best videos to explore

    Short walkthrough videos for this service are being prepared. They will appear here and load only when you press play. Until then, follow CloudBrum on YouTube for new videos.

    Introduction to Azure Blob StorageVideo coming soon · Beginner
    Hot, Cool, Cold and Archive: choosing a tierVideo coming soon · Intermediate
    Securing a storage account without keysVideo coming soon · Intermediate
    Lifecycle policies and storage cost controlVideo coming soon · Advanced

    Interview questions

    BasicWhat is Azure Blob Storage?

    It’s Microsoft’s object storage for unstructured data such as images, documents, backups and logs. You create a storage account, add containers, and store blobs in them. Data is reached over HTTPS through an SDK, the CLI, AzCopy or a URL, and Azure takes care of the hardware.

    BasicWhat are the three types of blob?

    Block blobs hold files and are used for most things. Append blobs only allow adding to the end, which suits logs. Page blobs store fixed-size pages for random access and mostly back virtual machine disks.

    BasicWhat are the access tiers?

    Hot is for data used often, Cool for data used occasionally and kept at least 30 days, Cold for rarer access and 90 days, and Archive for data you rarely need and keep 180 days. Cooler tiers cost less to store and more to read, and Archive blobs are offline until you rehydrate them.

    IntermediateHow do you give an application access without using the account key?

    Create a managed identity for the application and assign it a data role such as Storage Blob Data Contributor on the account or container. In code, use DefaultAzureCredential. Then turn off shared key access on the account, so keys can’t be used even if one leaks.

    IntermediateWhat is the difference between a service SAS and a user delegation SAS?

    Both are signed tokens with an expiry. A SAS made with the account key is only as safe as that key and can’t easily be revoked. A user delegation SAS is signed with a key obtained through Entra ID, is limited by the permissions of the person or app that requested it, and is the better choice.

    IntermediateHow do you protect against accidental deletion?

    Enable soft delete for blobs and containers, turn on versioning, and consider point-in-time restore for block blobs. Add a resource lock on the storage account against deletion, and use immutable storage for records that must not change.

    AdvancedYour storage bill is rising and nobody has added much data. Where do you look?

    Check the cost analysis by meter first: capacity, operations, retrieval or transfer? Typical causes are soft-deleted data and old versions that were never expired, a job listing a huge container, reads from Cool or Archive tiers that trigger retrieval fees, and geo-redundancy on data that doesn’t need it. Fix with lifecycle rules, caching and a review of redundancy.

    AdvancedHow would you choose between LRS, ZRS, GRS and GZRS?

    Start from what you can afford to lose and how fast you need to recover. LRS survives disk and rack failures only. ZRS survives the loss of a data centre in the region. GRS and GZRS add a copy in a paired region for regional disasters, and the read-access versions let you read from it. Each step costs more, so apply the higher levels to data that justifies it.

    AdvancedHow would you migrate 100 TB from an on-premises file server?

    Use AzCopy over a fast link, or Azure Storage Mover for managed, repeatable transfers. If the network would take too long, order an Azure Data Box. Land the data in the right tier from the start, check integrity with checksums, and plan an incremental sync until the cutover date.

    AdvancedHow do you design a storage account for a regulated records archive?

    Use a dedicated account with a private endpoint, no anonymous access and no shared keys. Enable versioning and apply immutable storage with a time-based retention policy, locked once tested. Add customer-managed keys if required, send logs to a central workspace, replicate to a second region, and test a restore on a schedule.

    Similar or alternative services on other clouds

    CapabilityAWSAzureGoogle Cloud
    ServiceAmazon S3Azure Blob StorageCloud Storage
    What you create firstA bucketA storage account, then a container in itA bucket
    How copies are keptAcross at least three Availability Zones for most classesYou choose LRS, ZRS, GRS or GZRSYou choose a region, dual-region or multi-region location
    Who may readIAM and bucket policiesEntra ID roles, SAS tokens or account keysIAM roles and signed URLs
    Keeping long-lived secrets outRoles for workloads and short presigned URLsDisable shared key access and use managed identitiesService account impersonation instead of downloaded keys
    Real folders and renamesPrefixes only, except in directory bucketsHierarchical namespace (Data Lake Storage Gen2)Hierarchical namespace buckets
    Private network accessGateway VPC endpointPrivate endpoint or service endpointPrivate Google Access with VPC Service Controls
    Bulk copy toolsDataSync, Snowball, the AWS CLIAzCopy, Storage Mover, Data BoxStorage Transfer Service, Transfer Appliance

    Blob Storage is one part of the storage account. Files that need a shared network share belong in Azure Files, disks for virtual machines are managed disks, and if you need queues or tables, the same account can hold those too. For serverless code that reacts to new blobs, see Azure Functions.

    Did you find this article helpful?

    Your answer helps us improve this page for the next reader.

    Sources and further reading

    CloudBrum wrote this page in its own words, using the provider’s public documentation listed below as the reference. Features, limits, names and prices change, so confirm anything that matters on the provider’s own pages before you decide.