<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dinesh Palli</title>
    <description>The latest articles on DEV Community by Dinesh Palli (@wildneutron).</description>
    <link>https://dev.to/wildneutron</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2354534%2F1bdd08b8-20d2-485e-bea8-06235ff665f5.jpeg</url>
      <title>DEV Community: Dinesh Palli</title>
      <link>https://dev.to/wildneutron</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wildneutron"/>
    <language>en</language>
    <item>
      <title>StrataScratch's Advanced 25 Hard SQL Questions</title>
      <dc:creator>Dinesh Palli</dc:creator>
      <pubDate>Mon, 23 Jun 2025 23:46:46 +0000</pubDate>
      <link>https://dev.to/wildneutron/stratascratchs-25-advanced-hard-sql-questions-1o50</link>
      <guid>https://dev.to/wildneutron/stratascratchs-25-advanced-hard-sql-questions-1o50</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlydgiz6yo445o4lajb9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlydgiz6yo445o4lajb9.png" alt="Screenshot of a Notion page titled ‘StrataScratch’s Advanced SQL 25 Questions,’ featuring a database table with details such as question IDs, titles (Example: ‘Top Percentile Fraud’), associated companies (Example: Google, Netflix etc.,), links, and brief descriptions of SQL problems. The page header prominently includes a MySQL logo." width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Excited to share that I've just finished &lt;a href="https://platform.stratascratch.com/coding?utm_source=newsletter&amp;amp;utm_medium=click&amp;amp;utm_campaign=050625+curated+lists+and+meta+algorithm+question&amp;amp;curated_topics=16&amp;amp;code_type=3&amp;amp;page_size=50" rel="noopener noreferrer"&gt;StrataScratch's Advanced SQL 25 Questions&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;This was a challenging but rewarding experience that pushed my analytical and problem-solving skills to the next level. The journey was a marathon, not a sprint, but the learnings have been invaluable.&lt;/p&gt;

&lt;p&gt;I tracked my progress in a &lt;a href="https://www.notion.so/dineshreddypalli/stratascratch-s-25-Advanced-SQL-Questions-20e3cb984b6980ce8d88e10d880af9b1?source=copy_link" rel="noopener noreferrer"&gt;Notion database&lt;/a&gt;, which includes the questions, the companies they came from, and my solutions. If you'd like to try it yourself, I've set it up as a template you can duplicate. Just let me know in this post's comments, and I'll provide you with the link.&lt;/p&gt;

&lt;p&gt;A huge shout-out to &lt;a href="https://www.linkedin.com/in/frederikmueller/" rel="noopener noreferrer"&gt;Frederik Müller&lt;/a&gt; for the inspiration. While I didn't watch &lt;a href="https://www.youtube.com/@frederikmuller" rel="noopener noreferrer"&gt;his video&lt;/a&gt;, &lt;a href="https://www.linkedin.com/posts/frederikmueller_stratascratch-came-up-with-a-list-of-25-%F0%9D%90%A1%F0%9D%90%9A%F0%9D%90%AB%F0%9D%90%9D-activity-7335957239943364608-7vcU?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAABtfn7IBvP-I7xTwrT4Otmr20iqXbNykMfg" rel="noopener noreferrer"&gt;his post&lt;/a&gt; was the catalyst that got me started on this path, so thank you for the inspiration that encouraged me to push my limits. Ofc, also to &lt;a href="https://www.linkedin.com/company/stratascratch/" rel="noopener noreferrer"&gt;Stratascratch&lt;/a&gt; for the wonderful resource!&lt;/p&gt;

&lt;p&gt;Some of my key learnings from this challenge include a deeper understanding of advanced window functions, recursion, complex joins, and query optimization. I'm always looking to learn and grow in the data space, and this was a fantastic way to do it.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>stratascratch</category>
      <category>datascience</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Check24 Junior Analyst Interview &amp; A/B Testing</title>
      <dc:creator>Dinesh Palli</dc:creator>
      <pubDate>Mon, 23 Jun 2025 23:42:10 +0000</pubDate>
      <link>https://dev.to/wildneutron/check24-junior-analyst-interview-ab-testing-3ak6</link>
      <guid>https://dev.to/wildneutron/check24-junior-analyst-interview-ab-testing-3ak6</guid>
      <description>&lt;p&gt;Five weeks ago, I had an interview at CHECK24 Vergleichsportal GmbH for a Junior Analyst role (&lt;a href="https://lnkd.in/eAFqHKbu" rel="noopener noreferrer"&gt;https://lnkd.in/eAFqHKbu&lt;/a&gt;). I was asked a fantastic, in-depth A/B testing question:&lt;br&gt;
"Imagine running an email campaign with a 3% discount. How do you know if it's worth it? How do you design the test, determine the sample size, and decide on the duration?"&lt;/p&gt;

&lt;p&gt;The question inspired me to go deep and create the ultimate A/B testing guide for myself. It covers everything from initial ideation (Phase 0) to analyzing results, including a detailed answer to the exact question I was asked.&lt;/p&gt;

&lt;p&gt;I believe in learning in public, so I'm sharing my comprehensive notes with all of you. You'll find a complete framework, common "gotchas", and the key differences between classic NHST and decision-theory.&lt;/p&gt;

&lt;p&gt;Find the full guide attached as a PDF in my &lt;a href="https://www.linkedin.com/posts/dineshpalli_mastering-ab-testing-for-interviews-activity-7339049087817670656-ut6k?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAABtfn7IBvP-I7xTwrT4Otmr20iqXbNykMfg" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;. I hope it helps you ace your next interview!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>datascience</category>
      <category>abtest</category>
    </item>
    <item>
      <title>Completed: End-to-End Data Engineering Project on Microsoft Azure</title>
      <dc:creator>Dinesh Palli</dc:creator>
      <pubDate>Tue, 03 Jun 2025 16:45:32 +0000</pubDate>
      <link>https://dev.to/wildneutron/im-excited-to-share-the-successful-completion-of-my-recent-end-to-end-data-engineering-project-hei</link>
      <guid>https://dev.to/wildneutron/im-excited-to-share-the-successful-completion-of-my-recent-end-to-end-data-engineering-project-hei</guid>
      <description>&lt;p&gt;I'm excited to share the successful completion of my recent end-to-end data engineering project!&lt;/p&gt;

&lt;p&gt;This project provided a comprehensive, hands-on experience in building a robust data pipeline - migrating data from an on-premises SQL Server database, implementing an automated daily ETL/ELT pipeline, and delivering insights through a Power BI dashboard based on IBCS standards using Microsoft Azure services. This covered the full data lifecycle, from source system extraction to business intelligence reporting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa48s6urhqzlvbg290agx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa48s6urhqzlvbg290agx.jpg" alt="Diagram illustrating an end-to-end Azure data engineering pipeline. Data originates from an On-Premises SQL Server, is ingested via Azure Data Factory, transformed through Bronze, Silver, and Gold layers in Azure Data Lake Storage Gen2 using Azure Databricks, and then loaded into Azure Synapse Analytics for visualization in Power BI. Supporting services like Azure Key Vault and Azure AD are also shown." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Project Highlights:&lt;/p&gt;

&lt;p&gt;• Data Ingestion: Leveraged Azure Data Factory (ADF) to ingest data from an on-premises SQL database, including the setup of Self-Hosted Integration Runtimes (SHIR) for secure on-premises SQL Server connectivity and dynamic pipeline creation for table ingestion.&lt;/p&gt;

&lt;p&gt;• Data Lake Storage &amp;amp; Medallion Architecture: Implemented a multi-layered data lake (bronze, silver, and gold tiers) using Azure Data Lake Storage Gen2 (ADLS Gen2) for efficient data organization and processing (Bronze: raw Parquet, Silver: cleaned Delta, Gold: aggregated Delta).&lt;/p&gt;

&lt;p&gt;• Data Transformation: Developed PySpark notebooks within Azure Databricks for robust data cleaning, transformation, schema evolution, and business logic application between data lake layers.&lt;/p&gt;

&lt;p&gt;• Data Warehousing &amp;amp; Analytics: Integrated Azure Synapse Analytics, creating serverless SQL pools and views over the Gold layer data for efficient querying and Power BI connectivity.&lt;/p&gt;

&lt;p&gt;• Secure Credential Management: Ensured secure storage and access of credentials using Azure Key Vault.&lt;/p&gt;

&lt;p&gt;• Business Intelligence &amp;amp; Data Visualization: Developed an interactive dashboard in Power BI (IBCS standards) to present key insights from the processed data and performing data modeling and establishing relationships for insightful visualizations.&lt;/p&gt;

&lt;p&gt;• Security &amp;amp; Automation: Implemented Azure Key Vault for secure storage and retrieval of credentials within ADF and Databricks. Designed daily pipeline automation using ADF triggers. Conceptualized security best practices using Azure Active Directory (Entra ID).&lt;/p&gt;

&lt;p&gt;This project allowed me to gain experience in crucial data engineering concepts including ETL/ELT processes, data modeling, cloud architecture, and data governance and building an entire pipeline.&lt;/p&gt;

&lt;p&gt;I've documented the project extensively, including notes, graphics, screen captures and explanations of some key topics, in my GitHub repo. Please find it here: &lt;a href="https://github.com/dineshpalli/rg-data-engineering-project" rel="noopener noreferrer"&gt;https://github.com/dineshpalli/rg-data-engineering-project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would like to extend my sincere thanks to Luke J. Byrne for his excellent walkthrough video (&lt;a href="https://youtu.be/ygJ11fzq_ik?si=1NV-tvrmJhvOTnXp" rel="noopener noreferrer"&gt;https://youtu.be/ygJ11fzq_ik?si=1NV-tvrmJhvOTnXp&lt;/a&gt;) and his original repository (&lt;a href="https://github.com/lukejbyrne/rg-data-engineering-project" rel="noopener noreferrer"&gt;https://github.com/lukejbyrne/rg-data-engineering-project&lt;/a&gt;), which were invaluable resources throughout this project.&lt;/p&gt;

&lt;p&gt;I encourage you to explore the repository. Feel free to clone, fork, or contribute to the project and to leave feedback. I am always open to connecting with fellow data enthusiasts, professionals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/dineshpalli/" rel="noopener noreferrer"&gt;My LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/@ai_luke" rel="noopener noreferrer"&gt;Luke's Channel&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cloud Resume Challenge: How I Broke, Fixed, and Grew Through a Real Azure Project</title>
      <dc:creator>Dinesh Palli</dc:creator>
      <pubDate>Thu, 10 Apr 2025 11:40:16 +0000</pubDate>
      <link>https://dev.to/wildneutron/cloud-resume-challenge-how-i-broke-fixed-and-grew-through-a-real-azure-project-4hgn</link>
      <guid>https://dev.to/wildneutron/cloud-resume-challenge-how-i-broke-fixed-and-grew-through-a-real-azure-project-4hgn</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Standing at the foot of the &lt;strong&gt;Cloud Resume Challenge&lt;/strong&gt;, I felt a mix of excitement and dread. I was comfortable discussing cloud concepts in theory, yet I had no real project to show for it. This gap between knowledge and experience was gnawing at me. It echoed the ancient Greek proverb &lt;em&gt;pathemata mathemata&lt;/em&gt; – meaning &lt;em&gt;“learning through suffering/experience.”&lt;/em&gt; In other words, the best way to learn is by doing, even if it means struggling. Embracing that wisdom, I decided to conquer my doubts and take action. What followed was a challenging yet exhilarating journey through a 16-step cloud project that would test my technical skills, resilience, and problem-solving like never before.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://www.linkedin.com/in/jan-f-lammering/" rel="noopener noreferrer"&gt;Jan F. Lammering&lt;/a&gt; and the amazing HR team of &lt;a href="https://www.linkedin.com/company/oraylis-gmbh/posts/?feedView=all" rel="noopener noreferrer"&gt;Oraylis&lt;/a&gt; (&lt;a href="https://www.linkedin.com/in/sonja-k%C3%BChle-bogenschneider/" rel="noopener noreferrer"&gt;Sonja Kühle-BogenschneiderView Sonja Kühle-Bogenschneider’s profile &lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/anne-m%C3%BCller-kemler-a43962222/" rel="noopener noreferrer"&gt;Anne Müller-Kemler&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/georgia-thume-883a59ab/" rel="noopener noreferrer"&gt;Georgia Thume&lt;/a&gt;)&lt;br&gt;
 for inspiring me to expound my knowledge and skills with Azure and the related technologies.&lt;/p&gt;

&lt;p&gt;Related Links:&lt;/p&gt;

&lt;p&gt;My website - &lt;a href="https://www.dineshpalli.com" rel="noopener noreferrer"&gt;https://www.dineshpalli.com&lt;/a&gt;, please leave your valuable feedback in the comments section below.&lt;/p&gt;

&lt;p&gt;GitHub Repo (Feel free to clone, would be amazing if you could tag me) - &lt;a href="https://github.com/dineshpalli/cloudresumechallenge-azure" rel="noopener noreferrer"&gt;https://github.com/dineshpalli/cloudresumechallenge-azure&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is the Cloud Resume Challenge?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Cloud Resume Challenge&lt;/strong&gt; is a rigorous multi-step project originally created by cloud architect &lt;a href="https://www.linkedin.com/in/forrestbrazeal/" rel="noopener noreferrer"&gt;Forrest Brazeal&lt;/a&gt;. It’s designed as a bridge between attaining cloud certifications and landing a cloud job, helping you go from “certified to hired” in a practical way (&lt;a href="https://cloudresumechallenge.dev/" rel="noopener noreferrer"&gt;The Cloud Resume Challenge&lt;/a&gt;). The challenge consists of 16 steps (yes, &lt;strong&gt;16!&lt;/strong&gt;) that cover both front-end and back-end development, cloud services, infrastructure as code, CI/CD, and more. Forrest deliberately doesn’t hand-hold participants through these steps – the expectation is that you figure things out yourself and learn through the struggle (&lt;a href="https://heyvitech.hashnode.dev/cloud-resume-challenge-by-forrest-brazeal#:~:text=You%20will%20not%20be%20guided,the%20best%20method%20to%20learn" rel="noopener noreferrer"&gt;Cloud Resume Challenge by Forrest Brazeal&lt;/a&gt;). This trial-by-fire approach is intentional because solving problems on your own is one of the best ways to gain meaningful cloud engineering experience. In fact, many people with years of IT experience have taken on this challenge to sharpen their skills (&lt;a href="https://heyvitech.hashnode.dev/cloud-resume-challenge-by-forrest-brazeal#:~:text=Fun%20fact%20,Challenge%20is%20worth%20a%20try" rel="noopener noreferrer"&gt;Cloud Resume Challenge by Forrest Brazeal&lt;/a&gt;), which speaks to its value and difficulty.&lt;/p&gt;

&lt;p&gt;Here’s a quick rundown of the &lt;strong&gt;16 steps&lt;/strong&gt; in the Azure edition of the Cloud Resume Challenge:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Certification:&lt;/strong&gt; Start by earning a foundational Azure cert (I have not yet acquired an azure certification).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML:&lt;/strong&gt; Write your resume in HTML.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS:&lt;/strong&gt; Style the resume with CSS to make it presentable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static Website:&lt;/strong&gt; Host your resume as a static website (in Azure, that means using an Azure Storage account’s static website feature).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS:&lt;/strong&gt; Implement HTTPS for your site (e.g. via Azure Front Door or CDN to get SSL).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS:&lt;/strong&gt; Set up a custom domain name for your website.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript:&lt;/strong&gt; Add interactivity – in this case, a JavaScript snippet to fetch and display a visitor counter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; Create a database to store the visitor count (Azure Cosmos DB in the Azure challenge).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; Develop an API endpoint that the JavaScript can call to get/update the count (using Azure Functions).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python:&lt;/strong&gt; Write the API code in Python (the Azure Function’s runtime).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; Write tests for your code (unit tests for the Python function, and maybe simple frontend tests).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Code:&lt;/strong&gt; Define your infrastructure in code (using a tool like Terraform or Azure Bicep) instead of clicking in the portal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Control:&lt;/strong&gt; Use source control (GitHub) to manage your code and IaC scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD (Back End):&lt;/strong&gt; Set up a CI/CD pipeline to automate deployment of your back-end (the Azure Function and related infrastructure).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD (Front End):&lt;/strong&gt; Set up a CI/CD pipeline to automate deployment of your front-end (the static website).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blog Post:&lt;/strong&gt; Write a blog (or LinkedIn article!) about your journey and lessons learned.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffz483peqzkyp2l09zpxu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffz483peqzkyp2l09zpxu.png" alt="*Architecture of the Cloud Resume Challenge on Azure. The static resume site is hosted on Azure Storage and exposed to the web via a content delivery network service (Azure Front Door or CDN) for global, secure access. An Azure Function app provides a Python API for the visitor counter, with data persisted in an Azure Cosmos DB database. All components (storage, function, database, networking) are defined as code and deployed through CI/CD pipelines.*" width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Architecture of the Cloud Resume Challenge on Azure. The static resume site is hosted on Azure Storage and exposed to the web via a content delivery network service (Azure Front Door or CDN) for global, secure access. An Azure Function app provides a Python API for the visitor counter, with data persisted in an Azure Cosmos DB database. All components (storage, function, database, networking) are defined as code and deployed through CI/CD pipelines.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;As you can see, the challenge is an &lt;strong&gt;end-to-end project&lt;/strong&gt; touching almost every aspect of cloud and web development: front-end design, back-end APIs, databases, networking, authentication, automation, and more. It’s intense. No tutorials, no courses, just dragging myself through dirt? So, I finished cloud resume challenge in MS Azure - the turnkey github repo can be found here - feel free to fork / clone / star the repo. I knew I would hit roadblocks in each of these areas – and indeed I did. But with each obstacle came an opportunity to learn and grow. There were severael moments across the challenge where i had to show myself that I am with it or on it, which helped me learn a lot and not give up at the slightest sight of challenge / discomfort. This made me imbue a lot of learning and experience like, figure out where something broke, what broke, why it broke and then devising plans to how to fix the broken things, doing 'smoke-tests' and fixtures.&lt;/p&gt;

&lt;p&gt;Forrest Brazeal, the challenge's creator, acknowledges that it will require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multiple long evenings&lt;/strong&gt; of work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensive research&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Significant self-learning&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I spent the the long hours of work at the end of November, December and beginning of January, doing step 2 and gaining the third. In the next sections, I’ll walk through the major challenges I faced in each step of CRC and what I learned from overcoming them.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Challenges Faced and Lessons Learned
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Domain Name Registration &amp;amp; Setup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; One of the first tasks was to get a custom domain for my resume website. This seemingly simple step turned into a quest of its own. Which domain registrar to choose? How to ensure DNS would be reliable? I was new to buying domains and worried about getting scammed or stuck with poor service. After some research and community recommendations, I chose &lt;strong&gt;Porkbun&lt;/strong&gt; as my registrar. Why Porkbun? Two big reasons stood out: (1) &lt;strong&gt;Transparent, affordable pricing&lt;/strong&gt; – they show first-year and renewal prices clearly with no hidden fees, so I knew exactly what I’d pay (&lt;a href="https://www.reddit.com/r/webdev/comments/1gp10fd/does_anyone_here_have_a_domain_at_porkbun_is_it/#:~:text=1.%20Transparent%20pricing%20,year%20and%20renewal%20prices%20upfront" rel="noopener noreferrer"&gt;Reddit Post Link&lt;/a&gt;). (2) &lt;strong&gt;Robust DNS management&lt;/strong&gt; – Porkbun’s interface for DNS records is very user-friendly and powerful, which is crucial when configuring custom records for Azure (&lt;a href="https://www.reddit.com/r/webdev/comments/1gp10fd/does_anyone_here_have_a_domain_at_porkbun_is_it/#:~:text=1.%20Transparent%20pricing%20,year%20and%20renewal%20prices%20upfront" rel="noopener noreferrer"&gt;Reddit Post Link&lt;/a&gt;). Additionally, Porkbun provides free WHOIS privacy and had great reviews for reliability. &lt;/p&gt;

&lt;p&gt;Purchasing the domain was the easy part. The real struggle came when hooking it up to my Azure resources. I had to create DNS records that point my new domain to the Azure static site (via &lt;a href="https://learn.microsoft.com/en-us/azure/frontdoor/front-door-overview" rel="noopener noreferrer"&gt;Azure Front Door&lt;/a&gt; (Formerly CDN)). This involved adding &lt;strong&gt;CNAME records&lt;/strong&gt; for the subdomain (www) and an &lt;strong&gt;A record&lt;/strong&gt; or alias for the root/apex domain. Initially, I wasn’t sure which records were needed – should I use an A record pointing to an IP? Or a CNAME to some azure domain? I learned that Azure Front Door provides a &lt;strong&gt;profile URL&lt;/strong&gt; (like &lt;code&gt;yourfrontdoor.azurefd.net&lt;/code&gt;) which you map via a CNAME. For the root domain, I ended up using an ALIAS or ANAME record (since CNAME at root isn’t allowed by DNS standards). It took some trial and error, and DNS changes take time to propagate, so I spent quite a few anxious hours waiting to see if my site would resolve on my domain. Seeing &lt;strong&gt;“DNS_PROBE_FINISHED_NXDOMAIN”&lt;/strong&gt; errors during that wait was nerve-wracking! Eventually, the DNS setup clicked, and my domain began pointing to my Azure front end. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; Choosing a good registrar makes life easier, but you still need patience (DNS changes can take hours). I also got a crash course in DNS record types and discovered the importance of documentation – Porkbun’s and Azure’s docs became bedtime reading. Most importantly, I overcame the fear of “breaking something” with DNS. Now, managing domains feels much less enigmatic.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Understanding DNS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; While setting up the domain, I realized I had a &lt;strong&gt;knowledge gap in DNS (Domain Name System)&lt;/strong&gt; itself. I knew the concept in abstract – DNS translates domain names to IP addresses – but I’d never configured DNS settings manually for a custom domain. Why did I need a CNAME vs an A record? What’s TTL? I decided to pause and educate myself on DNS fundamentals so I wouldn’t be just guessing. &lt;/p&gt;

&lt;p&gt;I learned that &lt;strong&gt;DNS is essentially the phonebook of the Internet&lt;/strong&gt; – it maps human-friendly names (like &lt;code&gt;myresume.com&lt;/code&gt;) to the numeric IP addresses that computers use (&lt;a href="https://www.cloudflare.com/learning/dns/what-is-dns/#:~:text=What%20is%20DNS%3F" rel="noopener noreferrer"&gt;What is DNS? by Cloudflare&lt;/a&gt;). When someone types my domain, a DNS query is made behind the scenes to find the matching IP or address for the server where my site is hosted. I also learned about &lt;strong&gt;authoritative name servers&lt;/strong&gt; (which hold the DNS records for my domain) and &lt;strong&gt;recursive resolvers&lt;/strong&gt; (the “DNS librarians” that fetch the answer) (&lt;a href="https://www.youtube.com/watch?v=mpQZVYPuDGU,%20[What%20is%20DNS?%20|%20How%20DNS%20works%20|%20Cloudflare](https://www.cloudflare.com/learning/dns/what-is-dns/#:~:text=There%20are%204%20DNS%20servers,involved%20in%20loading%20a%20webpage)" rel="noopener noreferrer"&gt;video&lt;/a&gt;, &lt;a href="https://www.cloudflare.com/learning/dns/what-is-dns/#:~:text=it%20serves%20as%20a%20reference,to%20the%20requested%20record%2C%20it" rel="noopener noreferrer"&gt;What is DNS? by Cloudflare&lt;/a&gt;). This helped me appreciate why sometimes I’d get different results during propagation – DNS servers around the world take time to update.&lt;/p&gt;

&lt;p&gt;In practice, for my resume site I set up the following DNS records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;A record&lt;/code&gt; for &lt;code&gt;myresume.com&lt;/code&gt; -&amp;gt; Points to Azure Front Door’s anycast IP (provided by Azure when verifying the domain).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CNAME record&lt;/code&gt; for &lt;code&gt;www.myresume.com&lt;/code&gt; -&amp;gt; Points to the Front Door hostname (e.g., &lt;code&gt;myresume.azurefd.net&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding these settings was empowering. Instead of blindly following a tutorial, I knew &lt;em&gt;why&lt;/em&gt; these records were needed. I even troubleshot a mistake where I’d misconfigured the CNAME – browsers were showing a security certificate error because the domain wasn’t properly recognized by Front Door. Fixing that required me to &lt;strong&gt;verify the custom domain&lt;/strong&gt; within Azure Front Door (by adding a specific verification ID as a TXT record). It was a lot of back-and-forth, but eventually I got the DNS configuration stable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; &lt;strong&gt;DNS is crucial&lt;/strong&gt; in any cloud project with custom domains, and you can’t treat it as a black box. By investing time in learning how DNS works (the hierarchy, record types, propagation), I became much more confident in setting up and troubleshooting domain issues. This foundational knowledge paid off later when I had to diagnose why &lt;em&gt;HTTPS wasn’t working&lt;/em&gt; (spoiler: it was a DNS misconfiguration on my part!). The key takeaway: when in doubt, go back to fundamentals – understanding the basics will illuminate the path forward.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Azure Subscription &amp;amp; Resource Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Next up was working in the &lt;strong&gt;Azure cloud&lt;/strong&gt; environment itself – creating resources and managing them. I signed up for an Azure account (I already had one from my certification prep) and created a dedicated &lt;strong&gt;Resource Group&lt;/strong&gt; to contain everything for this project. Even with some Azure knowledge, I felt overwhelmed when I started enumerating all the services I needed: a Storage Account for the static site, a Cosmos DB instance, an Azure Function app, an Azure Front Door profile for CDN/HTTPS, etc. The Azure Portal has &lt;em&gt;so many&lt;/em&gt; options that it’s easy to feel lost. I was also conscious that some services might incur costs. I had to plan carefully to stay within free tiers (Azure Cosmos DB has a free tier of 400 RU/s, Azure Functions consumption plan is essentially pay-per-use, and Azure Front Door has a minimal cost for low traffic). &lt;/p&gt;

&lt;p&gt;Setting up &lt;strong&gt;Azure Storage Static Website&lt;/strong&gt; was straightforward: you enable “Static website” on a Storage Account and upload your HTML/CSS files to the special &lt;code&gt;$web&lt;/code&gt; container. But enabling &lt;strong&gt;HTTPS&lt;/strong&gt; on a custom domain was not straightforward. Azure Storage static sites don’t natively support custom domain HTTPS, so Azure’s documentation recommends putting a CDN or Front Door in front (&lt;a href="https://stackoverflow.com/questions/61662502/enabling-https-for-a-azure-blob-static-website#:~:text=From%20this%20link%3A" rel="noopener noreferrer"&gt;Stack Overflow Link&lt;/a&gt;). I opted for &lt;strong&gt;Azure Front Door&lt;/strong&gt; (Classic) because it provides a managed SSL certificate for custom domains and also offers global caching and routing features. Azure Front Door required me to &lt;strong&gt;add my custom domain&lt;/strong&gt; to its frontend hosts, which in turn required the DNS mapping we discussed earlier. I stumbled here with validation – Front Door wouldn’t accept my domain until I created a &lt;strong&gt;TXT record&lt;/strong&gt; it provided for verification. It felt like a chicken-and-egg at first: to add domain in Front Door I need DNS, and for DNS to work I need Front Door’s endpoint. The solution was to follow Azure’s sequence precisely: verify domain ownership via TXT record, add the domain to Front Door, then update the CNAME/A records. Once done, Front Door provisioned an SSL cert for my domain automatically (&lt;a href="https://stackoverflow.com/questions/61662502/enabling-https-for-a-azure-blob-static-website#:~:text=1" rel="noopener noreferrer"&gt;Stack Overflow Link&lt;/a&gt;) (a process that took ~20 minutes). Seeing the green lock icon next to my URL was a moment of triumph.&lt;/p&gt;

&lt;p&gt;Managing &lt;strong&gt;Azure resources&lt;/strong&gt; also taught me about keeping things organized. I named resources with a consistent prefix, set tags for project name, and noted down in a README what each resource was for. At one point, I hit a snag where deployments were failing because I reached the limit of one free Front Door (the classic SKU allowed only one using free tier). I had to delete and recreate Front Door to tweak settings, which was a pain to do manually (this foreshadowed the need for Infrastructure as Code, which I implemented later). I also nearly forgot to turn on the &lt;strong&gt;“Always On” setting for my Azure Function&lt;/strong&gt; (to prevent cold start latency), but caught it during testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; &lt;strong&gt;Planning and resource management&lt;/strong&gt; in Azure is critical. Before jumping in, outline the architecture and identify the Azure services you’ll use. This helps in creating resources in a logical order and avoiding surprises (like service limits or prerequisite dependencies). I learned to navigate the Azure Portal more efficiently, but also realized the value of automation – clicking around is fine for initial exploration, but IaC would save me from repetitive manual setup when I inevitably had to rebuild or modify resources. Additionally, I gained experience with Azure Front Door and how it integrates with other services (DNS, Storage), which is a valuable skill on its own. &lt;/p&gt;
&lt;h3&gt;
  
  
  4. Frontend Development (HTML, CSS, Dark Mode)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Concurrently with the cloud setup, I had to build the &lt;strong&gt;frontend of my resume website&lt;/strong&gt;. This involved writing the resume content in HTML, styling it with CSS, and making it functional and nice-looking. I’m not a front-end developer by trade, so initially I had imposter syndrome: “Is my HTML/CSS good enough? Does it look professional?” My first version of the site was very basic – just text on a white background. It worked, but it didn’t &lt;em&gt;wow&lt;/em&gt;. I struggled with CSS to create a pleasant design. Rather than reinvent the wheel, I found a simple open-source HTML/CSS template as a starting point and tailored it to my needs (changed the color scheme, fonts, and layout to match my style). This saved me a ton of time and frankly resulted in a better-looking site.&lt;/p&gt;

&lt;p&gt;One fun addition I decided on was &lt;strong&gt;Dark Mode&lt;/strong&gt;. Many modern websites offer a dark theme, and I wanted to show that I pay attention to UX details. I implemented this using CSS media queries for the &lt;code&gt;prefers-color-scheme&lt;/code&gt;, as well as a JavaScript toggle button. This was a small rabbit hole of its own – ensuring that icons and images looked good on both dark and light backgrounds, and that my text remained readable. After a bit of tweaking, I got a nicely togglable dark mode working purely with CSS classes and a few lines of JavaScript to remember the user’s preference.&lt;/p&gt;

&lt;p&gt;Another challenge was making the site &lt;strong&gt;responsive&lt;/strong&gt;. I ensured the layout used relative units and flexbox, so it would display properly on mobile phones, tablets, etc. Testing on my own phone revealed some font sizes were too large and a section of text was overflowing the screen. I adjusted the CSS and learned how to use responsive meta tags and viewports properly.&lt;/p&gt;

&lt;p&gt;While working on the frontend, I also embedded the code for the &lt;strong&gt;visitor counter display&lt;/strong&gt;. At this point, I hadn’t built the back-end yet, but I knew I’d be calling an API to get a visitor count. So I wrote a small &lt;code&gt;&amp;lt;span id="visitors"&amp;gt;&lt;/code&gt; in the HTML and a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; that would later fetch from an endpoint (I used a dummy number or simple counter logic temporarily to see it in action). This helped connect the dots between front-end and back-end early on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; From a front-end perspective, I learned to balance &lt;strong&gt;technical depth with visual appeal&lt;/strong&gt;. This challenge wasn’t just about cloud services; it was also about presenting &lt;em&gt;my resume&lt;/em&gt;, essentially marketing myself. So the site needed to be polished. I gained confidence in HTML/CSS, learning a few new tricks (like how to do dark mode, and the power of a good CSS reset). I also learned not to be afraid to use templates or libraries – leveraging existing designs is perfectly fine as long as you customize and understand them. In a way, this mirrors real-world development: you don’t always start from scratch, but you &lt;strong&gt;do&lt;/strong&gt; need to know how to adapt components to your needs.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Backend Development (Azure Functions, Cosmos DB, Python API)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Now for the &lt;strong&gt;back-end&lt;/strong&gt; – the engine behind my visitor counter. The requirements were to have a database that stores a visitor count and an API that the front-end can call to increment and retrieve this count. In the AWS version of the challenge, people use DynamoDB and Lambda; for Azure, the equivalents are &lt;strong&gt;Azure Cosmos DB&lt;/strong&gt; and &lt;strong&gt;Azure Functions&lt;/strong&gt;. I chose Cosmos DB with the Core (SQL) API, in serverless mode (The &lt;strong&gt;serverless mode&lt;/strong&gt;, is ideal for small-scale applications like the Cloud Resume Challenge. In serverless mode, I only pay for the request units (RUs) consumed by my database operations, making it highly cost-effective for low-traffic.) to keep things JSON/document-based. Cosmos is a powerful, globally distributed NoSQL database, but it was also new territory for me.&lt;/p&gt;

&lt;p&gt;Why Not Other Cosmos DB APIs?&lt;/p&gt;

&lt;p&gt;While Azure Cosmos DB supports multiple APIs (e.g., MongoDB, Cassandra, Gremlin), the &lt;strong&gt;NoSQL API&lt;/strong&gt; is the most native and optimized for Cosmos DB. The other APIs are useful if I am migrating an existing application or need specific features (e.g., graph data for Gremlin), but they add unnecessary complexity for the Cloud Resume Challenge.&lt;/p&gt;

&lt;p&gt;One immediate concept I had to learn was the &lt;strong&gt;Partition Key&lt;/strong&gt; in Cosmos DB. When creating a container (table), Cosmos asks for a partition key path. Initially, I was puzzled – for a simple visitor counter, did I even need multiple partitions? After reading, I learned that every item in Cosmos &lt;em&gt;must&lt;/em&gt; have a partition key; it’s how Cosmos scales and distributes data. It’s best to choose a partition key that will evenly distribute data and be used in queries (&lt;a href="https://stackoverflow.com/questions/45067692/azure-cosmos-db-understanding-partition-key" rel="noopener noreferrer"&gt;Stack Overflow&lt;/a&gt;, &lt;a href="https://learn.microsoft.com/en-us/azure/cosmos-db/partitioning-overview#choose-a-partition-key" rel="noopener noreferrer"&gt;Documentation by Microsoft&lt;/a&gt;). In my case, since I only had one item (a counter), it didn’t matter much – I could use something like &lt;code&gt;/id&lt;/code&gt; or &lt;code&gt;/siteName&lt;/code&gt; as the partition key just to satisfy the requirement. I ended up using a constant partition key value for the single counter record. This was admittedly not a perfectly scalable design (if this were a high-traffic multi-counter scenario, a single partition could be a hotspot), but it was sufficient for the project scope.&lt;/p&gt;

&lt;p&gt;What is Azure Synapse Link?&lt;/p&gt;

&lt;p&gt;Azure Synapse Link enables near real-time analytics on operational data stored in Azure Cosmos DB without requiring an Extract, Transform, and Load (ETL) process. It essentially acts as a &lt;strong&gt;bridge&lt;/strong&gt;between operational (OLTP) and analytical (OLAP) systems, allowing data to be accessed efficiently for analytics workloads.&lt;/p&gt;

&lt;p&gt;Next, I tackled the &lt;strong&gt;Azure Function&lt;/strong&gt;. I wrote a Python Azure Function with an HTTP trigger. This function’s job was simple in description: when hit with a GET or POST request, connect to Cosmos DB, increment a counter, and return the updated count as JSON. I discovered Azure Functions has a feature called &lt;strong&gt;output binding&lt;/strong&gt; for Cosmos DB – which means I could configure the function to automatically write to a Cosmos DB item without writing all the boilerplate CRUD code. However, to better understand the process (and since output binding required some specific data shaping), I chose to manually use the &lt;a href="https://learn.microsoft.com/en-us/azure/developer/python/sdk/azure-sdk-overview" rel="noopener noreferrer"&gt;Azure Cosmos DB Python SDK&lt;/a&gt; inside the function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;azure.functions&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.cosmos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CosmosClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PartitionKey&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize Azure Function with function-level authentication
&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FunctionApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http_auth_level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AuthLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FUNCTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_get_cosmos_container&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Lazily load Cosmos DB connection details and client.
    This function checks environment variables at runtime
    (rather than at module import time).
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;required_env_vars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COSMOS_DB_ACCOUNT_URI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COSMOS_DB_ACCOUNT_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COSMOS_DB_NAME&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COSMOS_DB_CONTAINER&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Check for any missing environment variables.
&lt;/span&gt;    &lt;span class="n"&gt;missing_vars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;required_env_vars&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;missing_vars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;EnvironmentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Missing required environment variables: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;missing_vars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Extract Cosmos DB connection details from environment variables.
&lt;/span&gt;    &lt;span class="n"&gt;cosmos_db_uri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COSMOS_DB_ACCOUNT_URI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;cosmos_db_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COSMOS_DB_ACCOUNT_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;cosmos_db_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COSMOS_DB_NAME&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;cosmos_db_container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COSMOS_DB_CONTAINER&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# Set up the Cosmos DB client and container.
&lt;/span&gt;    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CosmosClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cosmos_db_uri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cosmos_db_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_database_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cosmos_db_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_container_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cosmos_db_container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;


&lt;span class="c1"&gt;# HTTP trigger function that increments and returns the visitor count
&lt;/span&gt;&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http_trigger_py&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_visitor_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HttpRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HttpResponse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing getVisitorCount request. Kindly wait...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Initialize Cosmos container on-demand (includes env var checks)
&lt;/span&gt;        &lt;span class="n"&gt;container&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_get_cosmos_container&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Try to fetch the existing count document with id="1"
&lt;/span&gt;        &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;partition_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Found item: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, the existing count document.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# If document doesn't exist, initialize with count=42
&lt;/span&gt;            &lt;span class="c1"&gt;# 42 is used as a fun reference to "Hitchhiker's Guide to the Galaxy"
&lt;/span&gt;            &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The count document not found or an error occurred: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# Get current count, defaulting to 42 if not found
&lt;/span&gt;        &lt;span class="n"&gt;current_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Ensure count is a valid integer; if corrupted, reset to 42
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Current count is invalid. Resetting to 42! &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(Why 42 you ask? It&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s a galactic inside joke. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Grab a towel and go figure it out). Item: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;current_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;

        &lt;span class="c1"&gt;# Increment the visitor count
&lt;/span&gt;        &lt;span class="n"&gt;new_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_count&lt;/span&gt;

        &lt;span class="c1"&gt;# Save updated count back to Cosmos DB
&lt;/span&gt;        &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upsert_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Updated visitor count to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;new_count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Return new count as JSON response
&lt;/span&gt;        &lt;span class="n"&gt;response_body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;new_count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HttpResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_body&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;mimetype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Handle any unexpected errors
&lt;/span&gt;        &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error updating visitor count: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_info&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;error_body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unable to retrieve and update visitor count.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HttpResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error_body&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;mimetype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Writing the Python code was straightforward logic-wise, but I ran into environment issues. Azure Functions for Python uses specific package versions and a structure (&lt;code&gt;requirements.txt&lt;/code&gt;, etc.). I had to ensure the Cosmos DB Python SDK (&lt;code&gt;azure-cosmos&lt;/code&gt;) was added to my &lt;code&gt;requirements.txt&lt;/code&gt; so that it would be available in Azure. Locally, I tested the function using Azure Functions Core Tools – a local emulator. This helped a lot: I could fire requests at &lt;code&gt;http://localhost:7071/api/visitors&lt;/code&gt; and see if it updated the count.&lt;/p&gt;

&lt;p&gt;For the database operations, I used the &lt;strong&gt;“upsert”&lt;/strong&gt; functionality. Upsert is a combined &lt;em&gt;insert or update&lt;/em&gt; operation – if the item (document) doesn’t exist, it creates it; if it does exist, it updates it (&lt;a href="https://www.cockroachlabs.com/blog/sql-upsert/" rel="noopener noreferrer"&gt;Source&lt;/a&gt;). This was perfect for a visitor counter: every time the API is called, upsert an item with key “counter” and increment a field. If it’s the first visitor ever, the item gets created with count=1; otherwise, it just updates the existing count. Using upsert saved me from writing separate logic for create vs update.&lt;/p&gt;

&lt;p&gt;One tricky part was ensuring my function had permission to access the Cosmos DB. In Azure, my function and Cosmos were in the same resource group, but I still needed to provide the Cosmos DB connection string to the function (as an environment setting) or set up a managed identity. For simplicity, I stored the Cosmos DB keys in an Azure Functions application setting (which I later moved to a secure place when using IaC). In a production scenario, I might use a managed identity so the function can fetch secrets from Azure Key Vault, but I kept things straightforward for now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; Building the back-end solidified my understanding of &lt;strong&gt;serverless functions and database operations in the cloud&lt;/strong&gt;. I learned how to interact with Cosmos DB in Python and the concept of upsert operations. More importantly, I experienced first-hand the stateless nature of serverless: the function could be invoked multiple times in parallel, so I had to consider concurrency on the counter (Cosmos DB’s etag concurrency control could be relevant if this was high-scale). For this project, Cosmos’s built-in “last write wins” with upsert sufficed. I also became comfortable with Azure Functions tooling – creating the function, running it locally, deploying it (more on deployment in CI/CD section), and monitoring it. When I deployed the function to Azure for the first time and called the API endpoint from my website, seeing the number increment on my page felt like magic! It was a full-stack accomplishment – from browser to cloud and back.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Backend and Frontend Integration with Javascript
&lt;/h3&gt;

&lt;p&gt;During the same, I learnt what CORS (Cross Origin Resource Sharing) is. CORS is a mechanism that relaxes the SOP (What is SOP? Answered in the following paragraph). It allows web applications on one origin to request resources from servers on a different origin &lt;em&gt;if the server permits it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Mechanism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web browsers send special HTTP headers (such as &lt;code&gt;Origin&lt;/code&gt;, &lt;code&gt;Access-Control-Request-Method&lt;/code&gt;, etc.) when making a cross-origin request.&lt;/li&gt;
&lt;li&gt;The server can respond with corresponding headers (like &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt;, &lt;code&gt;Access-Control-Allow-Credentials&lt;/code&gt;, etc.) to either grant or deny permission.&lt;/li&gt;
&lt;li&gt;If the server grants permission, the browser allows the cross-origin request to succeed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Definition: SOP is a fundamental security restriction enforced by web browsers. It states that a web page (i.e., script) can only access resources (like data or the DOM) from the &lt;em&gt;same origin&lt;/em&gt;—where an origin is defined by the combination of scheme (protocol), host (domain), and port.&lt;/p&gt;

&lt;p&gt;Purpose: It prevents malicious scripts on one page from obtaining sensitive data from another page on a different domain. Essentially, it &lt;em&gt;blocks cross-domain reads&lt;/em&gt; unless explicitly allowed.&lt;/p&gt;

&lt;p&gt;The relationship between SOP and CORS is that&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SOP&lt;/strong&gt; is the default browser security model that &lt;strong&gt;blocks cross-origin resource access&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CORS&lt;/strong&gt; is a standardized way for a server to &lt;strong&gt;opt-in&lt;/strong&gt; to allowing cross-origin requests despite SOP. Without CORS (or other bypass mechanisms like JSONP in older contexts), the browser would block most cross-origin calls to protect users from potential security risks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, &lt;strong&gt;CORS&lt;/strong&gt; exists as a controlled mechanism to &lt;strong&gt;override&lt;/strong&gt; or &lt;strong&gt;relax&lt;/strong&gt; the &lt;strong&gt;same-origin policy&lt;/strong&gt; under specific, secure conditions configured by the server.&lt;/p&gt;

&lt;p&gt;I learnt what DOM - Document Object Module is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DOM&lt;/strong&gt; stands for &lt;strong&gt;Document Object Model&lt;/strong&gt;, which is a programming interface (API) for HTML and XML documents. It provides a structured, hierarchical representation of the document, allowing scripts (such as JavaScript) to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Access&lt;/strong&gt; the elements in the document (like &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, etc.),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modify&lt;/strong&gt; their content and attributes,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add or remove&lt;/strong&gt; elements,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respond to events&lt;/strong&gt; (e.g., clicks, keyboard input).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When a web page is loaded, the browser parses the HTML (and possibly XML) and constructs a &lt;strong&gt;tree-like&lt;/strong&gt; model of the document, where each node represents a part of the page (an element, a text node, an attribute, etc.). This tree of nodes is what we call the DOM. Because the DOM is an interface, languages like JavaScript can manipulate it in real time, enabling dynamic, interactive web pages.&lt;/p&gt;

&lt;p&gt;I used DOM to define what clicking some buttons does - for example changing the language from English to German and vice-versa, and dark / light toggle and a not-so-hidden confetti blast.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. CI/CD Implementation (GitHub Actions Pipelines)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; With front-end and back-end built, I needed to set up &lt;strong&gt;Continuous Integration/Continuous Deployment (CI/CD)&lt;/strong&gt; so that any changes I push to my code repository would automatically build and deploy the latest version of my resume site. This is a crucial part of the challenge – it demonstrates ability to automate and streamline operations, which is highly valued by employers. I chose &lt;strong&gt;GitHub Actions&lt;/strong&gt; for CI/CD, as it’s natively integrated with GitHub where my code resides.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deploying the function (before the CI / CD)
&lt;/h4&gt;

&lt;p&gt;Next comes KUDU, in the azure function app context. &lt;strong&gt;Kudu&lt;/strong&gt; is the deployment engine and a set of related tools that run behind the scenes in Microsoft Azure App Service like function apps, web apps. Features of Kudu include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Automation&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Kudu handles the deployment process for Function App, whether we are deploying from:

&lt;ul&gt;
&lt;li&gt;Git repositories&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Azure DevOps&lt;/li&gt;
&lt;li&gt;Local ZIP files&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;It automatically builds and deploys our code to the Function App.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Control Integration&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Kudu integrates with Git and other source control systems to enable continuous deployment.&lt;/li&gt;
&lt;li&gt;When we push changes to our repositories, Kudu automatically pulls the latest code and deploys it to our Function App.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagnostic Tools&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Kudu provides a &lt;strong&gt;diagnostic console&lt;/strong&gt; where qw can run commands, inspect logs, and troubleshoot issues.&lt;/li&gt;
&lt;li&gt;We can access logs for:

&lt;ul&gt;
&lt;li&gt;Application logs&lt;/li&gt;
&lt;li&gt;Deployment logs&lt;/li&gt;
&lt;li&gt;Web server logs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File System Access&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Kudu gives us access to the file system of Function App.&lt;/li&gt;
&lt;li&gt;We can browse, upload, download, and edit files directly through the Kudu interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment Management&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Kudu provides detailed information about the runtime environment of our Function App, including:

&lt;ul&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Installed software&lt;/li&gt;
&lt;li&gt;System settings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebJobs and Background Tasks&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Kudu supports the management of &lt;strong&gt;WebJobs&lt;/strong&gt;, which are similar to Azure Functions but run in the context of an App Service plan.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I deployed my function app, as a zip file from local Azure CLI on VS Code. After deploying, it did not work perfectly, as the script that points to function app python script was absent. And a small tip, to have all the environmental variables,&lt;/p&gt;

&lt;p&gt;APPLICATIONINSIGHTS_CONNECTION_STRING, AzureWebJobsFeatureFlags, AzureWebJobsStorage, COSMOS_DB_ACCOUNT_KEY, COSMOS_DB_ACCOUNT_URI, COSMOS_DB_CONTAINER, COSMOS_DB_NAME, ENABLE_ORYX_BUILD, FUNCTIONS_EXTENSION_VERSION, FUNCTIONS_WORKER_RUNTIME, SCM_DO_BUILD_DURING_DEPLOYMENT, WEBSITE_CONTENTAZUREFILECONNECTIONSTRING, WEBSITE_CONTENTSHARE. Then I had to create an &lt;strong&gt;init&lt;/strong&gt;.py file in the directory. Moreover I had to deploy only the root folder of the app and not th entire github repo, which means that I deploy only the backend/api folder as my function app. This is because Azure functions are folder based and and should contain function.json that points to the function app script, and tells azure how to build and trigger the function. Deploying the whole repo confuses Azure as it looks for function.json script in the root directory of the deployed zip / package. Then it worked. After that I got the function url and copied the default key.&lt;/p&gt;

&lt;h4&gt;
  
  
  CI / CD
&lt;/h4&gt;

&lt;p&gt;Setting up GitHub Actions for Azure required creating a &lt;strong&gt;Service Principal&lt;/strong&gt; – essentially a special Azure AD identity with permissions that GitHub Actions can use to deploy resources on my behalf. A service principal is an identity made for automated tools (like CI/CD pipelines) rather than a human user (&lt;a href="https://learn.microsoft.com/en-us/azure/databricks/dev-tools/ci-cd/ci-cd-sp#:~:text=This%20article%20describes%20how%20to,automated%20tools%20and%20applications%2C%20including" rel="noopener noreferrer"&gt;Service principals for CI/CD - Azure Databricks&lt;/a&gt;). I created one using Azure CLI (&lt;code&gt;az ad sp create-for-rbac&lt;/code&gt; command), giving it contributor access to my resource group. This generated an app ID, tenant ID, and client secret – which I stored as secrets in my GitHub repository. It felt a bit like giving keys to a robot: with those credentials, my GitHub Actions could log in to Azure and perform deployments securely.&lt;/p&gt;

&lt;p&gt;I ended up creating &lt;strong&gt;two workflows&lt;/strong&gt;: one for the front-end (resume website) and one for the back-end (function + infrastructure). The front-end workflow was triggered on pushes to the &lt;code&gt;frontend&lt;/code&gt; folder (where my HTML/CSS/JS live). It would build any assets (in my case, just zipping files) and then use Azure CLI to upload files to the Azure Storage &lt;code&gt;$web&lt;/code&gt; container (overwriting the old files). I also used an Azure CLI command to &lt;strong&gt;purge the Front Door cache&lt;/strong&gt; for my site, so that the new changes would reflect immediately globally.&lt;/p&gt;

&lt;p&gt;The back-end workflow was a bit more involved. It was triggered on pushes to the &lt;code&gt;backend&lt;/code&gt; or &lt;code&gt;infra&lt;/code&gt; (Terraform) code. Its steps were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checkout code and set up Python environment.&lt;/li&gt;
&lt;li&gt;Run tests (more on tests in next section).&lt;/li&gt;
&lt;li&gt;Package the Python Azure Function (basically &lt;code&gt;func azure functionapp publish&lt;/code&gt; or deploying via zip).&lt;/li&gt;
&lt;li&gt;Deploy the Azure Function code to Azure. For this I used the official Azure Functions Action or used Azure CLI to zip deploy to the function app.&lt;/li&gt;
&lt;li&gt;Run Terraform to apply any infrastructure changes (this included creating or updating the Cosmos DB, Function App itself, etc., if I changed IaC definitions).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One major struggle here was &lt;strong&gt;configuring Terraform in CI&lt;/strong&gt;. I had to store the Terraform state somewhere. I chose to use Azure storage as a remote backend for Terraform state, which required setting up a storage account and container for state files. Getting all these pieces to work in GitHub Actions YAML took many trial runs. My initial pipeline runs failed because of missing permissions – the service principal needed additional rights (e.g., to create new resources defined in Terraform). I iteratively adjusted the IAM roles in Azure and the scope until the pipeline could execute without errors.&lt;/p&gt;

&lt;p&gt;Another issue was secrets management. I had to pass sensitive information (like the Cosmos DB connection string, or the Azure Function’s settings) into the workflow. I leveraged GitHub Secrets and masked variables, and for Azure Function settings, I ended up storing them in Azure and using the workflow to update them if needed (for instance, Terraform can set app settings as part of the Function App resource definition).&lt;/p&gt;

&lt;p&gt;There was a moment when my CI pipeline kept failing on the Terraform step, and I was stuck past midnight combing through error logs. The error was about a dependency conflict that didn’t make sense. After a frustrating hour, I realized it was due to me using an outdated Terraform Azure provider version. I updated it and things magically worked. This taught me to pay attention to the details in error logs and also to ensure I’m using updated tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; Setting up CI/CD gave me invaluable experience in &lt;strong&gt;automation and DevOps practices&lt;/strong&gt;. I learned how to authenticate a GitHub Action runner with Azure securely, how to use the Azure CLI and Azure Actions within a workflow, and how to handle state and secrets. The big win is that now I can push a change (say, tweak my resume text or fix a bug in the Python API) and within minutes the change is live on my website without any manual steps. This is the power of CI/CD – faster iterations and fewer human errors in deployment. I also learned to be patient and systematic when debugging pipeline issues. It’s a different kind of debugging than code debugging, but using a &lt;strong&gt;heuristic approach&lt;/strong&gt; (check logs, add echo statements to see variables, upgrade tools, etc.) eventually resolves the issues. By the end, I had a &lt;strong&gt;fully automated deployment process&lt;/strong&gt;, which felt like having an extra team member handling ops for me.&lt;/p&gt;

&lt;p&gt;Special shout out to GitKraken for providing an exceptional graphical user interface for my repository management. Their intuitive merge conflict resolution tool has significantly streamlined my workflow, making the process of resolving merge conflicts remarkably efficient and user-friendly.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Infrastructure as Code (Terraform vs Azure Bicep)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; One of the more intimidating steps for me was implementing &lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt;. This means writing code to define and provision all the cloud resources (as opposed to clicking in the Azure Portal). The challenge gave the option of using tools like AWS CloudFormation, Azure Resource Manager templates, Azure Bicep, or Terraform. In the Azure world, the two popular IaC choices are &lt;strong&gt;Azure Bicep&lt;/strong&gt; (Microsoft’s domain-specific language for ARM templates) and &lt;strong&gt;Terraform&lt;/strong&gt; (HashiCorp’s multi-cloud IaC tool). I was torn on which to use. Bicep is tailor-made for Azure and doesn’t require maintaining a separate state file, whereas Terraform has the advantage of being widely used in industry and working across different providers.&lt;/p&gt;

&lt;p&gt;After some deliberation, I chose &lt;strong&gt;Terraform&lt;/strong&gt;. My reasons were: (1) I wanted to learn a tool I can apply to multiple clouds in the future – Terraform’s provider system lets you manage not just Azure but AWS, GCP, and even third-party services with one language (&lt;a href="https://xebia.com/blog/infrastructure-as-code-on-azure-bicep-vs-terraform-vs-pulumi/#:~:text=Terraform%20is%20an%20open%20source,a%20storage%20account%20using%20Terraform" rel="noopener noreferrer"&gt;Infrastructure as Code on Azure: Bicep vs. Terraform vs. Pulumi - Xebia&lt;/a&gt;). (2) Terraform has a large community, and I found more examples/community modules for Azure in Terraform than for Bicep. (3) I was already familiar with basic Terraform from a previous mini-project, so I had a slight comfort advantage. That said, I acknowledge Bicep is fantastic for Azure-only projects and has the benefit of no separate state management (state is handled by Azure). It was a close call.&lt;/p&gt;

&lt;p&gt;Implementing Terraform for my project meant writing configuration for each resource: the resource group, storage account (with static website enabled), Cosmos DB account and database/container, the Function App (and its plan), Front Door configuration (Front Door in Terraform was particularly complex due to multiple sub-resources for routes, endpoints, etc.), and even DNS records (Terraform Azure DNS module). This was a &lt;strong&gt;massive learning exercise&lt;/strong&gt;. My Terraform config spanned several files for logical separation. I learned how to use Terraform modules and outputs to pass values around (for example, passing the storage account’s primary web endpoint to an output). &lt;/p&gt;

&lt;p&gt;There were moments of head-scratching, like how to get the Cosmos DB keys and feed them into Azure Function settings automatically. I discovered Terraform has the ability to retrieve those via the &lt;code&gt;azurerm_cosmosdb_account&lt;/code&gt; data source after creation, which I could then use in the Function’s app settings resource block. It felt like wiring up an intricate machine via code.&lt;/p&gt;

&lt;p&gt;The biggest benefit came later: when I needed to tweak something in my architecture (like switch to a different SKU for Front Door or add a new environment variable), I simply changed the code and ran &lt;code&gt;terraform apply&lt;/code&gt;. Terraform figured out the necessary changes (often called the &lt;em&gt;execution plan&lt;/em&gt;) and applied them in the correct order. This was so much easier than clicking through the portal for each change. Moreover, if I ever needed to recreate the whole environment (say, for testing or if something went wrong), I could do so with one command. It gave me confidence that my setup was reproducible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; Adopting IaC early on in a project is worth the upfront investment. I learned both the syntax and the nuance of Terraform, and also got a taste of the differences between IaC tools. Notably, I learned that &lt;strong&gt;Terraform (being cloud-agnostic)&lt;/strong&gt; requires you to configure a provider and manage state, but it offers flexibility to manage any service (in fact, I used it to configure DNS records on Azure as well). In contrast, a tool like Bicep is &lt;strong&gt;Azure-specific but deeply integrated&lt;/strong&gt;, which means quicker support for new Azure features (&lt;a href="https://medium.com/@gayal.kaushik/terraform-vs-bicep-honest-feedback-332a54d9ace2#:~:text=Medium%20medium,Also%2C%20terraform%20can" rel="noopener noreferrer"&gt;I was pleasantly surprised | Terraform vs Bicep | by Kaushik - Medium&lt;/a&gt;) (&lt;a href="https://xebia.com/blog/infrastructure-as-code-on-azure-bicep-vs-terraform-vs-pulumi/#:~:text=Terraform%20is%20an%20open%20source,a%20storage%20account%20using%20Terraform" rel="noopener noreferrer"&gt;Infrastructure as Code on Azure: Bicep vs. Terraform vs. Pulumi - Xebia&lt;/a&gt;). For example, if Azure launches a new service, Bicep can likely use it day one, whereas Terraform might take time for a provider update. These insights into tool choices are valuable for architecture decisions in a professional setting. Ultimately, the Terraform experience strengthened my infrastructure mindset – I treat infrastructure as part of the codebase now, subject to version control and continuous deployment just like application code.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Testing &amp;amp; Debugging
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; With everything built and deployed through pipelines, I had to ensure it all actually &lt;em&gt;worked&lt;/em&gt; reliably. This meant  &lt;strong&gt;smoke - testing&lt;/strong&gt; each part and &lt;strong&gt;debugging&lt;/strong&gt; any issues that arose. I wrote a few tests for the Python function using Python’s &lt;code&gt;unittest&lt;/code&gt; framework (could have used &lt;code&gt;pytest&lt;/code&gt; as well). For example, I simulated a request to the function and checked that the response contained a count and that the count increased when called twice. Since the function code was relatively simple, these were basic sanity tests. I included these tests in the CI pipeline, so if I ever broke something in the function logic, the CI would catch it before deployment (failing the build).&lt;/p&gt;

&lt;p&gt;On the front-end side, my testing was more manual. I would open the website in a browser, ensure the resume content looked right, and that the visitor counter displayed and incremented properly on refresh. I also tested on different devices and in dark mode to make sure everything was legible. One bug I encountered was that the visitor count sometimes didn’t update immediately. This turned out not to be a code bug but a caching issue – Azure Front Door was caching the API responses. The fix was to set proper cache-control headers in the API response so that the function’s output isn’t cached by the CDN. Once I set the response header to &lt;code&gt;Cache-Control: no-store&lt;/code&gt;, the counter updated on every visit as expected.&lt;/p&gt;

&lt;p&gt;Another crucial area of debugging was the &lt;strong&gt;CI/CD pipelines&lt;/strong&gt;. Even after getting them to work initially, there were times they failed. For example, one day my front-end deployment workflow started erroring out during the Azure CLI upload. The error message was about an authentication failure. After scratching my head, I realized that the Azure service principal’s secret had expired (by default, Azure AD app secrets can have an expiration). This was an eye-opener – automated credentials need rotation. I generated a new secret, updated the GitHub secret, and all was well. This experience taught me the importance of documenting such caveats and possibly using Azure Managed Identity with GitHub OIDC in the future to avoid secret rotation issues.&lt;/p&gt;

&lt;p&gt;I also practiced the skill of reading Azure’s diagnostic logs. For instance, in Azure Functions, I used Application Insights to log each function invocation. In one test, I saw that my function was throwing an exception when two calls came in concurrently. By examining the logs, I pinpointed it to a race condition in my Cosmos DB update (I wasn’t using any concurrency control). While the likelihood of heavy parallel traffic on my resume is low, I still refactored the code to be a bit more robust (I added a retry on failure logic). It was comforting to see the logs clean after that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson learned:&lt;/strong&gt; &lt;strong&gt;Testing and debugging&lt;/strong&gt; are where the rubber meets the road. I learned that having tests is great, but you also need to consider real-world usage (like caching layers, auth expiry) in your verification plan. I developed a more &lt;strong&gt;holistic debugging approach&lt;/strong&gt;: not just looking at code, but also at infrastructure, network, and pipeline angles when something went wrong. One of the biggest skills I honed was using logs and error messages to guide my next steps – instead of changing things blindly, I let the evidence from logs lead me to the root cause. This is a crucial skill in any engineering role. Moreover, I gained an appreciation for &lt;strong&gt;failure&lt;/strong&gt; – every time something failed, it was an opportunity to make my project more bulletproof. By the end of the challenge, I wasn’t just tolerating failures; I was &lt;em&gt;embracing&lt;/em&gt; them as part of the learning process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;Completing the Cloud Resume Challenge on Azure was a &lt;strong&gt;transformative experience&lt;/strong&gt; for me. Here are some of my key takeaways from this journey:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hands-on Problem Solving:&lt;/strong&gt; There’s no substitute for actually building something end-to-end. My problem-solving skills were sharpened daily. When a hurdle appeared (and there were plenty), I learned to break it down, research, and solve it systematically. This project taught me how to learn on-the-fly – whether it was figuring out DNS records or deciphering Terraform error logs – which is a critical skill in the tech industry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Perseverance and Resilience:&lt;/strong&gt; There were moments I felt truly stuck or discouraged (I’m looking at you, CI/CD failures at 2 AM). But pushing through those tough moments was incredibly rewarding. I learned to &lt;strong&gt;overcome my own intransigence&lt;/strong&gt; – at times I was stubbornly clinging to a wrong approach (Of course there were some situations where I tried to keep a balloon under water), and the challenge forced me to step back and try different angles. Eventually, perseverance paid off. This mindset shift, embracing challenges rather than avoiding them, is something I’ll carry into any job. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Full-Stack Perspective:&lt;/strong&gt; Working on this project gave me a 360-degree view of a web application. I dealt with everything from user interface details to database scalability concerns. This holistic understanding is valuable because I can appreciate how things connect: a change in the front-end might require a tweak in the back-end API, which might affect infrastructure or security settings, and so on. It’s made me a more well-rounded engineer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Importance of Documentation and Community:&lt;/strong&gt; One of the unsung heroes of my journey was documentation (Azure docs, blog posts, and community forums). I realized the value of reading the fine print. Many solutions came from simply RTFM – “reading the fantastic manual.” Additionally, I lurked in the Cloud Resume Challenge Discord and GitHub discussions; seeing others’ questions and solutions saved me time. The tech community is incredibly helpful, and learning to effectively find and utilize information is a skill in itself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automation and Best Practices:&lt;/strong&gt; By implementing CI/CD and Infrastructure as Code, I ingrained best practices that I will bring to any future projects. Automation not only saves time, but it also enforces consistency and reduces mistakes. I’ve seen first-hand how a solid DevOps pipeline can be the backbone of a project, allowing frequent, reliable updates. This challenge was as much an exercise in DevOps as it was in development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Personal Growth:&lt;/strong&gt; On a personal level, finishing this challenge was a huge confidence booster. It served as proof to myself (and hopefully to hiring managers) that I can set a complex goal and see it through. I also learned how to cope with the anxiety of the unknown. At the start, 16 steps looked daunting, but taking them one at a time, I found that &lt;em&gt;any big problem is solvable if you break it into smaller pieces&lt;/em&gt;. Now, when faced with a new tech problem, I’m far less intimidated because I have a framework to tackle it. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In summary, the Cloud Resume Challenge was an intense but incredibly educational journey. It strengthened not only my technical competencies in cloud architecture, coding, and automation, but also honed my problem-solving grit and ability to learn independently. I like to say the experience &lt;em&gt;“catapulted me out of my comfort zone”&lt;/em&gt; — and that’s where real growth happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Call to Action
&lt;/h2&gt;

&lt;p&gt;If you’ve made it this far, thank you for reading my story! I want to leave you with a challenge (and an invitation). &lt;strong&gt;First, I encourage you to take up the Cloud Resume Challenge yourself.&lt;/strong&gt; Whether you choose Azure like I did, or AWS or Google Cloud, you will gain hands-on experience that is hard to get from courses or books. It’s not easy – you will struggle – but as I’ve shared, those struggles are exactly what impart the deepest lessons.&lt;/p&gt;

&lt;p&gt;For hiring managers or fellow engineers reading this: I invite you to check out my project’s repository on &lt;a href="https://github.com/dineshpalli/cloudresumechallenge-azure" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. There you can see my code, my Terraform scripts, workflow files, and even the history of my commits that document the progression of this project. I’m proud to discuss any part of it. Feel free to quiz me on why I made certain decisions or how I handled a particular problem – I’d love to walk through my thought process. &lt;/p&gt;

&lt;p&gt;Finally, let’s make this a conversation. Have you tried the Cloud Resume Challenge or something similar? Share your experiences or questions in the comments. I’ll be happy to exchange insights or help point aspiring challengers in the right direction if you’re stuck on a step. &lt;/p&gt;

&lt;p&gt;By sharing our learning journeys, we not only celebrate our growth but also inspire others to step up and get their hands dirty (or rather, their keyboards busy!). So, if you’re on the fence, jump in – deploy that website, write that code, configure that pipeline. You’ll come out the other side amazed at what you’ve accomplished. I know I am.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you for reading, and I hope to see your own cloud resume story soon!&lt;/em&gt; 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cloudresumechallenge</category>
      <category>azure</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
