Infrastructure as Code with Terraform: From Manual to Automated Cloud Management

Manage cloud infrastructure with Terraform. Covers HCL syntax, modules, state management, CI/CD integration, and multi-environment deployment strategies.

E
ECOSIRE Research and Development Team
|16 मार्च 20267 मिनट पढ़ें1.6k शब्द|

टेराफॉर्म के साथ कोड के रूप में इन्फ्रास्ट्रक्चर: मैनुअल से स्वचालित क्लाउड प्रबंधन तक

इंफ्रास्ट्रक्चर को कोड (IaC) प्रावधान वातावरण के रूप में उपयोग करने वाले संगठन मैन्युअल रूप से बुनियादी ढांचे का प्रबंधन करने वालों की तुलना में 90% तेज और 60% कम कॉन्फ़िगरेशन-संबंधी आउटेज का अनुभव करते हैं। टेराफॉर्म प्रमुख IaC टूल के रूप में उभरा है, जिसमें 3,000 से अधिक प्रदाता हर प्रमुख क्लाउड प्लेटफ़ॉर्म और SaaS सेवा का समर्थन करते हैं।

यह मार्गदर्शिका वेब अनुप्रयोगों, ईआरपी सिस्टम और ईकॉमर्स प्लेटफार्मों के लिए व्यावहारिक टेराफ़ॉर्म उपयोग को कवर करती है --- आपकी पहली संसाधन परिभाषा से लेकर उत्पादन-ग्रेड बहु-पर्यावरण परिनियोजन तक।

मुख्य बातें

  • टेराफॉर्म संस्करण नियंत्रण के माध्यम से बुनियादी ढांचे में बदलाव को समीक्षा योग्य, परीक्षण योग्य और प्रतिवर्ती बनाता है
  • जब कई इंजीनियर बुनियादी ढांचे को संशोधित करते हैं तो दूरस्थ राज्य प्रबंधन टकराव को रोकता है
  • मॉड्यूल पुन: प्रयोज्य पैटर्न को समाहित करते हैं, कॉन्फ़िगरेशन को सैकड़ों लाइनों से कुछ मापदंडों तक कम करते हैं
  • टेराफ़ॉर्म क्लाउड या सीआई/सीडी एकीकरण सुरक्षित परिवर्तनों के लिए लागू करने से पहले योजना अनुशासन को लागू करता है

एसएमबी के लिए टेराफॉर्म क्यों

मैनुअल इंफ्रास्ट्रक्चर समस्या

IaC के बिना, आपका बुनियादी ढांचा ज्ञान इसमें रहता है:

  • AWS कंसोल उन पथों पर क्लिक करता है जिनका किसी ने दस्तावेज़ीकरण नहीं किया है
  • SSH कमांड महीनों पहले चलते हैं जो किसी को याद नहीं रहते
  • कॉन्फ़िगरेशन फ़ाइलें सीधे सर्वर पर संपादित की गईं
  • एक इंजीनियर का मानसिक मॉडल "नेटवर्क कैसे काम करता है"

टेराफॉर्म के साथ, आपका बुनियादी ढांचा Git में रहता है। प्रत्येक परिवर्तन एक पुल अनुरोध है। प्रत्येक परिनियोजन प्रतिलिपि प्रस्तुत करने योग्य है. हर इंजीनियर पूरी तस्वीर समझ सकता है।

मूल अवधारणाएँ

संकल्पनाविवरण
प्रदाताप्लगइन जो क्लाउड प्लेटफ़ॉर्म (AWS, GCP, Azure, Cloudflare) के साथ इंटरफ़ेस करता है
संसाधनएक एकल अवसंरचना घटक (EC2 उदाहरण, RDS डेटाबेस, S3 बकेट)
डेटा स्रोतमौजूदा बुनियादी ढांचे का केवल पढ़ने योग्य संदर्भ
परिवर्तनीयपुन: प्रयोज्य कॉन्फ़िगरेशन के लिए इनपुट पैरामीटर
आउटपुटटेराफॉर्म कॉन्फ़िगरेशन से निर्यातित मूल्य
राज्यटेराफ़ॉर्म क्या प्रबंधित करता है और इसकी वर्तमान विशेषताओं का रिकॉर्ड
मॉड्यूलपरिभाषित इंटरफ़ेस के साथ संसाधनों का पुन: प्रयोज्य समूह

पहला टेराफॉर्म कॉन्फ़िगरेशन

वेब एप्लिकेशन के लिए AWS VPC और EC2

# providers.tf
terraform {
  required_version = ">= 1.7"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }

  backend "s3" {
    bucket = "ecosire-terraform-state"
    key    = "production/terraform.tfstate"
    region = "us-east-1"
    encrypt = true
    dynamodb_table = "terraform-locks"
  }
}

provider "aws" {
  region = var.aws_region
}

# variables.tf
variable "aws_region" {
  type    = string
  default = "us-east-1"
}

variable "environment" {
  type    = string
  default = "production"
}

variable "instance_type" {
  type    = string
  default = "t3.large"
}

# main.tf
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name        = "${var.environment}-vpc"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

resource "aws_subnet" "public" {
  count             = 2
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.${count.index + 1}.0/24"
  availability_zone = data.aws_availability_zones.available.names[count.index]

  map_public_ip_on_launch = true

  tags = {
    Name = "${var.environment}-public-${count.index + 1}"
  }
}

resource "aws_instance" "app" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = var.instance_type
  subnet_id     = aws_subnet.public[0].id

  vpc_security_group_ids = [aws_security_group.app.id]
  key_name               = aws_key_pair.deploy.key_name

  root_block_device {
    volume_size = 50
    volume_type = "gp3"
    encrypted   = true
  }

  tags = {
    Name        = "${var.environment}-app"
    Environment = var.environment
  }
}

resource "aws_db_instance" "postgres" {
  identifier     = "${var.environment}-db"
  engine         = "postgres"
  engine_version = "17"
  instance_class = "db.t3.medium"

  allocated_storage     = 50
  max_allocated_storage = 200
  storage_encrypted     = true

  db_name  = "ecosire"
  username = "app"
  password = var.db_password

  vpc_security_group_ids = [aws_security_group.db.id]
  db_subnet_group_name   = aws_db_subnet_group.main.name

  backup_retention_period = 7
  backup_window           = "03:00-04:00"
  maintenance_window      = "sun:04:00-sun:05:00"

  skip_final_snapshot = false
  final_snapshot_identifier = "${var.environment}-db-final"

  tags = {
    Environment = var.environment
  }
}

पुन: प्रयोज्य बुनियादी ढांचे के लिए मॉड्यूल

एक वेब एप्लिकेशन मॉड्यूल बनाना

# modules/web-app/main.tf
variable "name" {
  type = string
}

variable "environment" {
  type = string
}

variable "instance_type" {
  type    = string
  default = "t3.medium"
}

variable "vpc_id" {
  type = string
}

variable "subnet_ids" {
  type = list(string)
}

resource "aws_lb" "app" {
  name               = "${var.name}-${var.environment}-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.alb.id]
  subnets            = var.subnet_ids
}

resource "aws_lb_target_group" "app" {
  name     = "${var.name}-${var.environment}-tg"
  port     = 3000
  protocol = "HTTP"
  vpc_id   = var.vpc_id

  health_check {
    path                = "/health"
    healthy_threshold   = 2
    unhealthy_threshold = 3
    interval            = 30
  }
}

resource "aws_autoscaling_group" "app" {
  name                = "${var.name}-${var.environment}-asg"
  min_size            = 2
  max_size            = 10
  desired_capacity    = 2
  vpc_zone_identifier = var.subnet_ids
  target_group_arns   = [aws_lb_target_group.app.arn]

  launch_template {
    id      = aws_launch_template.app.id
    version = "$Latest"
  }

  tag {
    key                 = "Name"
    value               = "${var.name}-${var.environment}"
    propagate_at_launch = true
  }
}

output "alb_dns_name" {
  value = aws_lb.app.dns_name
}

मॉड्यूल का उपयोग करना

# environments/production/main.tf
module "web" {
  source = "../../modules/web-app"

  name          = "ecosire-web"
  environment   = "production"
  instance_type = "t3.large"
  vpc_id        = module.network.vpc_id
  subnet_ids    = module.network.public_subnet_ids
}

module "api" {
  source = "../../modules/web-app"

  name          = "ecosire-api"
  environment   = "production"
  instance_type = "t3.large"
  vpc_id        = module.network.vpc_id
  subnet_ids    = module.network.public_subnet_ids
}

राज्य प्रबंधन

S3 के साथ रिमोट स्टेट

# Bootstrap: create the state bucket and DynamoDB table manually or with a separate config
resource "aws_s3_bucket" "terraform_state" {
  bucket = "ecosire-terraform-state"

  lifecycle {
    prevent_destroy = true
  }
}

resource "aws_s3_bucket_versioning" "terraform_state" {
  bucket = aws_s3_bucket.terraform_state.id
  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_dynamodb_table" "terraform_locks" {
  name         = "terraform-locks"
  billing_mode = "PAY_PER_REQUEST"
  hash_key     = "LockID"

  attribute {
    name = "LockID"
    type = "S"
  }
}

DynamoDB के माध्यम से स्टेट लॉकिंग दो इंजीनियरों को एक साथ terraform apply चलाने से रोकती है, जो स्थिति को दूषित कर सकती है।

राज्य फ़ाइल सुरक्षा

टेराफॉर्म राज्य फ़ाइल में डेटाबेस पासवर्ड, एपीआई कुंजी और संसाधन आईडी सहित संवेदनशील जानकारी शामिल है। इसकी रक्षा करें:

  • बाकी स्थिति में एन्क्रिप्ट करें: S3 बकेट वर्जनिंग + सर्वर-साइड एन्क्रिप्शन
  • पारगमन में एन्क्रिप्ट करें: HTTPS केवल राज्य पहुंच के लिए
  • पहुंच प्रतिबंधित करें: आईएएम नीतियां यह सीमित करती हैं कि राज्य में कौन पढ़/लिख सकता है
  • कभी भी Git के लिए प्रतिबद्ध न हों: राज्य फ़ाइलें कभी भी संस्करण नियंत्रण में नहीं होनी चाहिए
  • संस्करण सक्षम करें: S3 संस्करण दूषित स्थिति से उबरने की अनुमति देता है

सीआई/सीडी एकीकरण

गिटहब एक्शन टेराफॉर्म पाइपलाइन

name: Terraform
on:
  pull_request:
    paths: ['infrastructure/**']
  push:
    branches: [main]
    paths: ['infrastructure/**']

jobs:
  plan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: hashicorp/setup-terraform@v3

      - name: Terraform Init
        run: terraform init
        working-directory: infrastructure/environments/production

      - name: Terraform Plan
        run: terraform plan -out=tfplan
        working-directory: infrastructure/environments/production

      - name: Comment PR with plan
        if: github.event_name == 'pull_request'
        uses: actions/github-script@v7
        with:
          script: |
            const plan = require('fs').readFileSync('infrastructure/environments/production/tfplan.txt', 'utf8');
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `## Terraform Plan\n\`\`\`\n${plan}\n\`\`\``
            });

  apply:
    needs: plan
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: actions/checkout@v4
      - uses: hashicorp/setup-terraform@v3

      - name: Terraform Apply
        run: terraform apply -auto-approve
        working-directory: infrastructure/environments/production

बहु-पर्यावरण रणनीति

पर्यावरणउद्देश्यउदाहरण आकारलागत लक्ष्य
विकासफ़ीचर परीक्षणt3.माइक्रो / t3.छोटा<$100/माह
मंचनप्री-प्रोडक्शन सत्यापनदर्पण उत्पादन (छोटा)~उत्पादन का 30%
उत्पादनलाइव ट्रैफिकभार के लिए सही आकारअनुकूलित

प्रति परिवेश टेराफ़ॉर्म कार्यस्थान या अलग निर्देशिकाओं का उपयोग करें:

infrastructure/
  modules/
    web-app/
    database/
    network/
  environments/
    development/
      main.tf
      terraform.tfvars
    staging/
      main.tf
      terraform.tfvars
    production/
      main.tf
      terraform.tfvars

अक्सर पूछे जाने वाले प्रश्न

टेराफॉर्म या पुलुमी --- हमें किसे चुनना चाहिए?

यदि आपकी टीम में ऑपरेशन इंजीनियर शामिल हैं जो घोषणात्मक कॉन्फ़िगरेशन पसंद करते हैं तो टेराफॉर्म। पुलुमी यदि आपकी टीम डेवलपर-भारी है और टाइपस्क्रिप्ट या पायथन में बुनियादी ढांचे को लिखना पसंद करती है। टेराफ़ॉर्म में एक बड़ा पारिस्थितिकी तंत्र और अधिक सामुदायिक मॉड्यूल हैं। पुलुमी में शुरुआती सीखने की अवस्था तेज़ है लेकिन जटिल तर्क के लिए यह अधिक लचीला है।

हम मौजूदा बुनियादी ढांचे को टेराफॉर्म में कैसे आयात करते हैं?

मौजूदा संसाधनों को टेराफ़ॉर्म प्रबंधन के अंतर्गत लाने के लिए terraform import का उपयोग करें। उदाहरण के लिए: terraform import aws_instance.app i-1234567890abcdef0. आयात करने के बाद, मिलान कॉन्फ़िगरेशन लिखें। टेराफॉर्म 1.5+ थोक आयात के लिए कॉन्फ़िगरेशन फ़ाइलों में आयात ब्लॉक का समर्थन करता है।

हम टेराफॉर्म में रहस्यों को कैसे संभालते हैं?

टेराफ़ॉर्म फ़ाइलों में कभी भी रहस्य न छिपाएँ। terraform.tfvars (Git से बाहर), पर्यावरण चर (TF_VAR_db_password), या एक रहस्य प्रबंधक (AWS रहस्य प्रबंधक, HashiCorp वॉल्ट) का उपयोग करें। संवेदनशील चरों को योजना आउटपुट में प्रदर्शित होने से रोकने के लिए उन्हें sensitive = true से चिह्नित करें।

टेराफॉर्म के प्रबंधन की लागत क्या है?

टेराफ़ॉर्म स्वयं मुफ़्त और खुला स्रोत है। टेराफॉर्म क्लाउड में दूरस्थ राज्य और योजना/आवेदन वाले अधिकतम 5 उपयोगकर्ताओं के लिए एक निःशुल्क टियर है। मुख्य लागत सीखने की अवस्था (एक अनुभवी इंजीनियर के लिए 20-40 घंटे) और निरंतर रखरखाव (प्रति माह 2-4 घंटे) है। इसकी भरपाई मैन्युअल बुनियादी ढांचे के प्रबंधन पर बचाए गए समय से होती है।


आगे क्या आता है

टेराफॉर्म स्वचालित बुनियादी ढांचे के लिए आधार प्रदान करता है। स्वचालित तैनाती के लिए इसे CI/CD पाइपलाइन, परिचालन दृश्यता के लिए निगरानी और लचीलेपन के लिए आपदा पुनर्प्राप्ति के साथ संयोजित करें।

इन्फ्रास्ट्रक्चर ऑटोमेशन परामर्श के लिए ECOSIRE से संपर्क करें, या संपूर्ण रोडमैप के लिए हमारे छोटे व्यवसायों के लिए DevOps गाइड देखें।


ECOSIRE द्वारा प्रकाशित - व्यवसायों को क्लाउड इंफ्रास्ट्रक्चर को स्वचालित करने में मदद करना।

E

लेखक

ECOSIRE Research and Development Team

ECOSIRE में एंटरप्राइज़-ग्रेड डिजिटल उत्पाद बना रहे हैं। Odoo एकीकरण, ई-कॉमर्स ऑटोमेशन, और AI-संचालित व्यावसायिक समाधानों पर अंतर्दृष्टि साझा कर रहे हैं।

WhatsApp पर चैट करें