<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Atlas Technica Blog</title>
    <link>https://www.atlastechnica.com/resources/blog</link>
    <description>Explore IT, cybersecurity, and cloud resources for hedge funds and private equity firms, including best practices for infrastructure, security, and compliance.</description>
    <language>en</language>
    <pubDate>Wed, 06 May 2026 18:50:20 GMT</pubDate>
    <dc:date>2026-05-06T18:50:20Z</dc:date>
    <dc:language>en</dc:language>
    <item>
      <title>5 Must-Know SIEM Questions Answered</title>
      <link>https://www.atlastechnica.com/resources/blog/5-must-know-siem-questions-answered</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/5-must-know-siem-questions-answered" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/Compliance%20Results%20in%20Confidence%20Image.png" alt="5 Must-Know SIEM Questions Answered" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;iframe style="margin: 0px auto; display: block;" src="https://www.atlastechnica.com/hubfs/IT%20Resources/Resources-INFOSHEET%20-%20SIEM%20FAQs.pdf" width="816" height="1056"&gt;&lt;/iframe&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2F5-must-know-siem-questions-answered&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>White Paper</category>
      <pubDate>Fri, 20 Mar 2026 17:11:14 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/5-must-know-siem-questions-answered</guid>
      <dc:date>2026-03-20T17:11:14Z</dc:date>
      <dc:creator>Atlas Technica</dc:creator>
    </item>
    <item>
      <title>How EDR, SIEM, and SOC Work Together</title>
      <link>https://www.atlastechnica.com/resources/blog/atlas-technica-blog/how-edr-siem-and-soc-work-together</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/atlas-technica-blog/how-edr-siem-and-soc-work-together" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/ChatGPT%20Image%20Apr%2029%2c%202026%2c%2003_19_42%20PM.png" alt="How EDR, SIEM, and SOC Work Together" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;iframe style="margin: 0px auto; display: block;" src="https://www.atlastechnica.com/hubfs/IT%20Resources/Resources-E-BOOK%20-%20How%20EDR%20SIEM%20and%20SOC%20Work%20Together%20to%20protect%20SMBs.pdf" width="816" height="1056"&gt;&lt;/iframe&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2Fatlas-technica-blog%2Fhow-edr-siem-and-soc-work-together&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>White Paper</category>
      <pubDate>Fri, 20 Mar 2026 17:09:00 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/atlas-technica-blog/how-edr-siem-and-soc-work-together</guid>
      <dc:date>2026-03-20T17:09:00Z</dc:date>
      <dc:creator>Atlas Technica</dc:creator>
    </item>
    <item>
      <title>Cyberattack Infographic</title>
      <link>https://www.atlastechnica.com/resources/blog/cyberattack-infographic</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/cyberattack-infographic" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/bee478c6-3094-4c26-9b67-d1c8114f8e1f.png" alt="Cyberattack Infographic" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt;</description>
      <content:encoded>&lt;iframe style="margin: 0px auto; display: block;" src="https://www.atlastechnica.com/hubfs/IT%20Resources/Resources-NFOGRAPHIC%20-%2015%20Ways%20To%20Protect%20Your%20Business%20From%20A%20Cyberattack.pdf" width="816" height="1056"&gt;&lt;/iframe&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2Fcyberattack-infographic&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>White Paper</category>
      <pubDate>Fri, 20 Mar 2026 17:06:15 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/cyberattack-infographic</guid>
      <dc:date>2026-03-20T17:06:15Z</dc:date>
      <dc:creator>Atlas Technica</dc:creator>
    </item>
    <item>
      <title>Modernizing IT for a New York Professional Services Organization with Microsoft Cloud</title>
      <link>https://www.atlastechnica.com/resources/blog/modernizing-it-for-a-new-york-professional-services-organization-with-microsoft-cloud</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/modernizing-it-for-a-new-york-professional-services-organization-with-microsoft-cloud" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/5b6a8d54-0773-43b0-8d83-7c1ddba13653.png" alt="Modernizing IT for a New York Professional Services Organization with Microsoft Cloud" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;h1&gt;Modernizing IT for a New York Professional Services Organization with Microsoft Cloud&lt;/h1&gt; 
&lt;h3&gt;Executive Summary&lt;/h3&gt; 
&lt;p&gt;A mid-sized professional services organization in New York City partnered with Atlas Technica to modernize its architecture and simplify day-to-day operations. Atlas delivered a governed Microsoft cloud foundation that unified collaboration, deploying Windows 365 and Azure Virtual Desktop for end user productivity, and a right-sized Azure platform to host critical services with resilient connectivity to on-premises locations and partner networks. The Azure build included a fit-for-purpose landing zone, structured networking, identity integration, backup and recovery, and selective Windows Server workloads where that model best served operational needs.&lt;/p&gt;</description>
      <content:encoded>&lt;h1&gt;Modernizing IT for a New York Professional Services Organization with Microsoft Cloud&lt;/h1&gt; 
&lt;h3&gt;Executive Summary&lt;/h3&gt; 
&lt;p&gt;A mid-sized professional services organization in New York City partnered with Atlas Technica to modernize its architecture and simplify day-to-day operations. Atlas delivered a governed Microsoft cloud foundation that unified collaboration, deploying Windows 365 and Azure Virtual Desktop for end user productivity, and a right-sized Azure platform to host critical services with resilient connectivity to on-premises locations and partner networks. The Azure build included a fit-for-purpose landing zone, structured networking, identity integration, backup and recovery, and selective Windows Server workloads where that model best served operational needs.&lt;/p&gt; 
&lt;h3&gt;Background and goals&lt;/h3&gt; 
&lt;p&gt;The organization manages a distributed workforce with a mix of knowledge workers and field staff. They needed consistent access to line of business systems without the complexity and cost of maintaining their on-premises VDI host and sprawling endpoint configurations. Objectives included establishing a robust collaboration baseline in Microsoft 365, consolidating and standardizing user access through Azure based workspaces, and building a governed cloud foundation that internal IT and Atlas could operate jointly. A financial review of moving from VMware Horizon to Azure Virtual Desktop framed the decision and sequencing for change, indicating significant return on investment. Atlas’ wealth of onboarding experience brought together well-defined project management, disciplined change enablement, and a steady technical cadence. Workstreams spanned tenant readiness, device and application access, network and identity guardrails, and structured user onboarding. The implementation included a carefully planned migration timeline with emphasis on quality control and user\company acceptance to ensure the end user experience was protected while Atlas steadily improved the client’s posture and operations.&lt;/p&gt; 
&lt;h3&gt;Workspace and security baseline&lt;/h3&gt; 
&lt;p&gt;Microsoft 365 became the organizing layer for identity, mail, and collaboration, with Atlas managed services covering configuration, monitoring, and user support. User onboarding guidance formalized how accounts, licenses, and groups are created and synchronized, how email hygiene and archiving are applied, and which devices and profiles are in scope for Cloud PC and AVD access. Following documented process reduced variability and gave internal IT transparency for approvals and change requests as user adoption proceeded.&lt;/p&gt; 
&lt;h3&gt;Virtual desktop modernization on Azure&lt;/h3&gt; 
&lt;p&gt;Atlas replaced VMware Horizon with Azure Virtual Desktop, delivering pooled session hosts with consumption-based billing and native Microsoft 365 integration. ROI analysis documented the shift from private cloud or co-located infrastructure to AVD and showed material cost and operational benefits over time. To extend savings and simplify operations, Atlas used the third-party platform Nerdio to automate scale down and shutdown of session hosts during low-demand periods and to right-size disks as usage patterns stabilized. This reduced compute and storage spend while maintaining user experience. AVD was built, validated, and handed over within the same governance model as servers and networking, so daily operations, security, and change control remain consistent.&lt;/p&gt; 
&lt;h2 style="line-height: 36px; color: #333333; background-color: #ffffff;"&gt;Security, Resilience and data protection&lt;/h2&gt; 
&lt;p&gt;Data resiliency was extremely important to the client, so we started with protection before polish. From the first build, we turned on the guardrails that keep people and data safe. Conditional Access controlled how users signed in, encryption kept information safe at rest, one. We checked these controls as we went, then checked them again, so the foundation was sound. As the platform took shape, we readied operations too, making sure Azure services were healthy and large-scale onboarding of people and devices could happen without surprises. We treated governance and documentation as deliverables, not afterthoughts, so the teams who would run the environment had the workplans, runbooks, and checklists they needed across Azure, Microsoft 365, Intune, and email security.&lt;/p&gt; 
&lt;h3&gt;Outcomes&lt;/h3&gt; 
&lt;p&gt;A unified Microsoft cloud foundation now streamlines operations and strengthens governance, with Azure hosting the right mix of services and reliable connectivity to on-premises sites and partner networks. End user computing is modernized on Azure Virtual Desktop, and Windows Server workloads run under the same Azure governance, reducing complexity and spending compared to the previous Horizon environment. The platform is documented for steady operations and ongoing improvement as the business grows.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2Fmodernizing-it-for-a-new-york-professional-services-organization-with-microsoft-cloud&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Case Study</category>
      <pubDate>Fri, 20 Mar 2026 16:40:34 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/modernizing-it-for-a-new-york-professional-services-organization-with-microsoft-cloud</guid>
      <dc:date>2026-03-20T16:40:34Z</dc:date>
      <dc:creator>Atlas Technica</dc:creator>
    </item>
    <item>
      <title>How Atlas Technica Worked with an Early Stage Quant Fund to Modernize their IT Infrastructure</title>
      <link>https://www.atlastechnica.com/resources/blog/how-atlas-technica-worked-with-an-early-stage-quant-fund-to-modernize-their-it-infrastructure</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/how-atlas-technica-worked-with-an-early-stage-quant-fund-to-modernize-their-it-infrastructure" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/pexels-candid-flaneur-175964800-29931645.jpg" alt="How Atlas Technica Worked with an Early Stage Quant Fund to Modernize their IT Infrastructure" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;h1&gt;How Atlas Technica Worked with an Early Stage Quant Fund to Modernize their IT Infrastructure&lt;/h1&gt; 
&lt;h3&gt;Executive Summary&lt;/h3&gt; 
&lt;p&gt;An early-stage, SEC-registered quantitative fund partnered with Atlas Technica to rapidly establish a secure Microsoft 365 foundation, introduce Windows 365 Cloud PCs for consistent end-user experience, and deploy a right-sized Azure platform tailored to Linux based research workflows and centralized data access. This setup emphasized governance, segmentation between productivity and research environments, and a stepwise path to reduce reliance on home-hosted Linux infrastructure without disrupting any existing workflows. The engagement hit a March functional milestone, then stabilized and closed in early April 2025 for a clean transition into a steady-state operations and ongoing optimization.&lt;/p&gt;</description>
      <content:encoded>&lt;h1&gt;How Atlas Technica Worked with an Early Stage Quant Fund to Modernize their IT Infrastructure&lt;/h1&gt; 
&lt;h3&gt;Executive Summary&lt;/h3&gt; 
&lt;p&gt;An early-stage, SEC-registered quantitative fund partnered with Atlas Technica to rapidly establish a secure Microsoft 365 foundation, introduce Windows 365 Cloud PCs for consistent end-user experience, and deploy a right-sized Azure platform tailored to Linux based research workflows and centralized data access. This setup emphasized governance, segmentation between productivity and research environments, and a stepwise path to reduce reliance on home-hosted Linux infrastructure without disrupting any existing workflows. The engagement hit a March functional milestone, then stabilized and closed in early April 2025 for a clean transition into a steady-state operations and ongoing optimization.&lt;/p&gt; 
&lt;h3&gt;Read the story - Background and goals&lt;/h3&gt; 
&lt;p&gt;The client began their onboarding with a lean team of under 10 users, SEC regulated responsibilities, and a strategic desire to keep tight control over research environments while adopting a managed baseline for identity, collaboration, and security. This combination required a pragmatic approach: implement a strong governance and compliance posture for the firm at large, while preserving autonomy and performance characteristics where the research stack demanded it.Prior to onboarding with Atlas, leadership operated unmanaged, home-hosted Linux servers linked via Tailscale and asked for Azure-hosted Linux resources backed by performant shared storage. Windows 365 Cloud PCs would act as secure jump boxes, separating productivity from research compute while maintaining low friction access to resources. The onboarding plan explicitly recognized these patterns to prevent disruption as trust, telemetry, and governance matured.&lt;/p&gt; 
&lt;h3&gt;Building the foundation&lt;/h3&gt; 
&lt;p&gt;Atlas established the Microsoft 365 tenant and applied managed protections aligned to the firm’s regulatory profile. Given the startup context and staged rollout of compliance tooling, Atlas Technica’s Cyber Bundle offering complete with endpoint protection, network monitoring, SIEM with 24/7 managed SOC was deployed to support audit readiness and ongoing operational reporting, with cadence and scope designed to scale as the team grew.In parallel, Atlas standardized collaboration and identity under Microsoft 365 and ensured the operating model could support future archiving and journaling requirements typical for regulated investment firms. This enabled the environment to evolve toward the desired compliance posture without rework, while keeping early operations streamlined for a small team.&lt;/p&gt; 
&lt;h3&gt;End-user computing&lt;/h3&gt; 
&lt;p&gt;Windows 365 Enterprise Cloud PCs were deployed for users to provide a consistent, governed desktop experience, regardless of their local device or location. By design, Cloud PCs also served as clean jump points into research resources where appropriate, helping the team preserve necessary isolation between day-to-day productivity and their research environment. This structure supported rapid onboarding while reinforcing access boundaries that would be important as the firm scaled.To accommodate user experience and latency considerations, Atlas documented regional placement options for Cloud PCs such as relocating to the UK where beneficial, while preserving reliable VNet communication with Linux resources in Azure. This plan ensured any future regional updates would not come at the cost of network access or control.&lt;/p&gt; 
&lt;h3&gt;Platform build for research workloads&lt;/h3&gt; 
&lt;p&gt;Atlas deployed a compact Azure estate dedicated to the research tier, migrating Linux virtual machines built from the client’s image guidance so toolchains, libraries, and kernel settings matched the team’s baseline from day one. A centralized, readoptimized data layer was exposed only to the Linux tier to minimize latency and reduce blast radius, enforcing access from research subnets while keeping productivity environments segmented.Storage was intentionally designed to support two validated access patterns without architectural churn: shared reads over Azure Files using NFS for datasets and models, and local highIO workloads backed by managed disks on specific VMs when lowlatency scratch or writeheavy operations were required; this allowed the environment to tune performance and cost as usage stabilized. This approach created a clear runway for cost control and iterative performance optimization as research workloads matured.Operationally, the existing connectivity model was preserved: Tailscale agents remained on the Linux hosts to maintain established peertopeer access patterns and avoid disruption to researchers’ workflows. Monitoring and governance were aligned to the existing configuration, outlining a logical path to bring additional Linux workloads into Azure over time once performance, trust, and telemetry targets were met.&lt;/p&gt; 
&lt;h3&gt;Project timeline&lt;/h3&gt; 
&lt;p&gt;Procurement, scheduling, and quality control were coordinated to meet a March functional go-live that aligned with the firm’s launch plan. After acceptance, the Atlas team worked to ensure the project moved through stabilization and closed it in early April 2025, transitioning the client to a steady state to support. This cadence balanced urgency with the rigor needed for a regulated startup.&lt;/p&gt; 
&lt;h3&gt;Outcomes&lt;/h3&gt; 
&lt;ul style="color: #333333; background-color: #ffffff;"&gt; 
 &lt;li&gt; &lt;p&gt;A secure Microsoft 365 foundation with managed protections and a defined path for bolded audit and operational reporting needs as the firm scales, minimizing rework while preserving speed in the first months of operation.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Windows 365 Cloud PCs are in place for a consistent, governed user experience, with clear separation between daily productivity and research compute to maintain both agility and control.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;An Azure-based Linux research environment with centralized, read-optimized storage and controlled connectivity, preserving existing operating patterns (including Tailscale) and documenting a stepwise path to consolidate more Linux workloads in Azure over time without operational shock.&lt;/p&gt; &lt;/li&gt; 
 &lt;li&gt; &lt;p&gt;Timely onboarding and acceptance: March functional milestone achieved, stabilization completed, and closed in early April 2025, enabling handoff to support and smooth daily operations.&lt;/p&gt; &lt;/li&gt; 
&lt;/ul&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2Fhow-atlas-technica-worked-with-an-early-stage-quant-fund-to-modernize-their-it-infrastructure&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Case Study</category>
      <pubDate>Fri, 20 Mar 2026 16:38:46 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/how-atlas-technica-worked-with-an-early-stage-quant-fund-to-modernize-their-it-infrastructure</guid>
      <dc:date>2026-03-20T16:38:46Z</dc:date>
      <dc:creator>Atlas Technica</dc:creator>
    </item>
    <item>
      <title>ScreenConnect</title>
      <link>https://www.atlastechnica.com/resources/blog/screenconnect</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/screenconnect" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/65dfa90c97d8ca0ff1b49da8_pexels-tima-miroshnichenko-5380642.jpg" alt="ScreenConnect" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;blockquote&gt;
  In today's interconnected digital landscape, ensuring the security of your systems and data is paramount. Recent events have underscored the importance of promptly addressing vulnerabilities to protect against potential exploits. One such instance involves an older version of Connectwise ScreenConnect, also known as ConnectWise Control, which has been identified as susceptible to exploitation. 
&lt;/blockquote&gt; 
&lt;p&gt;At Atlas Technica we take the security of our systems and the data of our clients seriously. Our control instance is hosted by ConnectWise, and as soon as the vulnerability was discovered ConnectWise upgraded our system to the latest version, fortifying our defenses against potential threats.&lt;/p&gt;</description>
      <content:encoded>&lt;blockquote&gt;
 In today's interconnected digital landscape, ensuring the security of your systems and data is paramount. Recent events have underscored the importance of promptly addressing vulnerabilities to protect against potential exploits. One such instance involves an older version of Connectwise ScreenConnect, also known as ConnectWise Control, which has been identified as susceptible to exploitation.
&lt;/blockquote&gt; 
&lt;p&gt;At Atlas Technica we take the security of our systems and the data of our clients seriously. Our control instance is hosted by ConnectWise, and as soon as the vulnerability was discovered ConnectWise upgraded our system to the latest version, fortifying our defenses against potential threats.&lt;/p&gt;  
&lt;p&gt;After the upgrade, we conducted a thorough review of our system logs. This proactive measure allowed us to ascertain that our server was patched before any suspicious activity occurred. This rapid response not only safeguards our own data but also ensures the continued security of our clients' information.&lt;/p&gt; 
&lt;p&gt;However, it is essential to recognize that firms hosting their own instances of ConnectWise may be vulnerable if they are using older versions of ScreenConnect. If your organization falls into this category, (Atlas clients do not) it is imperative to act promptly. ConnectWise has released a patch to address the vulnerability, and it is crucial for affected firms to upgrade their service instances to the latest version without delay.&lt;/p&gt; 
&lt;p&gt;By staying vigilant and promptly addressing vulnerabilities, organizations can mitigate the risks posed by potential exploits. Proactive measures such as regular system updates, robust monitoring protocols, and swift response to security advisories are essential components of a comprehensive cybersecurity strategy.&lt;/p&gt; 
&lt;p&gt;In conclusion, the recent vulnerability in older versions of Connectwise ScreenConnect serves as a reminder of the ever-present need to prioritize cybersecurity. At Atlas, we remain committed to safeguarding our systems and data, ensuring the continued trust and confidence of our clients. We encourage all organizations to remain vigilant, stay informed about potential vulnerabilities, and take proactive steps to protect their digital assets. In today's digital age, the best defense is a proactive and vigilant approach to cybersecurity.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2Fscreenconnect&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Blog</category>
      <pubDate>Fri, 20 Mar 2026 16:35:54 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/screenconnect</guid>
      <dc:date>2026-03-20T16:35:54Z</dc:date>
      <dc:creator>Atlas Technica</dc:creator>
    </item>
    <item>
      <title>How to provide Azure environment access to a third-party</title>
      <link>https://www.atlastechnica.com/resources/blog/how-to-provide-azure-environment-access-to-a-third-party</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/how-to-provide-azure-environment-access-to-a-third-party" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/683ddabea558fbd011b533d9_azure-image.jpg" alt="How to provide Azure environment access to a third-party" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;There are usually three common approaches when you need to provide access to your Azure environment to a third party, such as external contractors, vendors, partner organizations, or a managed service provider (MSP). There are many pros and cons to each of these, which will be described in this article from the perspective of identity and access management (IAM). As a bonus, this article will also touch on one overlooked approach, which can be especially beneficial for MSPs.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;There are usually three common approaches when you need to provide access to your Azure environment to a third party, such as external contractors, vendors, partner organizations, or a managed service provider (MSP). There are many pros and cons to each of these, which will be described in this article from the perspective of identity and access management (IAM). As a bonus, this article will also touch on one overlooked approach, which can be especially beneficial for MSPs.&lt;/p&gt;  
&lt;p&gt;Let’s start from the worst case scenario and move towards better alternatives.&lt;/p&gt; 
&lt;h1&gt;Shared account(s) for external users in your Entra ID tenant&lt;/h1&gt; 
&lt;p&gt;That access scenario is common for small and medium organizations where a third party is provided with a few impersonalized accounts in a client’s Entra ID tenant. In other words, they are used by multiple people to manage the client’s environment in the Azure cloud. The usual reasoning for such an access design decision is that it’s simple, quick to set up, and minimizes license costs and the attack surface, as fewer accounts are handed over to an external organization or user(s).&lt;/p&gt;  
&lt;div&gt;
 &lt;img src="https://cdn.prod.website-files.com/6544abd51937087906103af9/682e04b13566ba5be546ae48_AD_4nXf15dIxJfB-k6m-u9s1KXd0pHllG4CzWT95_yCIQ0RvrNx99ntnvMfluQz5XT93WSztDZTGmg0WqXQZXb4o2Eo1IfWsp9rStZScjcuLs7zy3pTDDMqIz5H3CRoaO2m4XXMAn8hQ-w.png" style="vertical-align: middle; width: 564px;"&gt;
&lt;/div&gt;  
&lt;p&gt;Despite its simplicity, that approach to accessing client Azure environments has a few serious drawbacks:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Using shared accounts is generally a bad security practice, as many people know the account credentials, and investigating user activity becomes a titan’s quest: you cannot be sure who exactly used a shared account at any given moment.&lt;/li&gt; 
 &lt;li&gt;Those few user accounts are often overprivileged, granting administrative permissions to many systems and applications, making them ideal for credential theft attacks.&lt;/li&gt; 
 &lt;li&gt;Securely handling those shared accounts by third parties requires additional effort from both sides.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;Those security risks can be partially mitigated by enforcing a multitude of protocols including a strong password policy, regular password rotations, using a password manager with access control, and, most importantly, enforcing mandatory multi-factor authentication (MFA) for those accounts. Still, the shared account usage pattern creates more security threats than benefits, and it is something that is strongly not recommended.&lt;/p&gt; 
&lt;p&gt;The only probable exception from that recommendation is break-glass accounts, which are known/accessible by very few people. However, those accounts are not intended for regular use, should be used only in exceptional circumstances, and should be extensively monitored/alerted when used for authentication.&lt;/p&gt; 
&lt;h1&gt;Regular user accounts for external users in your Entra ID tenant&lt;/h1&gt; 
&lt;p&gt;Many enterprise-scale organizations prefer providing individual user accounts in their Entra ID tenants to external contractors, vendors, etc. The most obvious reason for that IAM practice is having complete control over the account security policies. In that scenario, an organization (client) can leverage all available identity protection capabilities in their user access management setup: password policies, conditional access, access restrictions, monitoring, logging, suspicious activity detection, etc.&lt;/p&gt; 
&lt;p&gt;In large companies, identity and access management are usually performed in-house for security reasons, and they dictate the rules for accessing the organization’s environment.&lt;/p&gt;  
&lt;div&gt;
 &lt;img src="https://cdn.prod.website-files.com/6544abd51937087906103af9/682e04b1ce5cbab758674087_AD_4nXdqivniz8WqC0ZxMHEUNoRwHoxed6lalUQW2Wsa77iBFF5OeWkYnY-PDWtsen0-ipHXS7Xrqg1e9_u1yH46F_TebARxoqnE8DS6erkd1gxhReHuXQL5Xf6BP92hFbLoYpJUyD1RLg.png" style="vertical-align: middle; width: 564px;"&gt;
&lt;/div&gt;  
&lt;p&gt;The first notable downside of this approach is that the client now needs to manage the entire user account lifecycle for external users, meaning it needs to provision new accounts for such users and decommission them when required. The last part is often overlooked and delayed as it requires an efficient notification process between the client and third parties when a third-party user account provided by the client should be deactivated. If there is no such process in place, a security gap will be created when a third-party user is no longer authorized to access the client environment, whereas their personalized account in the client tenant is still active and can be used to gain that access.&lt;/p&gt; 
&lt;p&gt;Secondly, in the MSP access scenario, when a single engineer can manage multiple client Azure environments, that creates an overhead of maintaining and securing many individual accounts for accessing different client environments. When the engineer parts ways with the MSP, the latter needs to reach out to all the clients the engineer had accounts with and ask them to revoke that access.&lt;/p&gt; 
&lt;p&gt;Thirdly, as those user identities are housed in the client tenant, the client needs to license them accordingly to comply with application license requirements.&lt;/p&gt; 
&lt;p&gt;What if you could eliminate clients’ need to manage user identities on their side while still giving clients enough access controls?&lt;/p&gt; 
&lt;h1&gt;Guest user accounts in your Entra ID tenant&lt;/h1&gt; 
&lt;p&gt;The concept of guest user accounts has existed in Entra ID for quite some time. In short, it allows you to invite a user into your organization using their external identity, e.g., their user account in another Entra ID tenant.&lt;/p&gt;  
&lt;div&gt;
 &lt;img src="https://cdn.prod.website-files.com/6544abd51937087906103af9/682e04b1f3052d69821f3d7c_AD_4nXfcYo1RSpCbSIHKnIif6jUWPPuSSsVGyDdDOHijD05o-aiI7wJAEqk6s4cAFXJdEOI11wnbr3RaDiaMVeZLraWiDQQbc5RmRQhKn1FGIebmb1Wlyln-zleTl3gyTe_zhgfXLXzL.png" style="vertical-align: middle; width: 564px;"&gt;
&lt;/div&gt;  
&lt;p&gt;While providing you with all security controls you can enforce on user accounts in your (client) tenant, as in the previous scenario, that approach also simplifies access revocation for such identities: as soon as a guest account is deactivated in its home tenant, it cannot authenticate and access your (client) tenant, too. You can also disable (or modify) guest account access in your (client) tenant without affecting its state and permissions in its home and other tenants. Sounds like a perfect solution, or not?&lt;/p&gt; 
&lt;p&gt;One caveat with guest account access is that you must still onboard (invite) those accounts to your tenant and configure their access. With some effort and a well-designed access model, that process can be automated and monitored for proper access configuration.&lt;/p&gt; 
&lt;p&gt;Another point worth mentioning is that with guest user accounts, you have little to no control over their authentication process, which happens outside your (client) tenant. In other words, you might need to make an additional effort to configure some advanced authentication controls on your side, like requesting additional MFA enrollment and its usage by guest users in your tenant.&lt;/p&gt; 
&lt;p&gt;Overall, managing guest user access at scale requires careful planning and deploying services like Microsoft Entra External ID to handle advanced scenarios. If designed properly, that scenario can be a solid foundation for providing access to external identities in your tenant.&lt;/p&gt; 
&lt;h1&gt;[Bonus part] Delegated access with Azure Lighthouse&lt;/h1&gt; 
&lt;p&gt;Despite being introduced back in 2019, that solution for delegated access to Azure resources is often overlooked when designing third-party access to your Azure environment. The basic idea of that solution is simple: you can delegate access to your Azure subscriptions and/or resource groups with specific permissions to specific security principals in an external (e.g., MSP) tenant.&lt;/p&gt; 
&lt;p&gt;Apart from configuring delegated access in your tenant, MSPs can create service templates by packaging managed services they offer with required permissions to fulfill them into Azure Marketplace offers, simplifying the onboarding experience for new customers.&lt;/p&gt;  
&lt;div&gt;
 &lt;img src="https://cdn.prod.website-files.com/6544abd51937087906103af9/682e04b08e0d10ce9800e335_AD_4nXfYIO1-chM8xM49dsomTIf9t25jIkMuD8VeQXiV8sgiOa-1EeEcVW-OAgskkMv_Vre3SC4E2DUEovHX43XHLMp4tHIiKU0VGcQkmd6nTiU230j7SNUAPvFlE5aOleHFWV7yf7wB.png" style="vertical-align: middle; width: 564px;"&gt;
&lt;/div&gt;  
&lt;p&gt;After the target Azure resources are onboarded for delegated access with Azure Lighthouse, those (guest) service principals can access and manage them. Plus, as those service principals can represent security groups (usually a preferred approach here) in another tenant, you can basically abstract yourself from managing access for individual user accounts.&lt;/p&gt; 
&lt;p&gt;In addition, MSP engineers can now access different client environments using their home (MSP) tenant user accounts without needing to remember and manage multiple access accounts. Because the delegated permissions in Azure Lighthouse can be different from client to client and from scope to scope, they also don’t need to worry about using correct access profiles, as they are already pre-configured for them.&lt;/p&gt; 
&lt;p&gt;Those benefits can also be seen as a disadvantage, as you have no explicit control over who can manage the Azure resources you delegated access to because it’s controlled on the MSP side by managing the membership of security groups referred by security principals in the Azure Lighthouse deployment template.&lt;/p&gt; 
&lt;p&gt;Another aspect of using Azure Lighthouse for delegated access to Azure resources is that you don’t have control over the authentication process for the security principals in the MSP tenant. So, the principle of least privileged access becomes even more critical in that access scenario, as you likely want to reduce the potential blast radius in case a service principal (user account) with delegated access is compromised in the MSP tenant.&lt;/p&gt; 
&lt;p&gt;Integrating Azure Lighthouse with Entra ID Privileged Identity Management (PIM) on the MSP side can strengthen the security of using delegated access. However, requiring such additional controls from the customer side requires auditing MSP processes and building trust relationships with your MSP. From the technical side, you, as a client, can only monitor MSP activity within the scope of delegated management.&lt;/p&gt; 
&lt;p&gt;Compared to the scenario with guest user accounts in your tenant, Azure Lighthouse removes the overhead of managing individual guest user identities in your tenant for the cost of less control of what specific users in the MSP tenant will have access to your Azure environment. As in the previous case, it can be a very efficient and secure access model with proper permissions, scopes and monitoring configurations.&lt;/p&gt; 
&lt;p&gt;As you might conclude after reading about the described access model, there is no one perfect design for access solutions. Each has some tradeoffs, which you can try to compensate with additional controls like automation, monitoring, regular auditing, etc. The most important thing is to know about those drawbacks and how to deal with them in your specific use case. Plus, you need to understand how your solution for delegated access to your Azure environment fits into the overall security design in your organization.&lt;/p&gt; 
&lt;p&gt;In the next part of this series, there will be some ideas presented on configuring delegated access to client Azure environments with Azure Lighthouse and integrating it with Entra ID PIM for better control access elevation.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;About Atlas Technica&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Atlas Technica was founded in 2016 with two main goals: to provide the best customer service experience possible for their clients, and to use best-in-class public cloud technology to do so. There is a clear need among hedge funds and other alternative investment firms for an IT provider that will put service first. Atlas Technica's mission is to shoulder the burden of IT management, user support, and cybersecurity compliance so you don't have to. Atlas Technica has offices located throughout New York, London, California and Florida. For more information, visit&lt;span&gt; &lt;/span&gt;&lt;a href="https://c212.net/c/link/?t=0&amp;amp;l=en&amp;amp;o=4400486-1&amp;amp;h=3532934033&amp;amp;u=http%3A%2F%2Fwww.atlastechnica.com%2F&amp;amp;a=www.atlastechnica.com"&gt;&lt;strong&gt;www.atlastechnica.com&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;About the Author&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Andrew Matveychuk is a Cloud Solution Architect with 20+ years of experience in the IT industry, focusing on cloud governance, security, cost management, automation, monitoring and other DevOps and SRE practices. He is also an author of one of the top Azure Policy repositories on GitHub and a recognized contributor in Azure Community. Andrew oversees the Cloud Solutions practice at Atlas Technica and helps our clients to design and deploy secure, scalable and efficient cloud solutions. For more details, please check his LinkedIn profile at:&lt;span&gt; &lt;/span&gt;&lt;a href="http://linkedin.com/in/andrewmatveychuk/"&gt;linkedin.com/in/andrewmatveychuk/&lt;/a&gt;&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2Fhow-to-provide-azure-environment-access-to-a-third-party&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Blog</category>
      <pubDate>Fri, 20 Mar 2026 16:34:01 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/how-to-provide-azure-environment-access-to-a-third-party</guid>
      <dc:date>2026-03-20T16:34:01Z</dc:date>
      <dc:creator>Atlas Technica</dc:creator>
    </item>
    <item>
      <title>Stop Paying for Downtime</title>
      <link>https://www.atlastechnica.com/resources/blog/stop-paying-for-downtime</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/stop-paying-for-downtime" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/694a77a2350df0dd93d23d86_stop-paying-for-downtime.jpg" alt="Stop Paying for Downtime" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;h1&gt;&lt;strong&gt;Stop Paying for Downtime: Understanding Serverless Architecture with Azure Functions&lt;/strong&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;em&gt;Does your application code really need to run on a D8_v5 VM when Azure Functions can do it for less?&lt;/em&gt;‍&lt;/p&gt;</description>
      <content:encoded>&lt;h1&gt;&lt;strong&gt;Stop Paying for Downtime: Understanding Serverless Architecture with Azure Functions&lt;/strong&gt;&lt;/h1&gt; 
&lt;p&gt;&lt;em&gt;Does your application code really need to run on a D8_v5 VM when Azure Functions can do it for less?&lt;/em&gt;‍&lt;/p&gt; 
&lt;p&gt;Virtual machines have been the backbone of cloud infrastructure for good reason. They are highly configurable, stable, and reliable, which makes them a strong fit for predictable workloads that need consistent performance and full control over the environment. They also offer a familiar operating model for teams moving from on premises and they support applications that require custom configurations or OS-level access.&lt;/p&gt; 
&lt;p&gt;A tradeoff here is operational drag. VMs must be patched, rebooted, and monitored on a regular cadence, and scaling introduces even more work with scale sets, load balancers, and networking that all need to be designed and maintained. That effort adds up; and it often consumes time that would be better spent on features.&lt;/p&gt; 
&lt;p&gt;There is also an architectural mismatch for modern patterns. Modularity suffers when the default unit of deployment is a long running machine, which can nudge teams toward tightly coupled designs and away from highly modular, event driven, or microservice oriented systems that favor small, rapidly deployable components.&lt;/p&gt; 
&lt;p&gt;Finally, the cost profile can be unforgiving. VMs are easy to overprovision for spikes and then sit idle for long stretches while the meter keeps running, which is especially painful for intermittent or unpredictable workloads. Even when you scale, you often pay with extra capacity or added configuration complexity that increases both spend and overhead.&lt;/p&gt; 
&lt;h2&gt;&lt;strong&gt;Enter Serverless Compute&lt;/strong&gt;&lt;/h2&gt; 
&lt;p&gt;Serverless computing flips the script by removing some of this complexity and introducing three key advantages.&lt;/p&gt; 
&lt;p&gt;First, infrastructure management is abstracted away. You do not patch servers, schedule reboots, or chase OS drift because the platform takes care of it; this frees real time even when you have patching automated.&lt;/p&gt; 
&lt;p&gt;Second, high availability and elastic scaling are built in. Serverless platforms typically run across multiple availability zones by default, so you avoid the heavy lift of designing and maintaining your own availability architecture.&lt;/p&gt; 
&lt;p&gt;Third, cost efficiency. You pay for execution, not idleness, which lets your application scale to zero when there is no work to do and then ramp instantly when demand returns.&lt;/p&gt; 
&lt;h2&gt;&lt;strong&gt;What Are My Options?&lt;/strong&gt;&lt;/h2&gt; 
&lt;p&gt;By now, you are probably wondering what serverless compute services you can leverage to improve operations in your organization. Among the many serverless services available, Azure Functions is Microsoft’s event-driven compute platform. With Azure Functions, you deploy your code and its dependencies, and the platform takes care of the rest. It can handle thousands of concurrent executions out of the box, integrate seamlessly with services like Storage and Event Grid, and will bill only for the compute time used. No more idle boxes eating at your budget.&lt;/p&gt; 
&lt;p&gt;You have options for what kind of Azure Function you deploy, and the right one depends on latency, networking, and scale:&lt;/p&gt; 
&lt;p&gt;On the&lt;span&gt; &lt;/span&gt;&lt;strong&gt;Flex Consumption plan&lt;/strong&gt;, Functions scale horizontally with flexible compute choices, VNET integration, and dynamic scale-out up to 1,000 instances, all without server management.&lt;/p&gt; 
&lt;p&gt;If you need predictable low latency and VNET connectivity, the Premium plan is the sweet spot. Pre-warmed workers eliminate cold starts and give you more powerful instance sizes when your code needs headroom.&lt;/p&gt; 
&lt;p&gt;Already invested in App Service? The Dedicated (App Service) plan runs Functions alongside your web apps at standard App Service rates, which can simplify operations for teams that want reserved capacity.&lt;/p&gt; 
&lt;p&gt;Prefer containers?&lt;span&gt; &lt;/span&gt;&lt;strong&gt;Azure Container Apps&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;can host containerized Function apps for teams that want a fully managed environment utilizing containerization.&lt;/p&gt; 
&lt;p&gt;‍&lt;/p&gt; 
&lt;h2&gt;&lt;strong&gt;When to Choose Azure Functions Over VMs&lt;/strong&gt;&lt;/h2&gt; 
&lt;p&gt;Before diving into where Azure Functions excel, let’s touch on where they might not be the best choice. If your application is built as a tightly coupled monolith, breaking it into discrete serverless functions can be more trouble than it is worth.&lt;/p&gt; 
&lt;p&gt;Latency expectations matter too. On the default serverless plans, cold starts can add noticeable delay to the first request after idle periods. If you require consistent, low-latency responses, use the Premium plan with pre-warmed workers; that removes the cold start latency while keeping the operational model of Functions.&lt;/p&gt; 
&lt;p&gt;Finally, consider your workload’s resource demands. Functions are not designed for heavy compute or large memory footprints, so services with significant resource demands are better suited for virtual machines.&lt;/p&gt; 
&lt;h2&gt;&lt;strong&gt;Where Azure Functions Shine&lt;/strong&gt;&lt;/h2&gt; 
&lt;p&gt;Think event-driven and bursty. Functions are excellent at reacting to things that happen elsewhere: a file lands in Blob Storage, a message hits a queue, an event fires from Event Grid, and your code runs exactly when needed, and then scales to zero when work has been done. If your API traffic is sporadic, that “scale up fast, idle at zero” behavior maps directly to both performance and cost outcomes.&lt;/p&gt; 
&lt;p&gt;Looking for an easy win? Scheduled jobs like nightly cleanups, weekly reports, monthly archiving are low hanging fruit. These do not need a server chugging along for 8,760 hours a year. A timer trigger does the work and hands the rest back to the platform. And for lightweight microservices; image resizing, link previews, notifications. Functions let you ship small, focused code that integrates easily with other managed services.&lt;/p&gt; 
&lt;h2&gt;&lt;strong&gt;Azure Functions in Practice&lt;/strong&gt;&lt;/h2&gt; 
&lt;p&gt;Let’s take that image resizing scenario from earlier and build a simple example to see what using Azure Functions look like in practice. First, let’s develop a use case scenario.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: MediaCorp hosts a social media platform and needs to resize user-uploaded images into multiple resolutions for their platform. Instead of deploying a full VM or containerized service, they opt to use Azure Functions.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;A User uploads an image via the site, which is stored in Azure Blob Storage in a container, images-unprocessed.&lt;/li&gt; 
 &lt;li&gt;An Azure Function is triggered by the blob upload event.&lt;/li&gt; 
 &lt;li&gt;The function uses a small, lightweight image process library to generate resize versions.&lt;/li&gt; 
 &lt;li&gt;The function stores the images in a container, images-processed and updates a Cosmos DB database with the metadata on each derivative (dimensions, format, URL, etc.).&lt;br&gt;&lt;br&gt;Let’s start with some sample code:&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre style="padding-left: 80px;"&gt;import io&lt;br&gt;&lt;br&gt;import os&lt;br&gt;&lt;br&gt;import uuid&lt;br&gt;&lt;br&gt;import logging&lt;br&gt;&lt;br&gt;import json&lt;br&gt;&lt;br&gt;from datetime import&lt;span&gt; &lt;/span&gt;&lt;em&gt;datetime&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;timezone&lt;/em&gt;&lt;br&gt;&lt;br&gt;from typing import&lt;span&gt; &lt;/span&gt;&lt;em&gt;Tuple&lt;/em&gt;&lt;span&gt; &lt;/span&gt; &lt;em&gt;# safer across Python versions&lt;/em&gt;&lt;br&gt;&lt;br&gt;import azure.functions as func&lt;br&gt;&lt;br&gt;from PIL import Image, ImageOps&lt;br&gt;&lt;br&gt;from azure.storage.blob import&lt;span&gt; &lt;/span&gt;&lt;em&gt;BlobServiceClient&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;ContentSettings&lt;/em&gt;&lt;br&gt;&lt;br&gt;from azure.core.exceptions import&lt;span&gt; &lt;/span&gt;&lt;em&gt;ResourceExistsError&lt;/em&gt;&lt;br&gt;&lt;br&gt;from azure.cosmos import&lt;span&gt; &lt;/span&gt;&lt;em&gt;CosmosClient&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;PartitionKey&lt;/em&gt;, exceptions&lt;br&gt;&lt;br&gt;&lt;em&gt;# Load local.settings.json if running locally and not in Azure Functions runtime&lt;/em&gt;&lt;br&gt;&lt;br&gt;if not os.&lt;em&gt;getenv&lt;/em&gt;("FUNCTIONS_WORKER_RUNTIME"):&lt;br&gt;&lt;br&gt;settings_file = os.path.&lt;em&gt;join&lt;/em&gt;(os.path.&lt;em&gt;dirname&lt;/em&gt;(__file__), "local.settings.json")&lt;br&gt;&lt;br&gt;if os.path.&lt;em&gt;exists&lt;/em&gt;(settings_file):&lt;br&gt;&lt;br&gt;with&lt;span&gt; &lt;/span&gt;&lt;em&gt;open&lt;/em&gt;(settings_file) as f:&lt;br&gt;&lt;br&gt;settings = json.&lt;em&gt;load&lt;/em&gt;(f)&lt;br&gt;&lt;br&gt;for key, value in settings.get("Values", {}).items():&lt;br&gt;&lt;br&gt;if key not in os.environ:&lt;br&gt;&lt;br&gt;os.&lt;em&gt;environ&lt;/em&gt;[&lt;em&gt;key&lt;/em&gt;] = value&lt;br&gt;&lt;br&gt;&lt;em&gt;# Environment variables (use getenv to avoid KeyError)&lt;/em&gt;&lt;br&gt;&lt;br&gt;STORAGE_CONN_STRING = os.&lt;em&gt;getenv&lt;/em&gt;("STORAGE_CONN_STRING") or os.&lt;em&gt;getenv&lt;/em&gt;("AzureWebJobsStorage")&lt;br&gt;&lt;br&gt;PROCESSED_CONTAINER = os.&lt;em&gt;getenv&lt;/em&gt;("PROCESSED_CONTAINER", "images-processed")&lt;br&gt;&lt;br&gt;COSMOS_ENDPOINT = os.&lt;em&gt;getenv&lt;/em&gt;("COSMOS_ENDPOINT")&lt;br&gt;&lt;br&gt;COSMOS_KEY = os.&lt;em&gt;getenv&lt;/em&gt;("COSMOS_KEY")&lt;br&gt;&lt;br&gt;COSMOS_DB_NAME = os.&lt;em&gt;getenv&lt;/em&gt;("COSMOS_DB_NAME", "cosmosaemsp")&lt;br&gt;&lt;br&gt;COSMOS_CONTAINER_NAME = os.&lt;em&gt;getenv&lt;/em&gt;("COSMOS_CONTAINER_NAME", "imageDerivatives")&lt;br&gt;&lt;br&gt;SIZES = {&lt;br&gt;&lt;br&gt;"thumb": (150, 150),&lt;br&gt;&lt;br&gt;"medium": (640, 640),&lt;br&gt;&lt;br&gt;"large": (1280, 1280),&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;em&gt;# Fail fast if critical settings are missing&lt;/em&gt;&lt;br&gt;&lt;br&gt;if not STORAGE_CONN_STRING:&lt;br&gt;&lt;br&gt;raise&lt;span&gt; &lt;/span&gt;&lt;em&gt;RuntimeError&lt;/em&gt;("Missing STORAGE_CONN_STRING or AzureWebJobsStorage app setting")&lt;br&gt;&lt;br&gt;if not COSMOS_ENDPOINT or not COSMOS_KEY:&lt;br&gt;&lt;br&gt;raise&lt;span&gt; &lt;/span&gt;&lt;em&gt;RuntimeError&lt;/em&gt;("Missing COSMOS_ENDPOINT or COSMOS_KEY app settings")&lt;br&gt;&lt;br&gt;&lt;em&gt;# Initialize clients&lt;/em&gt;&lt;br&gt;&lt;br&gt;blob_service_client =&lt;span&gt; &lt;/span&gt;&lt;em&gt;BlobServiceClient&lt;/em&gt;.&lt;em&gt;from_connection_string&lt;/em&gt;(STORAGE_CONN_STRING)&lt;br&gt;&lt;br&gt;processed_container_client = blob_service_client.&lt;em&gt;get_container_client&lt;/em&gt;(PROCESSED_CONTAINER)&lt;br&gt;&lt;br&gt;try:&lt;br&gt;&lt;br&gt;processed_container_client.&lt;em&gt;create_container&lt;/em&gt;()&lt;br&gt;&lt;br&gt;except&lt;span&gt; &lt;/span&gt;&lt;em&gt;ResourceExistsError&lt;/em&gt;:&lt;br&gt;&lt;br&gt;pass&lt;br&gt;&lt;br&gt;cosmos_client =&lt;span&gt; &lt;/span&gt;&lt;em&gt;CosmosClient&lt;/em&gt;(COSMOS_ENDPOINT, COSMOS_KEY)&lt;br&gt;&lt;br&gt;cosmos_db = cosmos_client.&lt;em&gt;create_database_if_not_exists&lt;/em&gt;(COSMOS_DB_NAME)&lt;br&gt;&lt;br&gt;cosmos_container = cosmos_db.&lt;em&gt;create_container_if_not_exists&lt;/em&gt;(&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;id&lt;/em&gt;=COSMOS_CONTAINER_NAME,&lt;span&gt; &lt;/span&gt;&lt;em&gt;partition_key&lt;/em&gt;=&lt;em&gt;PartitionKey&lt;/em&gt;(&lt;em&gt;path&lt;/em&gt;="/id")&lt;br&gt;&lt;br&gt;)&lt;br&gt;&lt;br&gt;app = func.&lt;em&gt;FunctionApp&lt;/em&gt;(&lt;em&gt;http_auth_level&lt;/em&gt;=func.&lt;em&gt;AuthLevel&lt;/em&gt;.FUNCTION)&lt;br&gt;&lt;br&gt;def&lt;span&gt; &lt;/span&gt;&lt;em&gt;_normalize_format_and_mode&lt;/em&gt;(&lt;em&gt;img&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;Image&lt;/em&gt;.&lt;em&gt;Image&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;target_ext&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;) -&amp;gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;Tuple&lt;/em&gt;[&lt;em&gt;Image&lt;/em&gt;.&lt;em&gt;Image&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;]:&lt;br&gt;&lt;br&gt;"""&lt;br&gt;&lt;br&gt;Returns (image, format_str, content_type, normalized_ext).&lt;br&gt;&lt;br&gt;"""&lt;br&gt;&lt;br&gt;ext =&lt;span&gt; &lt;/span&gt;&lt;em&gt;target_ext&lt;/em&gt;.&lt;em&gt;lower&lt;/em&gt;().&lt;em&gt;lstrip&lt;/em&gt;(".")&lt;br&gt;&lt;br&gt;if ext in ("jpg", "jpeg"):&lt;br&gt;&lt;br&gt;fmt = "JPEG"&lt;br&gt;&lt;br&gt;content_type = "image/jpeg"&lt;br&gt;&lt;br&gt;if&lt;span&gt; &lt;/span&gt;&lt;em&gt;img&lt;/em&gt;.mode not in ("RGB", "L"):&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;img&lt;/em&gt;&lt;span&gt; &lt;/span&gt;=&lt;span&gt; &lt;/span&gt;&lt;em&gt;img&lt;/em&gt;.&lt;em&gt;convert&lt;/em&gt;("RGB")&lt;br&gt;&lt;br&gt;norm_ext = ".jpg"&lt;br&gt;&lt;br&gt;elif ext == "png":&lt;br&gt;&lt;br&gt;fmt = "PNG"&lt;br&gt;&lt;br&gt;content_type = "image/png"&lt;br&gt;&lt;br&gt;norm_ext = ".png"&lt;br&gt;&lt;br&gt;elif ext == "webp":&lt;br&gt;&lt;br&gt;fmt = "WEBP"&lt;br&gt;&lt;br&gt;content_type = "image/webp"&lt;br&gt;&lt;br&gt;norm_ext = ".webp"&lt;br&gt;&lt;br&gt;else:&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;# Default to source format, else PNG&lt;/em&gt;&lt;br&gt;&lt;br&gt;fmt = (&lt;em&gt;img&lt;/em&gt;.format or "PNG").&lt;em&gt;upper&lt;/em&gt;()&lt;br&gt;&lt;br&gt;if fmt == "JPEG" and&lt;span&gt; &lt;/span&gt;&lt;em&gt;img&lt;/em&gt;.mode not in ("RGB", "L"):&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;img&lt;/em&gt;&lt;span&gt; &lt;/span&gt;=&lt;span&gt; &lt;/span&gt;&lt;em&gt;img&lt;/em&gt;.&lt;em&gt;convert&lt;/em&gt;("RGB")&lt;br&gt;&lt;br&gt;content_type =&lt;span&gt; &lt;/span&gt;&lt;em&gt;f&lt;/em&gt;"image/{fmt.&lt;em&gt;lower&lt;/em&gt;()}" if fmt else "application/octet-stream"&lt;br&gt;&lt;br&gt;norm_ext = ".jpg" if fmt == "JPEG" else ".png"&lt;br&gt;&lt;br&gt;return&lt;span&gt; &lt;/span&gt;&lt;em&gt;img&lt;/em&gt;, fmt, content_type, norm_ext&lt;br&gt;&lt;br&gt;def&lt;span&gt; &lt;/span&gt;&lt;em&gt;_get_base_and_ext&lt;/em&gt;(&lt;em&gt;name&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;) -&amp;gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;tuple&lt;/em&gt;[&lt;em&gt;str&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;]:&lt;br&gt;&lt;br&gt;base = os.path.&lt;em&gt;basename&lt;/em&gt;(&lt;em&gt;name&lt;/em&gt;)&lt;br&gt;&lt;br&gt;if "." in base:&lt;br&gt;&lt;br&gt;stem, ext = base.&lt;em&gt;rsplit&lt;/em&gt;(".", 1)&lt;br&gt;&lt;br&gt;return stem, "." + ext&lt;br&gt;&lt;br&gt;return base, "" &lt;em&gt;# let normalizer set a sane extension&lt;/em&gt;&lt;br&gt;&lt;br&gt;def&lt;span&gt; &lt;/span&gt;&lt;em&gt;_resize_image&lt;/em&gt;(&lt;em&gt;original&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;Image&lt;/em&gt;.&lt;em&gt;Image&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;max_w&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;int&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;max_h&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;int&lt;/em&gt;) -&amp;gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;Image&lt;/em&gt;.&lt;em&gt;Image&lt;/em&gt;:&lt;br&gt;&lt;br&gt;img = ImageOps.&lt;em&gt;exif_transpose&lt;/em&gt;(&lt;em&gt;original&lt;/em&gt;.&lt;em&gt;copy&lt;/em&gt;())&lt;br&gt;&lt;br&gt;img.&lt;em&gt;thumbnail&lt;/em&gt;((&lt;em&gt;max_w&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;max_h&lt;/em&gt;), Image.LANCZOS)&lt;br&gt;&lt;br&gt;return img&lt;br&gt;&lt;br&gt;def&lt;span&gt; &lt;/span&gt;&lt;em&gt;_upload_blob_bytes&lt;/em&gt;(&lt;em&gt;container_name&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;blob_name&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;data&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;bytes&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;content_type&lt;/em&gt;:&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;) -&amp;gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;dict&lt;/em&gt;:&lt;br&gt;&lt;br&gt;blob_client = blob_service_client.&lt;em&gt;get_blob_client&lt;/em&gt;(&lt;em&gt;container&lt;/em&gt;=&lt;em&gt;container_name&lt;/em&gt;,&lt;span&gt; &lt;/span&gt;&lt;em&gt;blob&lt;/em&gt;=&lt;em&gt;blob_name&lt;/em&gt;)&lt;br&gt;&lt;br&gt;blob_client.&lt;em&gt;upload_blob&lt;/em&gt;(&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;data&lt;/em&gt;,&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;overwrite&lt;/em&gt;=True,&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;content_settings&lt;/em&gt;=&lt;em&gt;ContentSettings&lt;/em&gt;(&lt;em&gt;content_type&lt;/em&gt;=&lt;em&gt;content_type&lt;/em&gt;),&lt;br&gt;&lt;br&gt;)&lt;br&gt;&lt;br&gt;props = blob_client.&lt;em&gt;get_blob_properties&lt;/em&gt;()&lt;br&gt;&lt;br&gt;return {&lt;br&gt;&lt;br&gt;"url": blob_client.url,&lt;br&gt;&lt;br&gt;"sizeBytes": props.size,&lt;br&gt;&lt;br&gt;"eTag": props.etag,&lt;br&gt;&lt;br&gt;"lastModified": props.last_modified.&lt;em&gt;isoformat&lt;/em&gt;(),&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;em&gt;@app&lt;/em&gt;.&lt;em&gt;function_name&lt;/em&gt;(&lt;em&gt;name&lt;/em&gt;="image_resizer")&lt;br&gt;&lt;br&gt;&lt;em&gt;@app&lt;/em&gt;.&lt;em&gt;blob_trigger&lt;/em&gt;(&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;arg_name&lt;/em&gt;="input_blob",&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;path&lt;/em&gt;="images-unprocessed/{name}",&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;connection&lt;/em&gt;="STORAGE_CONN_STRING",&lt;br&gt;&lt;br&gt;)&lt;br&gt;&lt;br&gt;def&lt;span&gt; &lt;/span&gt;&lt;em&gt;image_resizer&lt;/em&gt;(&lt;em&gt;input_blob&lt;/em&gt;: func.&lt;em&gt;InputStream&lt;/em&gt;) -&amp;gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;None&lt;/em&gt;:&lt;br&gt;&lt;br&gt;name =&lt;span&gt; &lt;/span&gt;&lt;em&gt;input_blob&lt;/em&gt;.name.&lt;em&gt;split&lt;/em&gt;('/')[-1] &lt;em&gt;# Extract filename from blob path&lt;/em&gt;&lt;br&gt;&lt;br&gt;logger = logging.&lt;em&gt;getLogger&lt;/em&gt;("image_resizer")&lt;br&gt;&lt;br&gt;logger.&lt;em&gt;info&lt;/em&gt;("Triggered for blob: %s (size: %s bytes)",&lt;span&gt; &lt;/span&gt;&lt;em&gt;input_blob&lt;/em&gt;.name,&lt;span&gt; &lt;/span&gt;&lt;em&gt;input_blob&lt;/em&gt;.length)&lt;br&gt;&lt;br&gt;try:&lt;br&gt;&lt;br&gt;data =&lt;span&gt; &lt;/span&gt;&lt;em&gt;input_blob&lt;/em&gt;.&lt;em&gt;read&lt;/em&gt;()&lt;br&gt;&lt;br&gt;img = Image.&lt;em&gt;open&lt;/em&gt;(io.&lt;em&gt;BytesIO&lt;/em&gt;(data))&lt;br&gt;&lt;br&gt;except&lt;span&gt; &lt;/span&gt;&lt;em&gt;Exception&lt;/em&gt;&lt;span&gt; &lt;/span&gt;as e:&lt;br&gt;&lt;br&gt;logger.&lt;em&gt;exception&lt;/em&gt;("Failed to open image: %s", e)&lt;br&gt;&lt;br&gt;return&lt;br&gt;&lt;br&gt;original_format = (img.format or "").&lt;em&gt;upper&lt;/em&gt;()&lt;br&gt;&lt;br&gt;source_ct =&lt;span&gt; &lt;/span&gt;&lt;em&gt;f&lt;/em&gt;"image/{original_format.&lt;em&gt;lower&lt;/em&gt;()}" if original_format else "application/octet-stream"&lt;br&gt;&lt;br&gt;stem, ext =&lt;span&gt; &lt;/span&gt;&lt;em&gt;_get_base_and_ext&lt;/em&gt;(name)&lt;br&gt;&lt;br&gt;doc_id =&lt;span&gt; &lt;/span&gt;&lt;em&gt;str&lt;/em&gt;(uuid.&lt;em&gt;uuid4&lt;/em&gt;())&lt;br&gt;&lt;br&gt;now =&lt;span&gt; &lt;/span&gt;&lt;em&gt;datetime&lt;/em&gt;.&lt;em&gt;now&lt;/em&gt;(&lt;em&gt;timezone&lt;/em&gt;.utc).&lt;em&gt;isoformat&lt;/em&gt;()&lt;br&gt;&lt;br&gt;result_doc = {&lt;br&gt;&lt;br&gt;"id": doc_id,&lt;br&gt;&lt;br&gt;"sourceBlobName": name,&lt;br&gt;&lt;br&gt;"sourceLength":&lt;span&gt; &lt;/span&gt;&lt;em&gt;input_blob&lt;/em&gt;.length,&lt;br&gt;&lt;br&gt;"sourceFormat": original_format or "UNKNOWN",&lt;br&gt;&lt;br&gt;"sourceContentType": source_ct,&lt;br&gt;&lt;br&gt;"createdAt": now,&lt;br&gt;&lt;br&gt;"variants": [],&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;for label, (max_w, max_h) in SIZES.&lt;em&gt;items&lt;/em&gt;():&lt;br&gt;&lt;br&gt;try:&lt;br&gt;&lt;br&gt;resized =&lt;span&gt; &lt;/span&gt;&lt;em&gt;_resize_image&lt;/em&gt;(img, max_w, max_h)&lt;br&gt;&lt;br&gt;out_img, fmt, ct, norm_ext =&lt;span&gt; &lt;/span&gt;&lt;em&gt;_normalize_format_and_mode&lt;/em&gt;(resized, ext or ".png")&lt;br&gt;&lt;br&gt;out_bytes = io.&lt;em&gt;BytesIO&lt;/em&gt;()&lt;br&gt;&lt;br&gt;save_kwargs = {}&lt;br&gt;&lt;br&gt;if fmt == "JPEG":&lt;br&gt;&lt;br&gt;save_kwargs.&lt;em&gt;update&lt;/em&gt;(&lt;em&gt;quality&lt;/em&gt;=90,&lt;span&gt; &lt;/span&gt;&lt;em&gt;optimize&lt;/em&gt;=True)&lt;br&gt;&lt;br&gt;elif fmt == "WEBP":&lt;br&gt;&lt;br&gt;save_kwargs.&lt;em&gt;update&lt;/em&gt;(&lt;em&gt;quality&lt;/em&gt;=80,&lt;span&gt; &lt;/span&gt;&lt;em&gt;method&lt;/em&gt;=6)&lt;br&gt;&lt;br&gt;out_img.&lt;em&gt;save&lt;/em&gt;(out_bytes, fmt, **save_kwargs)&lt;br&gt;&lt;br&gt;out_bytes.&lt;em&gt;seek&lt;/em&gt;(0)&lt;br&gt;&lt;br&gt;out_blob_name =&lt;span&gt; &lt;/span&gt;&lt;em&gt;f&lt;/em&gt;"{stem}_{label}{norm_ext}"&lt;br&gt;&lt;br&gt;upload_info =&lt;span&gt; &lt;/span&gt;&lt;em&gt;_upload_blob_bytes&lt;/em&gt;(&lt;br&gt;&lt;br&gt;PROCESSED_CONTAINER, out_blob_name, out_bytes.&lt;em&gt;getvalue&lt;/em&gt;(), ct&lt;br&gt;&lt;br&gt;)&lt;br&gt;&lt;br&gt;&lt;span&gt; &lt;/span&gt;&lt;em&gt;result_doc&lt;/em&gt;["&lt;em&gt;variants&lt;/em&gt;"].append({&lt;br&gt;&lt;br&gt;"label": label,&lt;br&gt;&lt;br&gt;"width": out_img.width,&lt;br&gt;&lt;br&gt;"height": out_img.height,&lt;br&gt;&lt;br&gt;"contentType": ct,&lt;br&gt;&lt;br&gt;"format": fmt,&lt;br&gt;&lt;br&gt;"blobName": out_blob_name,&lt;br&gt;&lt;br&gt;"url":&lt;span&gt; &lt;/span&gt;&lt;em&gt;upload_info&lt;/em&gt;["&lt;em&gt;url&lt;/em&gt;"],&lt;br&gt;&lt;br&gt;"sizeBytes":&lt;span&gt; &lt;/span&gt;&lt;em&gt;upload_info&lt;/em&gt;["&lt;em&gt;sizeBytes&lt;/em&gt;"],&lt;br&gt;&lt;br&gt;"eTag":&lt;span&gt; &lt;/span&gt;&lt;em&gt;upload_info&lt;/em&gt;["&lt;em&gt;eTag&lt;/em&gt;"],&lt;br&gt;&lt;br&gt;"lastModified":&lt;span&gt; &lt;/span&gt;&lt;em&gt;upload_info&lt;/em&gt;["&lt;em&gt;lastModified&lt;/em&gt;"],&lt;br&gt;&lt;br&gt;"createdAt": now,&lt;br&gt;&lt;br&gt;})&lt;br&gt;&lt;br&gt;logger.&lt;em&gt;info&lt;/em&gt;("Uploaded variant %s -&amp;gt; %s", label,&lt;span&gt; &lt;/span&gt;&lt;em&gt;upload_info&lt;/em&gt;["&lt;em&gt;url&lt;/em&gt;"])&lt;br&gt;&lt;br&gt;except&lt;span&gt; &lt;/span&gt;&lt;em&gt;Exception&lt;/em&gt;&lt;span&gt; &lt;/span&gt;as e:&lt;br&gt;&lt;br&gt;logger.&lt;em&gt;exception&lt;/em&gt;("Failed to process/upload variant '%s': %s", label, e)&lt;br&gt;&lt;br&gt;try:&lt;br&gt;&lt;br&gt;cosmos_container.&lt;em&gt;upsert_item&lt;/em&gt;(result_doc)&lt;br&gt;&lt;br&gt;logger.&lt;em&gt;info&lt;/em&gt;("Upserted Cosmos DB doc id: %s with %d variants", doc_id,&lt;span&gt; &lt;/span&gt;&lt;em&gt;len&lt;/em&gt;(&lt;em&gt;result_doc&lt;/em&gt;["&lt;em&gt;variants&lt;/em&gt;"]))&lt;br&gt;&lt;br&gt;except exceptions.&lt;em&gt;CosmosHttpResponseError&lt;/em&gt;&lt;span&gt; &lt;/span&gt;as e:&lt;br&gt;&lt;br&gt;logger.&lt;em&gt;exception&lt;/em&gt;("Cosmos DB upsert failed: %s", e)&lt;/pre&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;Notice the @app.blob_trigger decorator. This decorator allows the function to run when a blob upload has completed.&lt;br&gt;&lt;br&gt;&lt;/p&gt; 
&lt;p&gt;Now let’s get started with deploying our function app. Our prerequisites are python, a code editor and Azure Functions Core Tools.&lt;/p&gt; 
&lt;p&gt;Let’s first define some variables:&lt;/p&gt; 
&lt;pre style="padding-left: 80px;"&gt;export LOCATION="eastus"&lt;br&gt;&lt;br&gt;export RG="rg-mediacorp-img" # Keep names lowercase; storage must be &amp;lt;=24 chars, letters+digits only&lt;br&gt;&lt;br&gt;export RND=$(printf "%05d" $RANDOM)&lt;br&gt;&lt;br&gt;export STORAGE="stmediacorp${RND}"&lt;br&gt;&lt;br&gt;export FUNC="func-mediacorp-img-${RND}"&lt;br&gt;&lt;br&gt;export COSMOS="cosmos-mediacorp-${RND}"&lt;br&gt;&lt;br&gt;export DB="MediaCorp"&lt;br&gt;&lt;br&gt;export COLL="Images"&lt;br&gt;&lt;br&gt;RG=rg-mediacorp-img&lt;br&gt;&lt;br&gt;LOCATION=eastus&lt;br&gt;&lt;br&gt;STORAGE=stmediacorp$RANDOM # Needs to be globally unique, lowercase, &amp;lt;=24 chars&lt;br&gt;&lt;br&gt;FUNC=func-mediacorp-img-$RANDOM # Needs to be globally unique&lt;br&gt;&lt;br&gt;COSMOS=cosmos-mediacorp-$RANDOM #Needs to be globally unique&lt;br&gt;&lt;br&gt;DB=MediaCorp&lt;br&gt;&lt;br&gt;COLL=Images&lt;br&gt;&lt;br&gt;Then we can create our resource group:&lt;br&gt;&lt;br&gt;az group create -n "$RG" -l "$LOCATION"&lt;br&gt;&lt;br&gt;With our resource group created, let’s start deploying some of the resources:&lt;br&gt;&lt;br&gt;az storage account create -g "$RG" -n "$STORAGE" -l "$LOCATION" --sku Standard_LRS --kind StorageV2 # Create ingress/egress containers (requires data-plane RBAC like “Storage Blob Data Contributor”)&lt;br&gt;&lt;br&gt;# Get storage connection string for data-plane operations STORAGE_CONN=$(az storage account show-connection-string -g "$RG" -n "$STORAGE" --query connectionString -o tsv)&lt;br&gt;&lt;br&gt;# Create ingress/egress containers using the connection string (no RBAC needed) az storage container create --name images-unprocessed --connection-string "$STORAGE_CONN" &amp;gt;/dev/null az storage container create --name images-processed --connection-string "$STORAGE_CONN" &amp;gt;/dev/null&lt;br&gt;&lt;br&gt;# Database and container (partition key = /id to match your documents) az cosmosdb sql database create -g "$RG" -a "$COSMOS" -n "$DB" &amp;gt;/dev/null az cosmosdb sql container create -g "$RG" -a "$COSMOS" -d "$DB" -n "$COLL" \ --partition-key-path "/id" \ --throughput 400 &amp;gt;/dev/null az cosmosdb sql container create \ -g $RG -a $COSMOS -d $DB -n $COLL \ --partition-key-path "/originalFile" \ --throughput 400 # Get Cosmos connection string for app settings&lt;br&gt;&lt;br&gt;Endpoint and key for app settings COSMOS_ENDPOINT=$(az cosmosdb show --name "$COSMOS" --resource-group "$RG" --query documentEndpoint -o tsv) COSMOS_KEY=$(az cosmosdb keys list --name "$COSMOS" --resource-group "$RG" --query primaryMasterKey -o tsv)&lt;/pre&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;With the prep work finished, let’s finally deploy our function app with the below command:&lt;/p&gt; 
&lt;pre style="padding-left: 80px;"&gt;az functionapp create \ --resource-group "$RG" \ --consumption-plan-location "$LOCATION" \ --runtime python --runtime-version 3.12 \ --functions-version 4 \ --name "$FUNC" \ --storage-account "$STORAGE"&lt;/pre&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;We can configure app settings for the function app like so:&lt;/p&gt; 
&lt;pre style="padding-left: 80px;"&gt;az functionapp config appsettings set -g "$RG" -n "$FUNC" --settings \ AzureWebJobsStorage="$STORAGE_CONN" \ STORAGE_CONN_STRING="$STORAGE_CONN" \ PROCESSED_CONTAINER="images-processed" \ COSMOS_ENDPOINT="$COSMOS_ENDPOINT" \ COSMOS_KEY="$COSMOS_KEY" \ COSMOS_DB_NAME="$DB" \ COSMOS_CONTAINER_NAME="$COLL" \ FUNCTIONS_WORKER_RUNTIME="python" \ AzureFunctionsJobHost__logging__logLevel__Default="Information" &amp;gt;/dev/null&lt;/pre&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;Finally, let’s publish our function app.&lt;/p&gt; 
&lt;pre style="padding-left: 80px;"&gt;func azure functionapp publish "$FUNC" --python --build remote&lt;br&gt;&lt;br&gt;Now that we’ve published our function, let’s give it a whirl. We can start by uploading a file to blob storage to trigger the function.&lt;br&gt;&lt;br&gt;az storage blob upload \ --account-name &amp;lt;storage&amp;gt; \ --container-name images-unprocessed \ --name sample.jpg \ --file ./sample.jpg \ --auth-mode login&lt;/pre&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt; 
&lt;p&gt;Within a few seconds, we should see our function fire and the resized files in the images-processed container should finish uploading:&lt;/p&gt; 
&lt;p&gt;‍&lt;/p&gt;  
&lt;div&gt;
 &lt;img src="https://cdn.prod.website-files.com/6544abd51937087906103af9/694a72729dfea0a151f7b271_code.png" style="vertical-align: middle; width: 564px;"&gt;
&lt;/div&gt;  
&lt;p&gt;‍&lt;/p&gt; 
&lt;h2&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h2&gt; 
&lt;p&gt;Moving targeted workloads to Azure Functions lets you stop paying for idle capacity while gaining elasticity, simpler operations, and a cleaner path to modular, eventdriven design. For bursty APIs, scheduled jobs, and filedriven pipelines like the image resizing example, serverless compute delivers the right resources at the right time and zero when there is nothing to do. Our recommendation is to start with a low risk candidate, deploy on the Consumption plan, instrument with Application Insights, and measure before/after cost and latency. If you need consistent low latency or private networking, shift to the Premium plan with prewarmed instances. The result is the same: fewer servers to manage, faster delivery, and a bill that reflects execution, not downtime.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2Fstop-paying-for-downtime&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Blog</category>
      <pubDate>Fri, 20 Mar 2026 16:31:17 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/stop-paying-for-downtime</guid>
      <dc:date>2026-03-20T16:31:17Z</dc:date>
      <dc:creator>Shaiyan Mhamud</dc:creator>
    </item>
    <item>
      <title>Remote Desktop: Azure Virtual Desktop vs. Win365\Cloud PC</title>
      <link>https://www.atlastechnica.com/resources/blog/remote-desktop-azure-virtual-desktop-vs.-win365cloud-pc</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/remote-desktop-azure-virtual-desktop-vs.-win365cloud-pc" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/694a691b798e3e94feb5f121_remote-desktop.jpg" alt="Remote Desktop: Azure Virtual Desktop vs. Win365\Cloud PC" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;h2&gt;Overview&lt;/h2&gt; 
&lt;p&gt;IT leaders face a challenge today. Work from home adds flexibility to end-user, but challenges to IT staff trying to project company data. How do we deliver a secure, managed windows desktop environment or access to company apps to a distributed workforce? Microsoft offers two services that, on paper, seem very similar. The decision then comes down to your workforce. Think about work rhythms, onboarding speed, the need for persistence, and how predictable you want costs to be.&lt;/p&gt;</description>
      <content:encoded>&lt;h2&gt;Overview&lt;/h2&gt; 
&lt;p&gt;IT leaders face a challenge today. Work from home adds flexibility to end-user, but challenges to IT staff trying to project company data. How do we deliver a secure, managed windows desktop environment or access to company apps to a distributed workforce? Microsoft offers two services that, on paper, seem very similar. The decision then comes down to your workforce. Think about work rhythms, onboarding speed, the need for persistence, and how predictable you want costs to be.&lt;/p&gt; 
&lt;h2&gt;What You’ll Learn&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;The core differences between AVD and Windows 365&lt;/li&gt; 
 &lt;li&gt;How to choose based on usage patterns, cost predictability, and operational model&lt;/li&gt; 
 &lt;li&gt;When a blended portfolio is the best answer&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Concept Overview&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Windows 365&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;provides dedicated, persistent 1:1 Cloud PCs delivered as a peruser subscription, managed like corporate devices via Intune, with predictable monthly costs and a stable user environment.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Azure Virtual Desktop (AVD)&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;is a virtualization service in Azure that provides pooled, multisession Windows, and apponly delivery via RemoteApp. AVD can present full desktops or just applications; and supports autoscaling and pooled capacity to reduce costs while maintaining the experience for users.&lt;/p&gt; 
&lt;h2&gt;Decision Guide&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;When Windows 365 Fits Best&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Your users are steady, deskbound knowledge workers who benefit from a personal, persistent desktop and a stable configuration.&lt;/li&gt; 
 &lt;li&gt;You want clear, peruser, permonth pricing tied to chosen vCPU/RAM/storage.&lt;/li&gt; 
 &lt;li&gt;Device management should mirror standard endpoint patterns (Intune compliance, baselines, and apps), with minimal variability month to month.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;When AVD Fits Best&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Your workforce is elastic: contractors, external developers, interns, or teams with spiky demand over days or weeks.&lt;/li&gt; 
 &lt;li&gt;You want pooled capacity with Windows multisession to improve density, reduce peruser cost, and scale up/down by schedule or demand.&lt;/li&gt; 
 &lt;li&gt;You prefer apponly delivery for line of business applications, keeping user experience focused and admin overhead lower.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;Cost and Operations: Predictability vs. Elasticity&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Windows 365 emphasizes peruser cost predictability and operational simplicity, ideal when headcount and usage are steady.&lt;/li&gt; 
 &lt;li&gt;AVD emphasizes elasticity and pooled efficiency. Combining windows multi-session with auto-scaling allows for performance requirements to ebb and flow with your team’s needs.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;strong&gt;EndUser Experience&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;The client surface is converging. Users connect via the Windows App or a browser, so daily experience is consistent whether landing on a dedicated Cloud PC or a pooled session.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;When to Blend Both&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Many organizations use both: Windows 365 for steady, individualized desktops and AVD for the external contractors who need intermittent access. This portfolio approach maps services to realworld patterns, keeping experience consistent at the edge while optimizing cost and agility behind the scenes.&lt;/p&gt; 
&lt;h2&gt;Atlas Angle: How We implement and Support&lt;/h2&gt; 
&lt;p&gt;Atlas standardizes both models, working with your team to ensure secure and compliant operations. Our tried-and-true reference architecture allows us to deploy either service into your existing infrastructure as a complete product. We manage identity, network, storage, backup, and autoscaling for you. Our team of cloud experts will guide you through service role-out and support any on-going issues. Contact us today for more information.&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2Fremote-desktop-azure-virtual-desktop-vs.-win365cloud-pc&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Blog</category>
      <pubDate>Fri, 13 Mar 2026 00:46:19 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/remote-desktop-azure-virtual-desktop-vs.-win365cloud-pc</guid>
      <dc:date>2026-03-13T00:46:19Z</dc:date>
      <dc:creator>Jackson Roberts</dc:creator>
    </item>
    <item>
      <title>Mobile Device Management: Securing corporate mobile devices with Microsoft Intune</title>
      <link>https://www.atlastechnica.com/resources/blog/mobile-device-management-securing-corporate-mobile-devices-with-microsoft-intune</link>
      <description>&lt;div class="hs-featured-image-wrapper"&gt; 
 &lt;a href="https://www.atlastechnica.com/resources/blog/mobile-device-management-securing-corporate-mobile-devices-with-microsoft-intune" title="" class="hs-featured-image-link"&gt; &lt;img src="https://www.atlastechnica.com/hubfs/694a6f25eddc374924ab180c_mobile-device-management.jpg" alt="Mobile Device Management: Securing corporate mobile devices with Microsoft Intune" class="hs-featured-image" style="width:auto !important; max-width:50%; float:left; margin:0 15px 15px 0;"&gt; &lt;/a&gt; 
&lt;/div&gt; 
&lt;p&gt;Keeping company data safe on phones and tablets doesn’t have to be a headache. Mobile Device Management (MDM) is how organizations set basic safety rules for devices (think: screen lock, encryption, updates) and keep access to work apps in check. Microsoft Intune is Microsoft’s cloud service that delivers MDM (and app-level protection) across iOS/iPadOS, Android, Windows, and macOS. In this post we’ll explain what Intune can manage on corporate devices, a little bit on how it works behind the scenes, which options to choose for different scenarios, and a review an example of a rollout plan so users stay productive while your data stays protected.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Keeping company data safe on phones and tablets doesn’t have to be a headache. Mobile Device Management (MDM) is how organizations set basic safety rules for devices (think: screen lock, encryption, updates) and keep access to work apps in check. Microsoft Intune is Microsoft’s cloud service that delivers MDM (and app-level protection) across iOS/iPadOS, Android, Windows, and macOS. In this post we’ll explain what Intune can manage on corporate devices, a little bit on how it works behind the scenes, which options to choose for different scenarios, and a review an example of a rollout plan so users stay productive while your data stays protected.&lt;/p&gt; 
&lt;h2&gt;What is MDM and why should I care?&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Mobile Device Management (MDM)&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;is a set of tools and rules applied to the device itself. You can enforce a passcode, passcode complexity, encrypt storage, push Wi‑Fi/VPN settings, deploy apps, and remotely wipe corporate data from a lost device or, in the case of corporate devices, wipe the device completely.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Microsoft Intune&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;is Microsoft’s cloud platform for managing those devices at scale. Because it’s part of Microsoft 365, you can combine device health checks with&lt;span&gt; &lt;/span&gt;&lt;em&gt;Conditional Access&lt;/em&gt;&lt;span&gt; &lt;/span&gt;so only healthy, compliant devices can reach email, Teams, OneDrive, and other work resources.&lt;/p&gt;  
&lt;div style="color: rgba(0, 0, 0, 0);"&gt;
 &lt;img src="https://cdn.prod.website-files.com/6544abd51937087906103af9/694a6deaf8f69af88bfddce1_Mobile_Device_Access.png" style="vertical-align: middle; width: 564px;"&gt;
&lt;/div&gt;  
&lt;h2 style="line-height: 36px;"&gt;&lt;strong&gt;What can IT control with Intune?&lt;/strong&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Enrollment&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;To become managed, a device first needs to be enrolled into Intune. This process is straightforward, and users can self-enroll, provided basic instructions. Users download an app and simply sign in with their work account to enroll their devices through the Company Portal (or built-in flows on Windows/macOS).&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Compliance policies&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;These are the standards a device must meet to be considered safe. If a device falls out of compliance, Intune can flag it and limit access until it’s fixed. You can specify a sizeable number of configuration items to check, but among the basic items onboard a phone or tablet which are checked for compliance are: passcode/biometric standards, auto‑lock, minimum OS/security patch levels, jailbreak or root detection\prevention, and whether your device is data-encrypted or has other core protections.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Configuration profiles&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Think of these as templates that preconfigure devices so users don’t have to. You push the right settings once, and everyone gets them automatically. Things such as Wi‑Fi and VPN profiles, Email profiles and certificates, device restrictions, developer options, etc. can be “canned” as a configuration set and applied automatically to devices.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;App management&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;IT can centrally install, update, and remove apps so people get what they need without hunting through app stores or calling support. Among the management functions included with Intune is the ability to deploy/retire store apps, line‑of‑business apps, and web apps. You can control update cadence and app versions, and on Android, use a Work Profile to provide “corporate versions” of work apps, while keeping the personal apps separate.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Conditional Access&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;This feature checks the device’s health and identity signals before letting it gain access to Microsoft 365 and company data. This is the gatekeeper which allows access to Microsoft 365 only from compliant devices, or blocks devices that are out of date, risky, or unmanaged.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Remote actions &lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;If a device is lost, stolen, or being repurposed, you can act quickly to protect company data—no need to physically touch the device. There are differing levels of management depending on whether your devices was issued by your company, or if your device is a personal device. You can perform a full wipe (factory reset) for lost/stolen devices with corporate managed devices. For BYOD, you can perform a selective wipe to remove corporate data and apps only, while leaving personal data fully untouched and intact.&lt;/p&gt; 
&lt;h2 style="line-height: 36px;"&gt;Rolling Out Device Management&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Start with a pilot&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;Begin with a small pilot group to validate the enrollment process and confirm device readiness. Test critical functions like email and app deployment to ensure smooth operation. Use pilot feedback to refine policies before scaling to the wider organization.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Define Compliance Early&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Establish clear baseline requirements such as minimum OS version, passcode strength, and encryption. Include jailbreak/root detection to prevent compromised devices from accessing corporate resources. Document compliance standards upfront so users and IT staff know expectations from day one.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Staged Configuration&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;The first phase of your rollout should focus on baseline security controls and deployment of required core applications. Once these basics are in place, you can introduce Conditional Access, starting in “reportonly” mode before enforcing policies. Finally, once all devices are brought into compliance, all controls can be enforced.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Monitor and Tune&lt;/strong&gt;&lt;/p&gt; 
&lt;p&gt;Continuously track noncompliant devices and investigate failed enrollment attempts. Review app installation success rates and measure user impact to identify friction points. Adjust policies iteratively to balance strong security with a seamless user experience.&lt;/p&gt; 
&lt;h2 style="line-height: 36px;"&gt;What about privacy?&lt;/h2&gt; 
&lt;p&gt;On corporate owned devices, use is typically governed by appropriate computer use policies, and personal use of corporate devices should be limited and restricted, or altogether eliminated, as your company can seize or wipe your device at any time. On BYOD&lt;span&gt; &lt;/span&gt;devices, it’s critical to be transparent about what IT can and cannot see. IT doesn’t “take over” your personal device, rather IT typically sees device model, OS, compliance state, and installed corporate apps and corporate data only—not personal photos, messages, personal emails, or personal app contents. For a more detailed review, please see Microsoft’s official guidance: What info can your organization see when you enroll your device? - Microsoft Intune | Microsoft Learn&lt;/p&gt; 
&lt;h2 style="line-height: 36px;"&gt;The takeaway&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Microsoft Intune&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;gives you the levers to secure corporate mobile devices end‑to‑end: automated enrollment, strong baselines, smart access controls, and fast remote actions when things go wrong. And deployment of Intune is relatively straightforward; start small, lock in your compliance rules, then turn on Conditional Access—your users stay productive while your data stays protected.&lt;/p&gt; 
&lt;h2 style="line-height: 36px;"&gt;FAQ&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Do we need MDM if we already protect apps?&lt;/strong&gt;&lt;br&gt;Yes.&lt;span&gt; &lt;/span&gt;&lt;strong&gt;MDM&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;manages the device (updates, Wi‑Fi, certificates, wipe).&lt;span&gt; &lt;/span&gt;&lt;strong&gt;MAM&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;(app protection) manages the app’s data. Corporate devices benefit from both.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Can users keep personal apps on corporate phones?&lt;/strong&gt;&lt;br&gt;Yes, if you allow it. Android separates work and personal. iOS supervised devices can still allow personal use while protecting data.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;What happens when someone leaves?&lt;/strong&gt;&lt;br&gt;Either factory‑reset the device or do a selective wipe of corporate data, depending on ownership and policy.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Will this slow people down?&lt;/strong&gt;&lt;br&gt;Not if you stage the rollout and keep rules reasonable—biometrics allowed, required apps preinstalled, and clear guidance for users.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Why can’t I access company data without Intune on my device?&lt;/strong&gt;&lt;br&gt;One of the biggest benefits of using Intune is to enable convenient and secure access to corporate data on mobile devices, and to prevent unrestricted access. Your organization’s security policies ultimately dictate the terms of access.&lt;/p&gt; 
&lt;p&gt;‍&lt;/p&gt;  
&lt;img src="https://track.hubspot.com/__ptq.gif?a=49587302&amp;amp;k=14&amp;amp;r=https%3A%2F%2Fwww.atlastechnica.com%2Fresources%2Fblog%2Fmobile-device-management-securing-corporate-mobile-devices-with-microsoft-intune&amp;amp;bu=https%253A%252F%252Fwww.atlastechnica.com%252Fresources%252Fblog&amp;amp;bvt=rss" alt="" width="1" height="1" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important; "&gt;</content:encoded>
      <category>Blog</category>
      <pubDate>Fri, 13 Mar 2026 00:39:41 GMT</pubDate>
      <guid>https://www.atlastechnica.com/resources/blog/mobile-device-management-securing-corporate-mobile-devices-with-microsoft-intune</guid>
      <dc:date>2026-03-13T00:39:41Z</dc:date>
      <dc:creator>Michael Strong</dc:creator>
    </item>
  </channel>
</rss>
