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 مارچ، 20268 منٹ پڑھیں1.6k الفاظ|

انفراسٹرکچر بطور کوڈ ٹیرافارم کے ساتھ: دستی سے خودکار کلاؤڈ مینجمنٹ تک

انفراسٹرکچر کو کوڈ (IaC) کے طور پر استعمال کرنے والی تنظیمیں 90% تیزی سے ماحول فراہم کرتی ہیں اور انفراسٹرکچر کو دستی طور پر مینیج کرنے والوں کے مقابلے میں 60% کم کنفیگریشن سے متعلق بندش کا تجربہ کرتی ہیں۔ Terraform غالب IaC ٹول کے طور پر ابھرا ہے، جس میں 3,000 سے زیادہ فراہم کنندگان ہر بڑے کلاؤڈ پلیٹ فارم اور SaaS کو سپورٹ کر رہے ہیں۔

یہ گائیڈ ویب ایپلیکیشنز، ERP سسٹمز، اور ای کامرس پلیٹ فارمز کے لیے عملی Terraform کے استعمال کا احاطہ کرتا ہے --- آپ کی پہلی وسائل کی تعریف سے لے کر پروڈکشن گریڈ ملٹی انوائرنمنٹ تعیناتیوں تک۔

اہم ٹیک ویز

  • ٹیرافارم ورژن کنٹرول کے ذریعے بنیادی ڈھانچے کی تبدیلیوں کو قابل جائزہ، قابل جانچ، اور الٹنے کے قابل بناتا ہے۔
  • ریموٹ اسٹیٹ مینجمنٹ تنازعات کو روکتا ہے جب متعدد انجینئرز انفراسٹرکچر میں ترمیم کرتے ہیں۔
  • ماڈیولز دوبارہ قابل استعمال نمونوں کو سمیٹتے ہیں، ترتیب کو سینکڑوں لائنوں سے چند پیرامیٹرز تک کم کرتے ہیں۔
  • Terraform Cloud یا CI/CD انٹیگریشن محفوظ تبدیلیوں کے لیے لاگو کرنے سے پہلے منصوبہ بندی کو نافذ کرتا ہے

ایس ایم بی کے لیے ٹیرافارم کیوں

دستی انفراسٹرکچر کا مسئلہ

IaC کے بغیر، آپ کا بنیادی ڈھانچے کا علم اس میں رہتا ہے:

  • AWS Console کلک پاتھز جن کا کسی نے دستاویز نہیں کیا۔
  • ایس ایس ایچ کمانڈز مہینوں پہلے چلتی ہیں جو کسی کو یاد نہیں۔
  • کنفیگریشن فائلیں براہ راست سرورز پر ترمیم کی گئیں۔
  • "نیٹ ورک کیسے کام کرتا ہے" کا ایک انجینئر کا ذہنی ماڈل

Terraform کے ساتھ، آپ کا بنیادی ڈھانچہ Git میں رہتا ہے۔ ہر تبدیلی ایک پل کی درخواست ہے۔ ہر تعیناتی قابل تولید ہے۔ ہر انجینئر پوری تصویر سمجھ سکتا ہے۔

بنیادی تصورات

تصورتفصیل
فراہم کنندہپلگ ان جو کلاؤڈ پلیٹ فارم کے ساتھ انٹرفیس کرتا ہے (AWS, GCP, Azure, Cloudflare)
وسائلایک بنیادی ڈھانچے کا جزو (EC2 مثال، RDS ڈیٹا بیس، S3 بالٹی)
ڈیٹا ماخذموجودہ انفراسٹرکچر کا صرف پڑھنے کا حوالہ
متغیردوبارہ قابل استعمال کنفیگریشن کے لیے ان پٹ پیرامیٹر
آؤٹ پٹٹیرافارم کنفیگریشن سے برآمد شدہ قیمت
ریاستTerraform کیا انتظام کرتا ہے اور اس کی موجودہ خصوصیات کا ریکارڈ
ماڈیولایک متعین انٹرفیس کے ساتھ وسائل کا دوبارہ قابل استعمال گروپ

پہلی ٹیرافارم کنفیگریشن

ویب ایپلیکیشن کے لیے 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 چلانے سے روکتا ہے، جو ریاست کو خراب کر سکتا ہے۔

اسٹیٹ فائل سیکیورٹی

Terraform اسٹیٹ فائل میں ڈیٹا بیس پاس ورڈز، API کیز، اور وسائل کی IDs سمیت حساس معلومات شامل ہیں۔ اس کی حفاظت کریں:

  • باقی میں خفیہ کاری: S3 بالٹی ورژننگ + سرور سائیڈ انکرپشن
  • ٹرانزٹ میں انکرپٹ: HTTPS صرف ریاستی رسائی کے لیے
  • رسائی کو محدود کریں: IAM کی پالیسیاں یہ محدود کرتی ہیں کہ کون پڑھ/لکھ سکتا ہے۔
  • گٹ کے ساتھ کبھی بھی عہد نہ کریں: اسٹیٹ فائلز کو کبھی بھی ورژن کنٹرول میں نہیں ہونا چاہیے۔
  • ورژننگ کو فعال کریں: S3 ورژننگ خراب حالت سے بازیافت کی اجازت دیتی ہے۔

CI/CD انٹیگریشن

گٹ ہب ایکشنز ٹیرافارم پائپ لائن

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.micro / t3.small<$100/مہینہ
سٹیجنگپری پروڈکشن کی توثیقآئینے کی پیداوار (چھوٹا)~30% پیداوار
پیداوارلائیو ٹریفکلوڈ کے لیے دائیں سائز کاآپٹمائزڈ

Terraform ورک اسپیسز یا فی ماحول کے لیے علیحدہ ڈائریکٹریز استعمال کریں:

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

اکثر پوچھے گئے سوالات

Terraform یا Pulumi --- ہمیں کس کا انتخاب کرنا چاہیے؟

Terraform اگر آپ کی ٹیم میں آپریشن انجینئرز شامل ہیں جو اعلانیہ ترتیب کو ترجیح دیتے ہیں۔ پلومی اگر آپ کی ٹیم ڈویلپر بھاری ہے اور ٹائپ اسکرپٹ یا ازگر میں بنیادی ڈھانچہ لکھنے کو ترجیح دیتی ہے۔ Terraform میں ایک بڑا ماحولیاتی نظام اور زیادہ کمیونٹی ماڈیولز ہیں۔ پلومی میں ابتدائی سیکھنے کا منحنی خطوط ہے لیکن یہ پیچیدہ منطق کے لیے زیادہ لچکدار ہے۔

ہم موجودہ انفراسٹرکچر کو Terraform میں کیسے درآمد کرتے ہیں؟

موجودہ وسائل کو Terraform مینجمنٹ کے تحت لانے کے لیے terraform import استعمال کریں۔ مثال کے طور پر: terraform import aws_instance.app i-1234567890abcdef0۔ امپورٹ کرنے کے بعد، مماثل کنفیگریشن لکھیں۔ ٹیرافارم 1.5+ بلک امپورٹس کے لیے کنفیگریشن فائلوں میں امپورٹ بلاکس کو سپورٹ کرتا ہے۔

ہم Terraform میں رازوں کو کیسے ہینڈل کرتے ہیں؟

Terraform فائلوں کے راز کو کبھی بھی خفیہ نہ کریں۔ استعمال کریں۔ حساس متغیرات کو sensitive = true سے نشان زد کریں تاکہ انہیں پلان آؤٹ پٹ میں ظاہر ہونے سے روکا جا سکے۔

Terraform کے انتظام کی قیمت کیا ہے؟

Terraform بذات خود مفت اور اوپن سورس ہے۔ Terraform Cloud کے پاس 5 تک صارفین کے لیے ریموٹ اسٹیٹ اور پلان/ اپلائی کرنے کے لیے ایک مفت ٹائر ہے۔ بنیادی لاگت سیکھنے کا منحنی خطوط ہے (ایک تجربہ کار انجینئر کے لیے 20-40 گھنٹے) اور جاری دیکھ بھال (فی مہینہ 2-4 گھنٹے)۔ یہ مینوئل انفراسٹرکچر مینجمنٹ پر بچائے گئے وقت سے پورا ہوتا ہے۔


آگے کیا آتا ہے۔

ٹیرافارم خودکار بنیادی ڈھانچے کی بنیاد فراہم کرتا ہے۔ اسے خودکار تعیناتی کے لیے CI/CD پائپ لائنز، آپریشنل مرئیت کے لیے مانیٹرنگ اور لچک کے لیے ڈیزاسٹر ریکوری کے ساتھ جوڑیں۔

بنیادی ڈھانچے کی آٹومیشن مشاورت کے لیے ECOSIRE سے رابطہ کریں، یا مکمل روڈ میپ کے لیے ہماری DevOps گائیڈ برائے چھوٹے کاروبار کو دریافت کریں۔


ECOSIRE کے ذریعہ شائع کیا گیا -- کاروباروں کو کلاؤڈ انفراسٹرکچر کو خودکار بنانے میں مدد کرنا۔

E

تحریر

ECOSIRE Research and Development Team

ECOSIRE میں انٹرپرائز گریڈ ڈیجیٹل مصنوعات بنانا۔ Odoo انٹیگریشنز، ای کامرس آٹومیشن، اور AI سے چلنے والے کاروباری حل پر بصیرت شیئر کرنا۔

Chat on WhatsApp