فارسی

با بهترین شیوه‌های Terraform برای زیرساخت به عنوان کد، استقرار زیرساخت جهانی خود را به طور کارآمد مدیریت، خودکار و مقیاس‌پذیر کنید.

زیرساخت به عنوان کد: بهترین شیوه‌ها در Terraform برای تیم‌های جهانی

در دنیای ابری امروز، زیرساخت به عنوان کد (IaC) به یک روش ضروری برای مدیریت و خودکارسازی استقرارهای زیرساخت تبدیل شده است. Terraform، یک ابزار محبوب IaC از شرکت HashiCorp، به تیم‌ها اجازه می‌دهد تا زیرساخت را با استفاده از یک زبان پیکربندی اعلانی (declarative) تعریف و فراهم کنند. این پست وبلاگ، بهترین شیوه‌های ضروری Terraform را تشریح می‌کند تا به تیم‌های جهانی کمک کند زیرساخت خود را به طور مؤثر مدیریت کرده، همکاری را بهبود بخشیده و یکپارچگی را در محیط‌های مختلف تضمین کنند.

چرا Terraform و زیرساخت به عنوان کد؟

قبل از پرداختن به بهترین شیوه‌ها، بیایید مزایای استفاده از Terraform و IaC را درک کنیم:

رویکرد اعلانی Terraform، اکوسیستم providerها و پشتیبانی قوی جامعه، آن را به گزینه‌ای قدرتمند برای مدیریت زیرساخت در ارائه‌دهندگان ابری مختلف و محیط‌های داخلی (on-premise) تبدیل کرده است. به عنوان مثال، یک شرکت تجارت الکترونیک جهانی ممکن است از Terraform برای مدیریت زیرساخت خود در مناطق AWS در آمریکای شمالی، اروپا و آسیا-اقیانوسیه استفاده کند و از استقرارهای یکپارچه و استفاده بهینه از منابع در سطح جهانی اطمینان حاصل کند.

بهترین شیوه‌های Terraform

۱. زیرساخت خود را ماژولار کنید

ماژول‌های Terraform بسته‌های کد زیرساخت قابل استفاده مجدد و مستقل هستند. ماژولارسازی زیرساخت شما، قابلیت استفاده مجدد از کد را ترویج می‌دهد، نگهداری را ساده‌تر کرده و همکاری را بهبود می‌بخشد. یک ماژول خوب طراحی شده، اجزای خاص زیرساخت را در بر می‌گیرد و درک، تست و استقرار آن را آسان‌تر می‌کند.

مزایای ماژولارسازی:

مثال:

یک ماژول برای ایجاد یک Virtual Private Cloud (VPC) در AWS را در نظر بگیرید. این ماژول ایجاد VPC، subnets، route tables و security groups را در بر می‌گیرد. سپس تیم‌های دیگر می‌توانند از این ماژول برای ایجاد VPC در حساب‌ها یا مناطق مختلف AWS استفاده کنند.

# vpc_module/main.tf
resource "aws_vpc" "main" {
 cidr_block = var.cidr_block
 enable_dns_hostnames = true
 enable_dns_support = true

 tags = {
 Name = var.vpc_name
 }
}

resource "aws_subnet" "private" {
 count = length(var.private_subnet_cidrs)
 vpc_id = aws_vpc.main.id
 cidr_block = var.private_subnet_cidrs[count.index]
 availability_zone = data.aws_availability_zones.available.names[count.index]

 tags = {
 Name = format("%s-private-%02d", var.vpc_name, count.index + 1)
 }
}

output "vpc_id" {
 value = aws_vpc.main.id
}
# main.tf (با استفاده از ماژول VPC)
module "vpc" {
 source = "./vpc_module"
 vpc_name = "my-global-vpc"
 cidr_block = "10.0.0.0/16"
 private_subnet_cidrs = ["10.0.1.0/24", "10.0.2.0/24"]
}

output "vpc_id" {
 value = module.vpc.vpc_id
}

۲. وضعیت (State) Terraform را به طور مؤثر مدیریت کنید

وضعیت Terraform (Terraform state) یک جزء حیاتی است که منابع دنیای واقعی را به پیکربندی شما نگاشت می‌کند. مدیریت مؤثر وضعیت Terraform برای اطمینان از یکپارچگی و ثبات زیرساخت شما ضروری است. استفاده از ذخیره‌سازی وضعیت از راه دور (remote state) یک روش برتر است، به خصوص برای تیم‌هایی که به صورت مشترک کار می‌کنند.

مزایای ذخیره‌سازی وضعیت از راه دور:

مثال:

استفاده از AWS S3 و DynamoDB برای ذخیره‌سازی وضعیت از راه دور و قفل‌گذاری:

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

ملاحظات مهم:

۳. از متغیرها و اعتبارسنجی ورودی استفاده کنید

متغیرها به شما امکان می‌دهند تا پیکربندی‌های Terraform خود را پارامتری کنید و آن‌ها را انعطاف‌پذیرتر و قابل استفاده مجدد سازید. از متغیرها برای تعریف مقادیر قابل تنظیم مانند اندازه نمونه‌ها، نام مناطق و تگ‌های منابع استفاده کنید. اعتبارسنجی ورودی را برای اطمینان از اینکه متغیرها نوع صحیح دارند و محدودیت‌های خاصی را برآورده می‌کنند، پیاده‌سازی کنید.

مزایای متغیرها و اعتبارسنجی ورودی:

مثال:

# variables.tf
variable "instance_type" {
 type = string
 description = "نوع نمونه EC2 برای راه‌اندازی."
 default = "t2.micro"
 validation {
 condition = contains(["t2.micro", "t3.small", "m5.large"], var.instance_type)
 error_message = "نوع نمونه نامعتبر است. از بین t2.micro، t3.small یا m5.large انتخاب کنید."
 }
}

variable "region" {
 type = string
 description = "منطقه AWS برای استقرار منابع."
 default = "us-east-1"
}
# main.tf
resource "aws_instance" "example" {
 ami = data.aws_ami.amazon_linux.id
 instance_type = var.instance_type
 tags = {
 Name = "Example Instance"
 }
}

۴. کنترل نسخه و CI/CD را پیاده‌سازی کنید

پیکربندی‌های Terraform خود را در یک سیستم کنترل نسخه (مانند Git) ذخیره کنید تا تغییرات را ردیابی کرده، با اعضای تیم همکاری کنید و در صورت نیاز به نسخه‌های قبلی بازگردید. Terraform را با یک پایپ‌لاین یکپارچه‌سازی مداوم/استقرار مداوم (CI/CD) ادغام کنید تا تست و استقرار زیرساخت خود را خودکار کنید.

مزایای کنترل نسخه و CI/CD:

گردش کار نمونه CI/CD:

  1. توسعه‌دهندگان تغییرات را در پیکربندی Terraform در یک مخزن Git ثبت (commit) می‌کنند.
  2. یک ابزار CI/CD (مانند Jenkins، GitLab CI، GitHub Actions) یک پایپ‌لاین را راه‌اندازی می‌کند.
  3. پایپ‌لاین دستور `terraform validate` را برای بررسی سینتکس پیکربندی اجرا می‌کند.
  4. پایپ‌لاین دستور `terraform plan` را برای پیش‌نمایش تغییراتی که اعمال خواهند شد، اجرا می‌کند.
  5. پایپ‌لاین برای ادامه استقرار نیاز به تأیید از یک عضو تیم دارد.
  6. پس از تأیید، پایپ‌لاین دستور `terraform apply` را برای استقرار تغییرات در زیرساخت اجرا می‌کند.
# .gitlab-ci.yml
stages:
 - validate
 - plan
 - apply

validate:
 stage: validate
 image: hashicorp/terraform:latest
 script:
 - terraform init
 - terraform validate

plan:
 stage: plan
 image: hashicorp/terraform:latest
 script:
 - terraform init
 - terraform plan -out=tfplan
 artifacts:
 paths:
 - tfplan

apply:
 stage: apply
 image: hashicorp/terraform:latest
 script:
 - terraform init
 - terraform apply tfplan
 only:
 - master
 when: manual

۵. از یک قرارداد نام‌گذاری یکپارچه پیروی کنید

یک قرارداد نام‌گذاری یکپارچه برای منابع زیرساخت خود ایجاد کنید تا خوانایی، قابلیت نگهداری و جستجو را بهبود بخشید. از نام‌های معنادار و توصیفی استفاده کنید که به وضوح هدف و محیط منبع را نشان می‌دهند. به عنوان مثال، به جای فقط «ec2_instance»، از «web-server-prod-ec2» استفاده کنید.

مزایای یک قرارداد نام‌گذاری یکپارچه:

مثال:

یک قرارداد نام‌گذاری ممکن است شامل نوع منبع، محیط و یک شناسه منحصر به فرد باشد:

از متغیرها برای تولید پویای نام منابع بر اساس قرارداد نام‌گذاری خود استفاده کنید:

variable "environment" {
 type = string
 description = "محیط (مانند prod، staging، dev)."
}

resource "aws_instance" "example" {
 ami = data.aws_ami.amazon_linux.id
 instance_type = "t2.micro"
 tags = {
 Name = format("web-server-%s", var.environment)
 }
}

۶. داده‌های حساس را ایمن کنید

از قرار دادن داده‌های حساس (مانند رمزهای عبور، کلیدهای API، گواهی‌نامه‌ها) به صورت مستقیم (hardcode) در پیکربندی‌های Terraform خود اجتناب کنید. به جای آن، از روش‌های امن برای مدیریت و تزریق داده‌های حساس به زیرساخت خود استفاده کنید.

روش‌های ایمن‌سازی داده‌های حساس:

مثال با استفاده از AWS Secrets Manager:

# data.tf
data "aws_secretsmanager_secret" "db_password" {
 name = "db_password"
}

data "aws_secretsmanager_secret_version" "db_password" {
 secret_id = data.aws_secretsmanager_secret.db_password.id
}

output "database_password" {
 value = data.aws_secretsmanager_secret_version.db_password.secret_string
 sensitive = true
}

ملاحظات امنیتی مهم:

۷. کد زیرساخت خود را تست کنید

استراتژی‌های تست را برای اطمینان از صحت و قابلیت اطمینان پیکربندی‌های Terraform خود پیاده‌سازی کنید. تست می‌تواند به شما کمک کند تا خطاها را در مراحل اولیه توسعه شناسایی کنید، خطر خرابی زیرساخت را کاهش دهید و کیفیت کلی کد خود را بهبود بخشید.

استراتژی‌های تست:

ابزارهای تست Terraform:

مثال با استفاده از Terratest:

// test/vpc_test.go
package test

import (
 "testing"

 "github.com/gruntwork-io/terratest/modules/terraform"
 "github.com/stretchr/testify/assert"
)

func TestVPC(t *testing.T) {
 t.Parallel()

 terraformOptions := &terraform.Options{
 TerraformDir: "../vpc_module",
 Variables: map[string]interface{}{
 "vpc_name": "test-vpc",
 "cidr_block": "10.0.0.0/16",
 "private_subnet_cidrs": []string{"10.0.1.0/24", "10.0.2.0/24"},
 },
 }

 defer terraform.Destroy(t, terraformOptions)

 terraform.InitAndApply(t, terraformOptions)

 vpcID := terraform.Output(t, terraformOptions, "vpc_id")

 assert.NotEmpty(t, vpcID)
}

۸. از اصل DRY (خودتان را تکرار نکنید) پیروی کنید

اصل DRY (Don't Repeat Yourself) از تکرار کد جلوگیری می‌کند. در Terraform، این به معنای استفاده از ماژول‌ها، متغیرها و data sources برای انتزاعی کردن پیکربندی‌های مشترک و جلوگیری از تکرار کد یکسان در چندین مکان است. پایبندی به اصل DRY قابلیت نگهداری را بهبود می‌بخشد، خطر خطاها را کاهش می‌دهد و کد شما را مختصرتر و خواناتر می‌کند.

مثال:

به جای تعریف قوانین security group یکسان در چندین بلوک resource، یک ماژول ایجاد کنید که security group و قوانین آن را در بر می‌گیرد. سپس، از آن ماژول در مکان‌های مختلف استفاده مجدد کنید و متغیرها را برای سفارشی‌سازی قوانین در صورت نیاز به آن ارسال کنید.

۹. نسخه‌های Terraform و Provider را به طور منظم به‌روزرسانی کنید

نسخه‌های Terraform و provider خود را به‌روز نگه دارید تا از ویژگی‌های جدید، رفع اشکالات و وصله‌های امنیتی بهره‌مند شوید. به طور منظم یادداشت‌های انتشار (release notes) Terraform و provider خود را بررسی کنید تا تغییرات و تأثیرات احتمالی بر زیرساخت خود را درک کنید. از محدودیت‌های نسخه Terraform برای مشخص کردن نسخه‌های قابل قبول Terraform و providerها در پیکربندی خود استفاده کنید.

مثال:

terraform {
 required_version = ">= 1.0.0"

 required_providers {
 aws = {
 source = "hashicorp/aws"
 version = "~> 3.0"
 }
 }
}

۱۰. زیرساخت خود را مستندسازی کنید

کد زیرساخت خود را مستند کنید تا هدف، عملکرد و نحوه استفاده از اجزای مختلف را توضیح دهید. مستندات خوب به اعضای تیم کمک می‌کند تا زیرساخت را، به ویژه در محیط‌های پیچیده، درک و نگهداری کنند. از کامنت‌ها در کد خود برای توضیح منطق و تصمیمات پیچیده استفاده کنید. برای هر ماژول یک فایل README ایجاد کنید تا یک نمای کلی از عملکرد و نحوه استفاده آن ارائه دهد.

عناصر مستندات خوب:

نتیجه‌گیری

پیاده‌سازی این بهترین شیوه‌های Terraform می‌تواند به طور قابل توجهی کارایی، قابلیت اطمینان و امنیت استقرارهای زیرساخت شما را بهبود بخشد. با ماژولارسازی کد خود، مدیریت مؤثر وضعیت، استفاده از متغیرها و اعتبارسنجی ورودی، پیاده‌سازی کنترل نسخه و CI/CD، پیروی از یک قرارداد نام‌گذاری یکپارچه، ایمن‌سازی داده‌های حساس، تست کد، پایبندی به اصل DRY، به‌روز نگه داشتن نسخه‌ها و مستندسازی زیرساخت خود، می‌توانید یک زیرساخت قوی و مقیاس‌پذیر بسازید که نیازهای تیم جهانی شما را برآورده کند. به یاد داشته باشید که IaC یک فرآیند مداوم است، بنابراین به طور مداوم شیوه‌های خود را بر اساس تجربیات و نیازمندی‌های در حال تحول خود اصلاح کنید. از قدرت Terraform برای خودکارسازی و ساده‌سازی مدیریت زیرساخت خود بهره‌مند شوید و به تیم خود این امکان را بدهید که بر ارائه ارزش به کسب و کار شما تمرکز کند.

زیرساخت به عنوان کد: بهترین شیوه‌ها در Terraform برای تیم‌های جهانی | MLOG