How We United 8 Developers Across Restricted Environments Using Azure VMs and Dev Containers
šÆ TL;DR: Distributed Development with Azure VMs and Dev Containers
This post details solving a distributed development challenge where 8 developers from different organizations needed to collaborate on an AutoGen AI project - 4 from restricted corporate environments unable to install development tools, and 4 external developers without access to client systems. The solution uses a shared Azure VM (Standard D8s v3) with individual user accounts, certificate-based SSH authentication, and VS Code Remote Development connected to a shared Dev Container environment. The architecture eliminates āworks on my machineā issues by providing consistent development environments, shared resources (datasets, models, configs), and enables real-time collaboration.
Implementation highlights: Automated user provisioning scripts, VS Code Remote-SSH configuration, comprehensive devcontainer.json with pre-installed Python 3.12/AutoGen/Azure CLI, shared directory structures, and security hardening with fail2ban and UFW. Development environment setup scripts and configurations documented here
Introduction: When Traditional Solutions Hit a Wall
Last month, I found myself facing a challenge that Iām sure many of you have encountered: How do you enable seamless collaboration for a development team when half of them work in a locked-down environment where they canāt install any development tools, and the other half canāt access the clientās systems?
Our team of eight developers was tasked with building a proof-of-concept (PoC) for an AI-powered agentic system using Microsoftās AutoGen framework. Hereās the kicker: this was a 3-week PoC sprint bringing together two teams from different organizations who had never worked together before. We needed a collaborative environment that could be spun up quickly, require minimal setup effort, and allow everyone to hit the ground running from day one.
The project requirements were complex enough, but the real challenge? Four developers worked from a highly restricted corporate environment where installing Python, VS Code, or any development tools was strictly prohibited. The remaining four worked from our offices but couldnāt access the clientās internal systems directly.
We tried the usual approaches:
- RDP connections: Blocked by security policies
- VPN access: Denied due to compliance requirements
- Local development with file sharing: Immediate sync issues and āworks on my machineā problems
- Cloud IDEs: Didnāt meet the clientās security requirements
Just when we thought weād have to resort to the dreaded ādevelop locally and pray it works in productionā approach, we discovered a solution that not only solved our immediate problem but revolutionized how we approach distributed development.
The Architecture That Worked For Us
Hereās a visual representation of what we built, everyone had to work on their personal (non-corporate) laptops for this to work.
flowchart TD A["ļæ½ 8 Developers on Personal Laptops
4 Restricted + 4 External Teams"] B["ļæ½ SSH + VS Code Remote Connection
Certificate-based Authentication"] C["āļø Azure VM (Standard D8s v3)
8 vCPUs ⢠32GB RAM ⢠Ubuntu 22.04"] D["š¤ Individual User Accounts
user1, user2, user3... user8"] E["š³ Shared Dev Container
Python 3.12 + AutoGen + Azure CLI
All Dependencies Pre-installed"] F["š Shared Development Resources
⢠Project Repository
⢠Datasets & Models
⢠Configuration Files"] G["ā Results Achieved
94% Faster Onboarding
$400/month vs $16k laptops
Enhanced Security"] A --> B B --> C C --> D D --> E E --> F F --> G style A fill:#e3f2fd,stroke:#1976d2,stroke-width:3px,color:#000 style B fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px,color:#000 style C fill:#e1f5fe,stroke:#0277bd,stroke-width:3px,color:#000 style D fill:#fff3e0,stroke:#f57c00,stroke-width:3px,color:#000 style E fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px,color:#000 style F fill:#fff3e0,stroke:#f57c00,stroke-width:3px,color:#000 style G fill:#e8f5e8,stroke:#388e3c,stroke-width:3px,color:#000
Lets check out how this was built and setupā¦
The Deep Dive: How We Built It
Step 1: Provisioning the Azure VM
We started with a Linux VM in Azure. After some testing, we settled on a Standard D8s v3 instance (8 vCPUs, 32 GB RAM) which provided enough resources for all eight developers to work simultaneously without performance issues.
1 | # VM Creation (simplified for clarity) |
Step 2: User Account Architecture
Instead of having everyone share a single account (security nightmare!), we created individual Linux user accounts for each developer. This approach gave us:
- Audit trails: We could track who did what and when
- Personalized environments: Each developer could customize their shell, aliases, and local configs
- Security isolation: Problems with one account wouldnāt affect others
- Resource monitoring: We could track resource usage per developer if needed
Hereās how we automated user creation:
1 |
|
Step 3: Certificate-Based Authentication
Password authentication over the internet? Not on our watch. We implemented certificate-based SSH authentication for each developer:
1 | # On each developer's local machine |
The beauty of this approach:
- No passwords to remember or rotate
- Certificates could be revoked instantly if needed
- Multi-factor authentication could be added via Azure AD if required
- Worked seamlessly even from the restricted environment (SSH client was available)
Step 4: VS Code Remote Development Magic
This is where the magic happened. VS Codeās Remote-SSH extension turned our Linux VM into a powerful development environment. Each developer configured their VS Code with:
1 | // .ssh/config on developer machine |
Once connected, developers had the full VS Code experience:
- IntelliSense working perfectly
- Debugging capabilities
- Extension support
- Integrated terminal
- Git integration
But we didnāt stop thereā¦
Step 5: The Dev Container Revolution
Hereās where we went from āgoodā to āgame-changing.ā We created a Dev Container that encapsulated our entire development environment. This meant:
No more āpip installā parties: Everything was pre-installed
No more version conflicts: Everyone used the exact same versions
No more missing dependencies: If it worked for one, it worked for all
Our .devcontainer/devcontainer.json
:
1 | { |
Step 6: Shared Resources and Collaboration
With everyone working on the same VM, we could leverage shared resources effectively:
1 | # Shared directories for common resources |
The Unexpected Benefits
1. Lightning-Fast Onboarding
Our typical onboarding process used to take 2-3 days:
- Day 1: Install Python, configure environment
- Day 2: Debug dependency issues, version conflicts
- Day 3: Finally start actual development
With our new setup:
- Hour 1: Receive SSH certificate and connection instructions
- Hour 2: Connect VS Code, open project in container
- Hour 3: Writing production code
Thatās a 94% reduction in onboarding time!
2. Compute Power Democracy
Previously, developers with older laptops struggled with AI model training and testing. Now everyone had access to:
- 8 vCPUs for parallel processing
- 32 GB RAM for large datasets
- Fast SSD storage for quick I/O
- Azureās network backbone for downloading models and datasets
3. Cost Optimization That Surprised Finance
Our finance team loved this approach:
- Traditional approach: 8 high-spec laptops = ~$16,000
- Our approach: 1 Azure VM = ~$400/month
Even accounting for the VM running 24/7, we saved money within the first year.
4. Security Without Suffering
The restricted environment developers could finally contribute without compromising security:
- No software installed on their local machines
- All code remained in the cloud
- Audit logs for every action
- Easy to revoke access when project ended
Real-World Results: The AutoGen Project
Let me share some specific wins from our AutoGen AI agent project:
Development Velocity
- Before: 2-3 features per sprint (too much time on environment issues)
- After: 8-10 features per sprint (focus on actual development)
Code Quality
- Before: āWorks on my machineā was a daily phrase
- After: If it worked in the dev container, it worked everywhere
Team Morale
- Before: Frustration with environment setup and restrictions
- After: Developers focused on solving interesting AI problems
Specific AutoGen Benefits
Working with AutoGen requires multiple AI models, API keys, and complex configurations. Our setup handled this beautifully:
1 | # Shared configuration file accessible to all |
Lessons Learned and Best Practices
What Worked Well
Start with more resources than you think you need: We initially tried a smaller VM and hit performance issues. Better to scale down than suffer with poor performance.
Invest time in the Dev Container setup: Every hour spent perfecting the container saved days of debugging later.
Document everything: We created a comprehensive wiki with:
- Connection instructions
- Troubleshooting guides
- Best practices for shared development
- Git workflow for the shared environment
Regular backups: We automated daily backups of the entire VM and home directories.
Challenges We Faced
Concurrent file editing: We needed clear Git workflows to prevent conflicts
- Solution: Feature branches and frequent commits
Resource contention: Occasionally, one developerās process would hog resources
- Solution: Implemented resource limits using cgroups
SSH connection drops: Some developers faced connection issues
- Solution: Configured SSH keep-alive and implemented tmux for session persistence
Security Considerations
Donāt forget these crucial security aspects:
1 | # Implement fail2ban for SSH protection |
Conclusion
What started as a desperate attempt to enable collaboration across restricted environments turned into a revolutionary approach to distributed development. By leveraging Azure VMs, Dev Containers, and VS Code Remote Development, we not only solved our immediate problem but discovered a solution that offers:
- 94% faster onboarding for new team members
- Significant cost savings compared to traditional hardware approaches
- Enhanced security without sacrificing developer productivity
- True collaboration through shared resources and environments
- Consistent development experience across all team members
The key insight was recognizing that personal laptops could serve as the bridge between restricted corporate environments and cloud-based development infrastructure. Sometimes the best solutions come from thinking outside the traditional corporate IT box.
Whether youāre dealing with similar restrictions or simply want to improve your teamās development experience, this architecture pattern could be the game-changer youāre looking for. The combination of Azure infrastructure, containerized development environments, and modern remote development tools creates a powerful platform that scales with your teamās needs.
References
How We United 8 Developers Across Restricted Environments Using Azure VMs and Dev Containers