VSCode Icon

File

Edit

View

Go

Run

Terminal

Help

Sejoon Kim - Visual Studio Code

Azure Infrastructure Automation

Azure Infrastructure Automation

Modernizing infrastructure automation and project management workflows for CloudCops internal operations and client projects.

Project Overview

As CloudCops scaled to support multiple enterprise clients, manual Azure infrastructure management and fragmented project tracking became bottlenecks. I led the initiative to automate Azure App Registrations, modernize Infrastructure-as-Code practices, and integrate project management workflows.

Key Achievements

85% Time Reduction in Azure App Registrations

Automated manual multi-step workflow:

  • Eliminated 4-step manual process requiring Azure Portal navigation
  • Implemented single-push automated deployment via scripts
  • Removed human errors in permission configuration
  • Standardized security and compliance settings
  • Impact: Deployment time reduced from 30 minutes to under 5 minutes per request

Modernized Infrastructure-as-Code Practices

Reworked script-based Terraform modules:

  • Migrated from script-based Terraform ArgoCD modules to Helm-based architecture
  • Enabled better version control and rollback capabilities
  • Standardized deployment patterns across all client projects
  • Improved maintainability through declarative configuration
  • Impact: 40% reduction in infrastructure drift incidents

Enhanced Project Management Integration

Migrated from fragmented tools to unified workflow:

  • Consolidated Notion and GitHub Issues into integrated Jira workflows
  • Implemented autolink functionality for seamless cross-referencing
  • Improved ticket traceability across development and operations
  • Enhanced team collaboration and visibility
  • Impact: 50% reduction in time spent on project coordination

Technical Architecture

Azure App Registration Automation

Before Automation:

Manual 4-Step Workflow:
1. Navigate to Azure Portal
2. Create App Registration manually
3. Configure permissions (API, Delegated)
4. Generate and securely store client secrets
⏱️ Time: 30 minutes | ❌ Error-prone

After Automation:

Automated Single-Push Workflow:
1. Run automation script with configuration
2. Script handles all Azure operations
3. Automatically configures permissions
4. Securely stores secrets in Key Vault
⏱️ Time: 5 minutes | ✅ Zero errors

High-Level Architecture:

┌─────────────────────┐
│  Request (JSON)     │
│  Configuration      │
└──────────┬──────────┘
           │
           ↓
┌─────────────────────┐
│  Automation Script  │
│  (Python/Terraform) │
└──────────┬──────────┘
           │
           ↓
┌─────────────────────────────────────┐
│         Azure Active Directory       │
│  ┌──────────────────────────────┐  │
│  │   Create App Registration    │  │
│  └──────────────────────────────┘  │
│  ┌──────────────────────────────┐  │
│  │  Configure API Permissions   │  │
│  └──────────────────────────────┘  │
│  ┌──────────────────────────────┐  │
│  │   Generate Client Secret     │  │
│  └──────────────────────────────┘  │
└─────────────────┬───────────────────┘
                  │
                  ↓
         ┌────────────────┐
         │  Azure Key Vault│
         │  Store Secrets  │
         └────────────────┘

Terraform to Helm Migration

Original Architecture (Script-Based):

Terraform Scripts
├── argocd-app-1.tf (hardcoded values)
├── argocd-app-2.tf (duplicated logic)
├── argocd-app-3.tf (manual updates)
└── ... (inconsistent patterns)

Issues:
- Configuration drift between environments
- Difficult version control
- Hard to rollback changes
- Inconsistent naming conventions

Modernized Architecture (Helm-Based):

Helm Charts
├── templates/
│   ├── application.yaml (templated)
│   ├── configmap.yaml (parameterized)
│   └── secret.yaml (secure)
├── values/
│   ├── dev.yaml (environment-specific)
│   ├── staging.yaml
│   └── production.yaml
└── Chart.yaml (versioned)

Benefits:
✅ Declarative configuration
✅ Easy version control and rollback
✅ Standardized deployment patterns
✅ Environment-specific value injection

Jira Integration Architecture

Before Integration:

Scattered Information:
- Technical tasks in GitHub Issues
- Project planning in Notion
- Client requests via Email/Slack
- Documentation in Confluence

Result: ❌ Lost context, duplicate work, poor visibility

After Integration:

Unified Workflow:
┌──────────────┐
│   Jira Epic  │ (Client Project)
└──────┬───────┘
       │
       ├─→ Story 1: Feature Development
       │   └─→ Linked to GitHub PR via autolink
       │
       ├─→ Story 2: Infrastructure Setup
       │   └─→ Linked to Terraform changes
       │
       └─→ Story 3: Security Review
           └─→ Linked to vulnerability reports

Result: ✅ Full traceability, better collaboration

Implementation Details

Azure App Registration Automation

Key Components:

  1. Configuration Management: JSON/YAML schemas for app registration specifications
  2. Azure SDK Integration: Python scripts leveraging Azure SDK for programmatic access
  3. Permission Templates: Pre-defined permission sets for common use cases
  4. Secret Management: Automated rotation and secure storage in Azure Key Vault
  5. Audit Logging: Complete audit trail of all automated operations

Automation Workflow:

# Conceptual workflow (actual implementation confidential)

def create_app_registration(config):
    """
    Automated App Registration creation
    """
    # 1. Validate configuration
    validate_config(config)

    # 2. Create App Registration
    app = azure_client.create_app_registration(
        name=config['name'],
        redirect_uris=config['redirect_uris']
    )

    # 3. Configure API Permissions
    for permission in config['api_permissions']:
        azure_client.add_permission(app.id, permission)

    # 4. Grant admin consent
    azure_client.grant_admin_consent(app.id)

    # 5. Generate and store secret
    secret = azure_client.create_secret(app.id)
    key_vault.store_secret(f"{app.name}-secret", secret)

    # 6. Return app details
    return {
        'app_id': app.id,
        'client_id': app.client_id,
        'tenant_id': app.tenant_id
    }

Helm-Based Terraform Module Structure

Template Example:

# templates/argocd-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: {{ .Values.appName }}
  namespace: argocd
  labels:
    environment: {{ .Values.environment }}
    client: {{ .Values.client }}
spec:
  project: {{ .Values.project }}
  source:
    repoURL: {{ .Values.repoURL }}
    targetRevision: {{ .Values.targetRevision }}
    path: {{ .Values.path }}
    helm:
      valueFiles:
        - values-{{ .Values.environment }}.yaml
  destination:
    server: https://kubernetes.default.svc
    namespace: {{ .Values.namespace }}
  syncPolicy:
    automated:
      prune: {{ .Values.syncPolicy.prune }}
      selfHeal: {{ .Values.syncPolicy.selfHeal }}

Values Structure:

# values/production.yaml
appName: client-app
environment: production
client: raiffeisen
project: client-projects

repoURL: https://git.example.com/client-app
targetRevision: v1.2.3
path: helm-charts

namespace: production

syncPolicy:
  prune: true
  selfHeal: true

Jira Autolink Configuration

Autolink Patterns:

GitHub PR: PR-{issueKey}
  → Links to: https://github.com/org/repo/pull/{issueKey}

Git Commit: {issueKey}
  → Links to: https://github.com/org/repo/commit/{commit-hash}

Terraform Plan: TF-{issueKey}
  → Links to: Internal Terraform state viewer

ArgoCD App: APP-{issueKey}
  → Links to: https://argocd.example.com/applications/{app-name}

Integration Benefits:

  • Automatic linking from Jira tickets to GitHub PRs
  • Direct access to code changes from project management view
  • Traceability from business requirement to deployed code
  • Better context for code reviews and approvals

Challenges & Solutions

Challenge 1: Manual Azure Configuration Bottleneck

Problem: 30-minute manual process for each App Registration created delays

Solution:

  • Analyzed existing manual workflow and identified automation opportunities
  • Built Python scripts leveraging Azure SDK for programmatic access
  • Created configuration templates for common permission patterns
  • Integrated with Azure Key Vault for secure secret storage
  • Result: 85% time reduction (30 min → 5 min) with zero configuration errors

Challenge 2: Infrastructure Drift from Script-Based Terraform

Problem: Hardcoded Terraform scripts led to inconsistent deployments

Solution:

  • Designed Helm chart templates for ArgoCD applications
  • Created environment-specific value files for configuration
  • Implemented version control best practices
  • Standardized naming and labeling conventions
  • Result: 40% reduction in infrastructure drift incidents

Challenge 3: Fragmented Project Management

Problem: Information scattered across Notion, GitHub Issues, and Slack

Solution:

  • Migrated all project tracking to Jira with structured workflows
  • Implemented autolink functionality for GitHub integration
  • Created custom fields for infrastructure and deployment tracking
  • Trained team on unified workflow practices
  • Result: 50% reduction in time spent on project coordination

Performance Metrics

MetricBeforeAfterImprovement
App Registration Time30 min5 min85% faster
Configuration Errors2-3/week0100% reduction
Infrastructure Drift5-6/month2-3/month40% reduction
Project Coordination Time10h/week5h/week50% reduction
Tool Context Switching15x/day3x/day80% reduction

Technologies Used

Cloud & Infrastructure

  • Microsoft Azure: App Registrations, Key Vault, RBAC
  • Terraform: Infrastructure as Code
  • Helm: Kubernetes package management
  • ArgoCD: GitOps continuous delivery

Automation & Scripting

  • Python: Azure SDK automation scripts
  • Bash: Shell scripting for workflows
  • YAML: Configuration management
  • Jinja2: Template rendering

Project Management

  • Jira: Project tracking and workflow management
  • Jira API: Custom integrations and automation
  • GitHub: Version control and code review
  • Notion (migrated from): Documentation and notes

Skills Demonstrated

Cloud Platform Expertise

  • Azure Active Directory management
  • Azure Key Vault integration
  • Azure RBAC configuration
  • Cloud security best practices

Infrastructure as Code

  • Terraform module development
  • Helm chart creation and customization
  • Configuration templating
  • Version control strategies

Process Automation

  • Workflow analysis and optimization
  • Script development for repetitive tasks
  • Integration between multiple platforms
  • Error handling and logging

Project Management

  • Tool evaluation and migration
  • Team workflow optimization
  • Cross-functional collaboration
  • Documentation and training

Business Impact

  • Improved Productivity: 85% faster Azure infrastructure provisioning
  • Enhanced Reliability: Zero configuration errors through automation
  • Better Collaboration: 50% less time spent on project coordination
  • Reduced Technical Debt: Standardized IaC patterns across all projects
  • Improved Compliance: Automated audit trails for all infrastructure changes

Key Learnings

  1. Automate Repetitive Tasks: Even 30-minute manual tasks add up quickly
  2. Standardization Prevents Drift: Helm templates enforce consistency
  3. Integration Reduces Friction: Unified tools improve team velocity
  4. Security by Default: Automation enables better security practices
  5. Documentation Matters: Clear runbooks are essential for team scalability

Future Enhancements

  • Self-Service Portal: Internal platform for developers to request infrastructure
  • Policy-as-Code: Implement Azure Policy for automated compliance
  • Cost Optimization: Automated resource tagging and cost allocation
  • Advanced Monitoring: CloudWatch/Application Insights integration
  • Multi-Cloud Support: Extend automation patterns to AWS and GCP

Note: This project involves CloudCops internal infrastructure and client projects. Technical descriptions are generalized to protect proprietary information while demonstrating key concepts and achievements.