<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[The Microsoft Cloud Practitioner]]></title><description><![CDATA[Practical Azure and Microsoft 365 guides for cloud engineers: architecture, security, automation, cost and governance, checked against Microsoft's documentation]]></description><link>https://umairgulfam.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6ac0f4681cea866067acb497/c8413707-d80b-4ea5-ba07-521fa27971df.png</url><title>The Microsoft Cloud Practitioner</title><link>https://umairgulfam.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 19 Oct 2026 06:42:10 GMT</lastBuildDate><atom:link href="https://umairgulfam.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Migrating SharePoint Documents to Azure: Architecture and Planning Guide]]></title><description><![CDATA[Overview: it is a design project, not a file copy
A SharePoint-to-Azure migration succeeds or fails on decisions made before any script runs. Files transfer easily; metadata, permissions, versions, sh]]></description><link>https://umairgulfam.hashnode.dev/migrating-sharepoint-documents-to-azure-architecture-and-planning-guide</link><guid isPermaLink="true">https://umairgulfam.hashnode.dev/migrating-sharepoint-documents-to-azure-architecture-and-planning-guide</guid><category><![CDATA[Microsoft]]></category><category><![CDATA[Azure]]></category><category><![CDATA[SharePoint]]></category><category><![CDATA[data]]></category><category><![CDATA[migration]]></category><category><![CDATA[Microsoft 365]]></category><category><![CDATA[#microsoft-azure]]></category><dc:creator><![CDATA[umairgulfam]]></dc:creator><pubDate>Wed, 07 Oct 2026 13:43:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac0f4681cea866067acb497/799b7956-8f14-4e55-9b76-8eb68ad522ab.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Overview: it is a design project, not a file copy</h2>
<p>A SharePoint-to-Azure migration succeeds or fails on decisions made before any script runs. Files transfer easily; metadata, permissions, versions, sharing links, workflows and retention controls do not, and each needs an explicit design choice.</p>
<p>Organizations accumulate years of documents in SharePoint Online. Some stays actively collaborative. Some becomes historical, compliance-driven or valuable mainly for analytics. For that second group, Azure Blob Storage or Azure Data Lake Storage Gen2 can be a scalable, lower-cost destination.</p>
<p>This guide gives you a practical reference architecture and a 12-step planning approach, with the Microsoft-documented limits and behaviours that shape each decision.</p>
<h3>Key takeaways</h3>
<ul>
<li><p><strong>Classify before you copy.</strong> Sort content into retain, migrate, archive or dispose.</p>
</li>
<li><p><strong>Check native options first.</strong> Microsoft 365 Archive may meet a cost goal without leaving Microsoft 365.</p>
</li>
<li><p><strong>Match the destination to future use.</strong> Blob for archives, Data Lake Storage Gen2 for analytics, Azure Files for SMB/NFS apps.</p>
</li>
<li><p><strong>Use identity, not secrets.</strong> Microsoft Graph with least-privilege access (for example <code>Sites.Selected</code>) and managed identities.</p>
</li>
<li><p><strong>Respect throttling.</strong> Honour <code>Retry-After</code>, limit concurrency and decorate your traffic.</p>
</li>
<li><p><strong>Prove it moved.</strong> Validate with hashes (SharePoint exposes <code>quickXorHash</code>), not upload success codes.</p>
</li>
<li><p><strong>Plan tiers and lifecycle.</strong> Cool, Cold and Archive carry 30, 90 and 180-day minimum retention periods.</p>
</li>
</ul>
<h2>Step 1: Establish the reason for migrating</h2>
<p>The target architecture follows the business objective, so name the objective first. Common drivers:</p>
<ul>
<li><p>Archiving inactive sites or historical project documents</p>
</li>
<li><p>Reducing premium collaboration-storage consumption</p>
</li>
<li><p>Creating a data lake for analytics, search or AI workloads</p>
</li>
<li><p>Moving application-generated files to a service built for object storage</p>
</li>
<li><p>Consolidating records under central cloud governance</p>
</li>
<li><p>Retiring legacy sites after a merger, reorganization or completed programme</p>
</li>
</ul>
<p>Azure Storage should not automatically replace SharePoint for active collaboration. If users still need co-authoring, approvals, familiar sharing, Microsoft 365 search or SharePoint-native workflows, keep that content in SharePoint, or move it to another SharePoint site.</p>
<blockquote>
<p><strong>Check the native option first.</strong> If the goal is mainly lower storage cost for inactive content, <a href="https://learn.microsoft.com/microsoft-365/archive/archive-overview">Microsoft 365 Archive</a> moves inactive sites to a colder tier inside SharePoint, with the same security and compliance standards applied. Microsoft has also introduced file-level archive; check its current availability and pricing before deciding. Migrate to Azure Storage when you need object storage, analytics or integration, or must leave Microsoft 365.</p>
</blockquote>
<h3>Classify every piece of content</h3>
<p>The first planning deliverable sorts content into four groups:</p>
<table>
<thead>
<tr>
<th>Group</th>
<th>Typical content</th>
<th>Action</th>
</tr>
</thead>
<tbody><tr>
<td>1. Retain</td>
<td>Active collaboration, co-authoring, approvals</td>
<td>Keep in SharePoint, or move to another SharePoint site</td>
</tr>
<tr>
<td>2. Migrate</td>
<td>Operational, analytics or integration use</td>
<td>Move to Azure Blob or Data Lake Storage Gen2</td>
</tr>
<tr>
<td>3. Archive</td>
<td>Long-term retention, infrequent access</td>
<td>Move to Azure cool, cold or archive tiers, or use Microsoft 365 Archive</td>
</tr>
<tr>
<td>4. Dispose</td>
<td>Redundant, obsolete or past retention</td>
<td>Delete after documented approval</td>
</tr>
</tbody></table>
<h2>Step 2: Assess the source environment</h2>
<p>A reliable design starts with an inventory. It is also a controlled opportunity for business owners to decide what moves and what stays.</p>
<table>
<thead>
<tr>
<th>Inventory area</th>
<th>What to capture</th>
</tr>
</thead>
<tbody><tr>
<td>Structure</td>
<td>Site, library and folder names; business and technical owner</td>
</tr>
<tr>
<td>Volume</td>
<td>File count, total size, average and maximum file size</td>
</tr>
<tr>
<td>Naming</td>
<td>File types, path lengths, unsupported or problematic names</td>
</tr>
<tr>
<td>Dates</td>
<td>Created and modified dates; content that changes frequently</td>
</tr>
<tr>
<td>Metadata</td>
<td>Standard and custom columns, content types, taxonomy terms</td>
</tr>
<tr>
<td>Versions</td>
<td>Version counts and version-storage consumption</td>
</tr>
<tr>
<td>Security</td>
<td>Unique and inherited permissions, broken inheritance, external sharing</td>
</tr>
<tr>
<td>Compliance</td>
<td>Sensitivity labels, retention labels, legal holds</td>
</tr>
<tr>
<td>Dependencies</td>
<td>Workflows, apps, Power Automate flows or reports that use the content</td>
</tr>
</tbody></table>
<p>The assessment should also flag unusually large files, duplicates and records needing manual review. These findings drive the schedule, the target data model and the validation effort.</p>
<p><strong>Tip:</strong> for a tenant-wide inventory of sites, groups and files, consider <a href="https://learn.microsoft.com/graph/data-connect-datasets">Microsoft Graph Data Connect</a>. It exports SharePoint and OneDrive metadata datasets to Azure Storage through Azure Synapse or Azure Data Factory. It reports on content; it does not copy file bodies.</p>
<h2>Step 3: Choose the correct Azure destination</h2>
<p>"Move SharePoint to Azure" is too broad to act on. The destination must match how the data will be used.</p>
<table>
<thead>
<tr>
<th>Destination</th>
<th>Best for</th>
<th>Watch out for</th>
</tr>
</thead>
<tbody><tr>
<td>Azure Blob Storage</td>
<td>General document storage, application content, long-term archive</td>
<td>Flat namespace; directories are virtual unless hierarchical namespace is enabled</td>
</tr>
<tr>
<td>Azure Data Lake Storage Gen2</td>
<td>Analytics, AI, large-scale processing, directory-level ACLs</td>
<td>Built on Blob Storage with hierarchical namespace; plan ACLs and RBAC together</td>
</tr>
<tr>
<td>Azure Files</td>
<td>Applications that need SMB or NFS file-share access</td>
<td>Not an archive tier; priced and sized as a file service</td>
</tr>
<tr>
<td>Another SharePoint site or Microsoft 365 Archive</td>
<td>Continued collaboration, versioning, approvals, Microsoft 365 integration</td>
<td>Keeps content inside the Microsoft 365 boundary</td>
</tr>
</tbody></table>
<p>For archive or application-content scenarios, Blob Storage is often enough. Data Lake Storage Gen2 becomes the better choice when downstream services need a hierarchical namespace, analytics-oriented access or directory-level access control.</p>
<h2>Step 4: Reference architecture</h2>
<p>A scalable design separates discovery, transfer, storage and validation, so each can be reviewed, retried and scaled on its own.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac0f4681cea866067acb497/a81684f7-8ded-4d42-808b-078475b4b36c.png" alt="" style="display:block;margin:0 auto" />

<p>Data flows top to bottom; identity and monitoring support the workers.</p>
<h3>What each component does</h3>
<table>
<thead>
<tr>
<th>Component</th>
<th>Role</th>
</tr>
</thead>
<tbody><tr>
<td>SharePoint Online</td>
<td>The source. Microsoft Graph enumerates drive items, reads metadata and downloads file content. The migration identity receives only the permissions needed for approved sites.</td>
</tr>
<tr>
<td>Discovery and extraction</td>
<td>Builds the inventory and migration manifest: each source item, its destination, metadata, size, timestamps and state. For large estates, separate discovery from transfer so scope is reviewed before data moves.</td>
</tr>
<tr>
<td>Queue and migration workers</td>
<td>Process independently retryable jobs on Azure Functions, Azure Container Apps, Azure Automation or another controlled compute service. Each worker downloads, uploads, applies metadata, computes hashes, records status and retries transient errors without duplicating completed work.</td>
</tr>
<tr>
<td>Azure storage</td>
<td>Holds the migrated documents plus manifests for metadata that blobs cannot represent. Design containers, naming, redundancy, access tier, soft delete, versioning, lifecycle rules, network restrictions and logging.</td>
</tr>
<tr>
<td>Validation and reporting</td>
<td>Compares source and destination records and reports to technical teams and business owners.</td>
</tr>
</tbody></table>
<h2>Step 5: Design the content and metadata mapping</h2>
<p>SharePoint concepts have no perfect one-to-one equivalent in Azure Storage. Agree a mapping document before you migrate.</p>
<table>
<thead>
<tr>
<th>SharePoint concept</th>
<th>Possible Azure representation</th>
</tr>
</thead>
<tbody><tr>
<td>Site and document library</td>
<td>Storage container or top-level directory</td>
</tr>
<tr>
<td>Folder</td>
<td>Blob virtual directory, or a Data Lake Storage Gen2 directory</td>
</tr>
<tr>
<td>Document</td>
<td>Blob</td>
</tr>
<tr>
<td>Standard and custom columns</td>
<td>Blob metadata, blob index tags or an external manifest</td>
</tr>
<tr>
<td>Created and modified information</td>
<td>Blob metadata plus the migration manifest</td>
</tr>
<tr>
<td>Version history</td>
<td>Exported versions as separate blobs, or the approved final version only</td>
</tr>
<tr>
<td>User and group permissions</td>
<td>Azure RBAC, Data Lake ACLs or application authorization</td>
</tr>
<tr>
<td>Sharing links</td>
<td>Not preserved; recreate access in the consuming application</td>
</tr>
<tr>
<td>Workflow state</td>
<td>External database or manifest, or a redesigned business process</td>
</tr>
</tbody></table>
<h3>Metadata versus index tags</h3>
<p>Choose the carrier by how you will query the data, not by convenience.</p>
<table>
<thead>
<tr>
<th>Property</th>
<th>Blob metadata</th>
<th>Blob index tags</th>
</tr>
</thead>
<tbody><tr>
<td>Size limit</td>
<td>8 KB total across all pairs</td>
<td>Up to 10 tags per blob, 768 bytes per tag</td>
</tr>
<tr>
<td>Searchable natively</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<td>Update in Archive tier</td>
<td>Not allowed</td>
<td>Allowed</td>
</tr>
<tr>
<td>Extra cost</td>
<td>Included in blob storage cost</td>
<td>Fixed cost per tag</td>
</tr>
</tbody></table>
<p>Complex fields (people, lookups, taxonomy, large metadata sets) fit poorly in either. Keep them in a JSON manifest, Azure SQL or another catalog and key it by blob path.</p>
<h3>Decide on version history early</h3>
<p>Exporting every version can add significant migration time and storage. For some archives, the approved final version plus an audit manifest satisfies the requirement. For regulated records, that decision needs sign-off from records-management and legal stakeholders.</p>
<h2>Step 6: Build identity and security into the design</h2>
<p>Use identity-based authentication, not credentials embedded in scripts. Microsoft recommends Microsoft Entra ID with managed identities for Azure-hosted applications that access Blob Storage, because permissions are then managed through Azure RBAC and no account keys are distributed.</p>
<table>
<thead>
<tr>
<th>Layer</th>
<th>Recommended control</th>
</tr>
</thead>
<tbody><tr>
<td>Reading SharePoint</td>
<td>Dedicated Entra app or workload identity using Microsoft Graph application permissions, scoped to approved sites with <code>Sites.Selected</code> rather than tenant-wide <code>Sites.Read.All</code></td>
</tr>
<tr>
<td>Azure-hosted workers</td>
<td>Managed identity, so no secret is stored in code or configuration</td>
</tr>
<tr>
<td>Writing to storage</td>
<td>Azure RBAC at the narrowest scope (for example, Storage Blob Data Contributor on the target container)</td>
</tr>
<tr>
<td>Directory-level control</td>
<td>Data Lake Storage Gen2 ACLs where different teams need different folders</td>
</tr>
<tr>
<td>Storage account keys</td>
<td>Disable Shared Key authorization once all clients use Entra ID</td>
</tr>
<tr>
<td>Secrets and certificates</td>
<td>Azure Key Vault for any credential that cannot be eliminated; prefer certificates over client secrets</td>
</tr>
<tr>
<td>Network</td>
<td>Private endpoints and storage firewall rules where your security baseline requires private connectivity</td>
</tr>
<tr>
<td>Audit</td>
<td>Central diagnostic and audit logs for both the source reads and the target writes</td>
</tr>
</tbody></table>
<h3>Permissions do not translate automatically</h3>
<p>A user's right to open a document in SharePoint does not become an equivalent Azure permission. For archived data, simplify access to approved records or compliance groups. For operational data, the consuming application may need to enforce authorization. Document this mapping and have the data owner approve it before cutover.</p>
<h2>Step 7: Select the migration pattern</h2>
<p>For most enterprise scenarios, a phased approach with an incremental final pass gives the best balance of control and downtime.</p>
<table>
<thead>
<tr>
<th>Pattern</th>
<th>How it works</th>
<th>Best when</th>
<th>Main risk</th>
</tr>
</thead>
<tbody><tr>
<td>Big bang</td>
<td>All content moves in one scheduled window</td>
<td>Small, stable libraries</td>
<td>Concentrated risk and a longer outage</td>
</tr>
<tr>
<td>Phased</td>
<td>Sites or libraries move in controlled waves</td>
<td>Different owners, risk profiles or retention rules</td>
<td>Longer overall programme; coexistence to manage</td>
</tr>
<tr>
<td>Initial copy plus incremental sync</td>
<td>Bulk copy while SharePoint stays live; a final pass moves items changed since, with the source set read-only</td>
<td>Large libraries that cannot tolerate long downtime</td>
<td>Needs reliable change detection and a read-only cutover step</td>
</tr>
</tbody></table>
<p>For incremental passes, Microsoft Graph <a href="https://learn.microsoft.com/graph/delta-query-overview">delta queries</a> on a drive let you retrieve only items changed since the last sync, which suits the final reconciliation pass.</p>
<h2>Step 8: Plan for throttling, scale and restartability</h2>
<p>Throughput is limited by more than bandwidth. Plan around total file count (not only total size), average and maximum file size, API call volume, worker concurrency, Azure Storage request rates, retry behaviour and the migration window.</p>
<p>SharePoint Online uses throttling to protect service health. Microsoft's <a href="https://learn.microsoft.com/sharepoint/dev/general-development/how-to-avoid-getting-throttled-or-blocked-in-sharepoint-online">guidance</a> for migration workers is clear:</p>
<table>
<thead>
<tr>
<th>Practice</th>
<th>Why it matters</th>
</tr>
</thead>
<tbody><tr>
<td>Honour the <code>Retry-After</code> header</td>
<td>Microsoft requires it. Throttled requests still count toward limits, so retrying early prolongs throttling</td>
</tr>
<tr>
<td>Add exponential backoff for transient errors</td>
<td>Covers HTTP 429 and 503 responses beyond the explicit wait time</td>
</tr>
<tr>
<td>Avoid request spikes and limit concurrency</td>
<td>Spread load evenly rather than bursting</td>
</tr>
<tr>
<td>Decorate your traffic</td>
<td>Send an app identifier and a descriptive User-Agent. Well-decorated traffic is prioritised over undecorated traffic</td>
</tr>
<tr>
<td>Prefer Microsoft Graph over CSOM and REST where possible</td>
<td>Graph is the recommended API surface for new development</td>
</tr>
<tr>
<td>Run large waves off-peak</td>
<td>Evenings and weekends reduce contention with users</td>
</tr>
<tr>
<td>Checkpoint and resume</td>
<td>Restart from the last successful item, not from the beginning</td>
</tr>
</tbody></table>
<p>Do not rely on IETF <code>RateLimit</code> headers from SharePoint Online; Microsoft states they are not returned or supported there.</p>
<h3>Make every job idempotent</h3>
<p>Re-running a job must not create duplicates or overwrite a newer item unless a deliberate rule says so. Store a deterministic destination path and the source hash in the manifest, and skip items already marked complete.</p>
<h3>Handle large files deliberately</h3>
<p>SharePoint Online supports very large files, so test the largest items in your inventory. Use ranged downloads and block-based uploads with retries, and stream data through the worker rather than buffering whole files in memory.</p>
<h2>Step 9: Validate every migration wave</h2>
<p>A file is not migrated because an upload returned success. Reconcile each wave against the source:</p>
<ul>
<li><p>Item counts, file sizes and folder-to-path mappings</p>
</li>
<li><p>File hashes (see below)</p>
</li>
<li><p>Required metadata and, if in scope, version counts</p>
</li>
<li><p>Permission mappings</p>
</li>
<li><p>Failed, skipped and excluded items</p>
</li>
</ul>
<h3>Hashing: use what SharePoint actually provides</h3>
<p>Microsoft Graph returns a <code>quickXorHash</code> in the <code>file.hashes</code> facet of a driveItem, and it is the only hash guaranteed for both OneDrive for Business and personal OneDrive. It is a proprietary, non-cryptographic hash, so Azure Storage will not compute or compare it for you. Compute <code>quickXorHash</code> on the stream as you transfer it, compare it with the Graph value, and store it in the manifest. If you also need a standard hash, compute SHA-256 or MD5 yourself during the transfer and store it as a blob property or in the manifest.</p>
<h3>Migration manifest</h3>
<p>The manifest is your audit trail. At minimum, record:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Purpose</th>
</tr>
</thead>
<tbody><tr>
<td>Source site, library, path, item ID</td>
<td>Traces each blob to its origin</td>
</tr>
<tr>
<td>Destination container and path</td>
<td>Confirms the mapping</td>
</tr>
<tr>
<td>Source size and modified timestamp</td>
<td>Detects changes after the copy</td>
</tr>
<tr>
<td><code>quickXorHash</code> (and any second hash)</td>
<td>Proves content integrity</td>
</tr>
<tr>
<td>Start and completion timestamps</td>
<td>Supports throughput analysis</td>
</tr>
<tr>
<td>Attempt count</td>
<td>Highlights problem items</td>
</tr>
<tr>
<td>Final status</td>
<td>Drives reporting and reruns</td>
</tr>
<tr>
<td>Error category and message</td>
<td>Speeds triage</td>
</tr>
</tbody></table>
<p>Follow technical reconciliation with business-owner acceptance. Test a controlled sample that includes large files, deeply nested folders, sensitive content, files with custom metadata and documents with unique permissions.</p>
<h2>Step 10: Define cutover and rollback before moving data</h2>
<p>Agree the cutover sequence, and the rollback that goes with it, before the first production wave. Rollback must be practical, not theoretical: until acceptance is complete, SharePoint remains the authoritative source, so access can be restored while the issue is corrected.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac0f4681cea866067acb497/c0882d0c-d6fb-4369-9298-e592217d162c.png" alt="" style="display:block;margin:0 auto" />

<p>A failed validation sends you back through a restored source and a repeat incremental pass. Retain the source for an agreed stabilization period, and archive or delete it only after formal approval.</p>
<h2>Step 11: Apply governance, protection and lifecycle controls</h2>
<p>Before migrating, confirm how the target will meet retention, privacy and recovery requirements. Retention labels, legal holds and SharePoint audit context do not follow a file into Azure automatically. Do not move regulated or legally held content until compliance stakeholders approve the destination and the evidence model.</p>
<h3>Protection options to plan</h3>
<ul>
<li><p>Blob soft delete and blob versioning for recovery from accidental deletion or overwrite</p>
</li>
<li><p>Immutable storage (WORM policies) for approved records</p>
</li>
<li><p>Redundancy that matches your recovery objectives (LRS, ZRS, GRS or GZRS)</p>
</li>
<li><p>Diagnostic logging, alerting and periodic access reviews</p>
</li>
<li><p>Documented approval before any deletion</p>
</li>
</ul>
<h3>Choose access tiers deliberately</h3>
<table>
<thead>
<tr>
<th>Tier</th>
<th>Availability</th>
<th>Minimum retention</th>
<th>Typical use after migration</th>
</tr>
</thead>
<tbody><tr>
<td>Hot</td>
<td>Online</td>
<td>None</td>
<td>Migration, validation and active use</td>
</tr>
<tr>
<td>Cool</td>
<td>Online</td>
<td>30 days</td>
<td>Infrequently accessed content that must stay readable</td>
</tr>
<tr>
<td>Cold</td>
<td>Online</td>
<td>90 days</td>
<td>Rarely accessed content that still needs fast retrieval</td>
</tr>
<tr>
<td>Archive</td>
<td>Offline</td>
<td>180 days</td>
<td>Long-term retention where hours of retrieval delay are acceptable</td>
</tr>
</tbody></table>
<p>Moving or deleting a blob before its minimum retention period triggers an early-deletion charge. Archived blobs cannot be read until you rehydrate them to an online tier, and rehydration cannot be done through lifecycle policies. Microsoft's <a href="https://learn.microsoft.com/azure/storage/blobs/access-tiers-overview">access tier documentation</a> also lists redundancy limits for the Archive tier (it is not available on ZRS, GZRS or RA-GZRS accounts), so confirm your redundancy choice before you design around Archive.</p>
<h3>Lifecycle rules follow policy, they do not replace it</h3>
<p><a href="https://learn.microsoft.com/azure/storage/blobs/lifecycle-management-overview">Lifecycle management</a> policies can transition eligible blobs to cooler tiers or delete them based on rules you define. Derive those rules from your retention schedule. A common pattern is to keep content in Hot during migration and validation, then move it to Cool, Cold or Archive after an approved stabilisation period.</p>
<h2>Step 12: Estimate cost across the full lifecycle</h2>
<p>Storage capacity is only one line of the bill. Estimate every cost driver with the <a href="https://azure.microsoft.com/pricing/calculator/">Azure pricing calculator</a> using your real inventory, not averages.</p>
<table>
<thead>
<tr>
<th>Cost driver</th>
<th>What to include</th>
</tr>
</thead>
<tbody><tr>
<td>Storage</td>
<td>Tier and redundancy; early-deletion charges if you re-tier before the minimum retention period</td>
</tr>
<tr>
<td>Operations</td>
<td>Read, write and list transactions; these grow with file count</td>
</tr>
<tr>
<td>Retrieval</td>
<td>Data retrieval and rehydration charges for Cool, Cold and Archive</td>
</tr>
<tr>
<td>Network</td>
<td>Egress, if data leaves Azure or crosses regions</td>
</tr>
<tr>
<td>Compute</td>
<td>Migration workers, queues and orchestration</td>
</tr>
<tr>
<td>Monitoring</td>
<td>Log ingestion and log retention</td>
</tr>
<tr>
<td>Security</td>
<td>Private endpoints and Key Vault operations</td>
</tr>
<tr>
<td>Resilience</td>
<td>Backup, replication or geo-redundancy</td>
</tr>
<tr>
<td>Coexistence</td>
<td>SharePoint storage and licensing while both systems run</td>
</tr>
</tbody></table>
<p>Archive saves the most on storage but adds retrieval delay and cost, so confirm the business accepts both before you commit.</p>
<h2>Planning deliverables checklist</h2>
<p>Before implementation begins, the project should have produced:</p>
<ul>
<li><p>[ ] Business scope and success criteria</p>
</li>
<li><p>[ ] SharePoint content inventory</p>
</li>
<li><p>[ ] Data-classification and disposition decisions</p>
</li>
<li><p>[ ] Target architecture diagram</p>
</li>
<li><p>[ ] Content and metadata mapping</p>
</li>
<li><p>[ ] Identity, permission and network design</p>
</li>
<li><p>[ ] Migration wave plan</p>
</li>
<li><p>[ ] Performance and throttling model</p>
</li>
<li><p>[ ] Validation and acceptance plan</p>
</li>
<li><p>[ ] Cutover and rollback procedure</p>
</li>
<li><p>[ ] Governance and retention design</p>
</li>
<li><p>[ ] Cost estimate</p>
</li>
</ul>
<h2>Conclusion</h2>
<p>A successful SharePoint-to-Azure migration begins with classification and architecture, not code. The central question is not "How do we copy the files?" but "Which SharePoint capabilities must we retain, replace, redesign or intentionally retire?"</p>
<p>Answer that early and Azure Blob Storage or Data Lake Storage Gen2 becomes a secure, scalable and cost-controlled home for the right content. The result is easier to validate, easier to operate and far less likely to become an ungoverned archive.</p>
<p><strong>Your next step:</strong> build a pilot that inventories one approved library, migrates a representative content set, preserves the agreed metadata and produces a full reconciliation report before you scale to production.</p>
<h2>References</h2>
<ul>
<li><p><a href="https://learn.microsoft.com/sharepoint/dev/general-development/how-to-avoid-getting-throttled-or-blocked-in-sharepoint-online">Avoid getting throttled or blocked in SharePoint Online</a></p>
</li>
<li><p><a href="https://learn.microsoft.com/graph/api/resources/onedrive">Working with files in Microsoft Graph</a></p>
</li>
<li><p><a href="https://learn.microsoft.com/onedrive/developer/rest-api/resources/hashes">Hashes resource type (quickXorHash)</a></p>
</li>
<li><p><a href="https://learn.microsoft.com/azure/storage/blobs/access-tiers-overview">Access tiers for blob data</a></p>
</li>
<li><p><a href="https://learn.microsoft.com/azure/storage/blobs/storage-manage-find-blobs">Manage and find Azure Blob data with blob index tags</a></p>
</li>
<li><p><a href="https://learn.microsoft.com/azure/storage/blobs/lifecycle-management-overview">Azure Blob Storage lifecycle management overview</a></p>
</li>
<li><p><a href="https://learn.microsoft.com/azure/storage/blobs/authorize-access-azure-active-directory">Authorize access to blobs using Microsoft Entra ID</a></p>
</li>
<li><p><a href="https://learn.microsoft.com/microsoft-365/archive/archive-overview">Microsoft 365 Archive overview</a></p>
</li>
</ul>
<p><em>This article presents a general reference architecture. Adapt production migrations to your organizational, regulatory, licensing and workload requirements, and confirm limits and pricing against current Microsoft documentation.</em></p>
]]></content:encoded></item></channel></rss>