برنامه نویسی

ماژول‌ها و فضاهای کاری Terraform: تکنیک‌هایی برای زیرساخت‌های مدولار و مقیاس‌پذیر در AWS

Summarize this content to 400 words in Persian Lang مدیریت زیرساخت یک کار چالش برانگیز در هنگام برخورد با زیرساخت های پیچیده و تیم های متعدد است. خوشبختانه Terraform به عنوان ابزار تامین کننده قادر است این فرآیند را با استفاده از ماژول ها و فضاهای کاری ساده کند. این به شما امکان می دهد زیرساخت های مدولار، قابل استفاده مجدد و مقیاس پذیر بسازید.
در این پست، چند تکنیک برای ایجاد و مدیریت ماژول‌ها و فضاهای کاری Terraform را با پوشش‌های زیر بررسی می‌کنیم:

ایجاد ماژول های قابل استفاده مجدد
مدیریت وابستگی های ماژول
استفاده از فضاهای کاری Terraform
متغیرها را برای فضاهای کاری و محیط ها جدا کنید

1. ایجاد ماژول های قابل استفاده مجدد

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

مثال ماژول Terraform:
مثالی از ایجاد ماژول برای منابع مرتبط با AWS S3 و نحوه پارامتریزه کردن ماژول برای استفاده مجدد در پروژه:

resource “aws_s3_bucket” “example” {
bucket = var.bucket_name
}

resource “aws_s3_bucket_public_access_block” “example” {
bucket = aws_s3_bucket.example.id

block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}

resource “aws_s3_bucket_versioning” “example” {
bucket = aws_s3_bucket.example.id
versioning_configuration {
status = var.s3_versioning
}
}

resource “aws_s3_bucket_policy” “example” {
bucket = aws_s3_bucket.example.id
policy = var.s3_bucket_policy
}

variable “bucket_name” {
description = “The name of the bucket”
type = string
}

variable “s3_bucket_policy” {
description = “Value of the s3 bucket policy”
type = string
default = “”
}

variable “s3_versioning” {
description = “Versioning status for S3 bucket”
type = string
default = “Enabled”
}

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

module “test_s3_bucket” {
source = “../modules/s3”
bucket_name = “test-s3-bucket”
s3_bucket_policy = data.aws_iam_policy_document.test_s3_bucket_access.json
}

توجه داشته باشید که ما s3_versioning را به فراخوانی ماژول ارسال نکردیم، زیرا این متغیر از قبل دارای مقدار پیش فرض است، به این معنی که هر فراخوانی ماژولی که دارای s3_versioning نیست، مقدار پیش فرض خود را به ارث می برد. با ایجاد یک ماژول Terraform برای یک سطل S3، منابع منطقی مرتبط را گروه بندی کردید، و سپس می توانید بسته به نیاز، با برخی از تنظیمات یا منابع جدید S3 مجدداً از آن استفاده کرده و آن را به روز کنید.

2. مدیریت وابستگی های ماژول

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

مدیریت وابستگی های ماژول
Terraform وابستگی ها را بر اساس مراجع بین منابع مدیریت می کند، به این معنی که اگر هنگام فراخوانی ماژول B خروجی را از ماژول A به عنوان ورودی ارسال کنید، Terraform به طور خودکار آنها را سفارش می دهد. در اینجا یک مثال ساده است:

resource “aws_iam_policy” “lambda_policy” {
name = “LambdaPermissionsPolicy”
description = “IAM policy for S3 access”

policy = jsonencode({
Version = “2012-10-17”
Statement = [
{
Effect = “Allow”
Action = [
“s3:PutObject”,
“s3:GetObject”,
“s3:ListBucket”
] Resource = [
module.s3_bucket.bucket_arn
] }
] })
}

#output defined in S3 module
output “bucket_arn” {
description = “The ARN of the bucket”
value = aws_s3_bucket.example.arn
}

در این مثال می توانید سیاست IAM را مشاهده کنید که به لامبدا اجازه می دهد با سطل S3 ما تعامل داشته باشد. همانطور که می بینید در بخش Resource Policy به خروجی ماژول S3 اشاره دارد که به این معنی است که Terraform ابتدا منابع را از ماژول S3 و سپس خود سیاست IAM ایجاد می کند.
نکته جانبی: این وابستگی ضمنی نامیده می شود، به این معنی که Terraform آن را به تنهایی با تجزیه و تحلیل ویژگی های منبع کشف می کند.

3. استفاده از فضاهای کاری Terraform

Workspace ویژگی بسیار قدرتمندی است که برای مدیریت بخش‌های مختلف پروژه استفاده می‌شود و به شما امکان می‌دهد چندین فایل حالت را در همان پیکربندی Terraform داشته باشید. تصور کنید که زیرساخت شما دارای سه بخش اصلی است، یکی برای منابع مرتبط با AWS EKS، یکی برای AWS VPC و سایر اجزای شبکه و دیگری برای نظارت.
با این رویکرد، شما ایزوله حالت کامل خواهید داشت به این معنی که همه منابع در همان حساب AWS اما با فایل های حالت S3 جدا شده مستقر می شوند. وجود فضاهای کاری به چندین تیم اجازه می دهد تا همزمان بر روی بخش های مختلف زیرساخت کار کنند، بنابراین در صورت نیاز به به روز رسانی پیکربندی Grafana در داخل نظارت فضای کاری Terraform که می تواند پیاده سازی و آزمایش شود در حالی که تیم دیگری در حال ایجاد تغییرات در آن است EX فضای کاری بدون درگیری این انزوا زمانی می درخشد که مسئله ای وجود داشته باشد نظارت فضای کاری اما EX هنوز به درستی کار می کند
نکته جانبی: هنگام استفاده از یک سطل S3 برای ذخیره فایل‌های sate از چندین فضای کاری، تمرین خوب است که از مسیرهای مختلف استفاده کنید تا فایل‌ها در داخل سطل سازماندهی شوند. به علاوه همیشه ماکت این سطل را داشته باشید.

با استفاده از این دستور می توانید یک فضای کاری ایجاد کنید:

terraform workspace create monitoring

می توانید با استفاده از:

terraform workspace select monitoring

*4. متغیرها را برای فضاهای کاری و محیط ها جدا کنید
*

هنگام استقرار منابع در محیط توسعه دهنده احتمالاً از گره های EKS کوچکتر و برای تولید از گره های بزرگتر استفاده خواهید کرد. برای رسیدن به آن می توانید از فایل tfvars و سپس برای هر محیط عبور خاص استفاده کنید، به این معنی که:

eks/dev.tfvars
eks/qa.tfvars
eks/prod.tfvars

و البته برای سایر فضاهای کاری هم همینطور. به این ترتیب هر فضای کاری می تواند مجموعه ای از مقادیر متغیر در هر محیط را داشته باشد که به معنای انعطاف پذیری بیشتر در هنگام استقرار منابع است.

نتیجه گیری

ماژول ها و فضاهای کاری Terraform ویژگی های قدرتمندی برای مدیریت زیرساخت های مقیاس پذیر هستند. با ایجاد ماژول های قابل استفاده مجدد و پارامتری شده، مدیریت وابستگی بین آنها و استفاده از فضاهای کاری، می توانید زیرساخت های پیچیده خود را ساده کنید. استفاده از فایل‌های tfvars در ترکیب با فضاهای کاری بهترین راه برای مدیریت پویا زیرساخت بر اساس سناریوهای مختلف است.

مدیریت زیرساخت یک کار چالش برانگیز در هنگام برخورد با زیرساخت های پیچیده و تیم های متعدد است. خوشبختانه Terraform به عنوان ابزار تامین کننده قادر است این فرآیند را با استفاده از ماژول ها و فضاهای کاری ساده کند. این به شما امکان می دهد زیرساخت های مدولار، قابل استفاده مجدد و مقیاس پذیر بسازید.
در این پست، چند تکنیک برای ایجاد و مدیریت ماژول‌ها و فضاهای کاری Terraform را با پوشش‌های زیر بررسی می‌کنیم:

  1. ایجاد ماژول های قابل استفاده مجدد
  2. مدیریت وابستگی های ماژول
  3. استفاده از فضاهای کاری Terraform
  4. متغیرها را برای فضاهای کاری و محیط ها جدا کنید

1. ایجاد ماژول های قابل استفاده مجدد

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

مثال ماژول Terraform:
مثالی از ایجاد ماژول برای منابع مرتبط با AWS S3 و نحوه پارامتریزه کردن ماژول برای استفاده مجدد در پروژه:

resource "aws_s3_bucket" "example" {
  bucket = var.bucket_name
}

resource "aws_s3_bucket_public_access_block" "example" {
  bucket = aws_s3_bucket.example.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

resource "aws_s3_bucket_versioning" "example" {
  bucket = aws_s3_bucket.example.id
  versioning_configuration {
    status = var.s3_versioning
  }
}

resource "aws_s3_bucket_policy" "example" {
  bucket = aws_s3_bucket.example.id
  policy = var.s3_bucket_policy
}

variable "bucket_name" {
  description = "The name of the bucket"
  type        = string
}

variable "s3_bucket_policy" {
  description = "Value of the s3 bucket policy"
  type        = string
  default     = ""
}

variable "s3_versioning" {
  description = "Versioning status for S3 bucket"
  type        = string
  default     = "Enabled"
}

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

module "test_s3_bucket" {
  source = "../modules/s3"
  bucket_name             = "test-s3-bucket"
  s3_bucket_policy        = data.aws_iam_policy_document.test_s3_bucket_access.json
}

توجه داشته باشید که ما s3_versioning را به فراخوانی ماژول ارسال نکردیم، زیرا این متغیر از قبل دارای مقدار پیش فرض است، به این معنی که هر فراخوانی ماژولی که دارای s3_versioning نیست، مقدار پیش فرض خود را به ارث می برد. با ایجاد یک ماژول Terraform برای یک سطل S3، منابع منطقی مرتبط را گروه بندی کردید، و سپس می توانید بسته به نیاز، با برخی از تنظیمات یا منابع جدید S3 مجدداً از آن استفاده کرده و آن را به روز کنید.

2. مدیریت وابستگی های ماژول

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

مدیریت وابستگی های ماژول
Terraform وابستگی ها را بر اساس مراجع بین منابع مدیریت می کند، به این معنی که اگر هنگام فراخوانی ماژول B خروجی را از ماژول A به عنوان ورودی ارسال کنید، Terraform به طور خودکار آنها را سفارش می دهد. در اینجا یک مثال ساده است:

resource "aws_iam_policy" "lambda_policy" {
  name        = "LambdaPermissionsPolicy"
  description = "IAM policy for S3 access"

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = [
          "s3:PutObject",
          "s3:GetObject",
          "s3:ListBucket"
        ]
        Resource = [
          module.s3_bucket.bucket_arn
        ]
      }
    ]
  })
}

#output defined in S3 module
output "bucket_arn" {
  description = "The ARN of the bucket"
  value       = aws_s3_bucket.example.arn
}

در این مثال می توانید سیاست IAM را مشاهده کنید که به لامبدا اجازه می دهد با سطل S3 ما تعامل داشته باشد. همانطور که می بینید در بخش Resource Policy به خروجی ماژول S3 اشاره دارد که به این معنی است که Terraform ابتدا منابع را از ماژول S3 و سپس خود سیاست IAM ایجاد می کند.
نکته جانبی: این وابستگی ضمنی نامیده می شود، به این معنی که Terraform آن را به تنهایی با تجزیه و تحلیل ویژگی های منبع کشف می کند.

3. استفاده از فضاهای کاری Terraform

Workspace ویژگی بسیار قدرتمندی است که برای مدیریت بخش‌های مختلف پروژه استفاده می‌شود و به شما امکان می‌دهد چندین فایل حالت را در همان پیکربندی Terraform داشته باشید. تصور کنید که زیرساخت شما دارای سه بخش اصلی است، یکی برای منابع مرتبط با AWS EKS، یکی برای AWS VPC و سایر اجزای شبکه و دیگری برای نظارت.
با این رویکرد، شما ایزوله حالت کامل خواهید داشت به این معنی که همه منابع در همان حساب AWS اما با فایل های حالت S3 جدا شده مستقر می شوند. وجود فضاهای کاری به چندین تیم اجازه می دهد تا همزمان بر روی بخش های مختلف زیرساخت کار کنند، بنابراین در صورت نیاز به به روز رسانی پیکربندی Grafana در داخل نظارت فضای کاری Terraform که می تواند پیاده سازی و آزمایش شود در حالی که تیم دیگری در حال ایجاد تغییرات در آن است EX فضای کاری بدون درگیری این انزوا زمانی می درخشد که مسئله ای وجود داشته باشد نظارت فضای کاری اما EX هنوز به درستی کار می کند
نکته جانبی: هنگام استفاده از یک سطل S3 برای ذخیره فایل‌های sate از چندین فضای کاری، تمرین خوب است که از مسیرهای مختلف استفاده کنید تا فایل‌ها در داخل سطل سازماندهی شوند. به علاوه همیشه ماکت این سطل را داشته باشید.

با استفاده از این دستور می توانید یک فضای کاری ایجاد کنید:

terraform workspace create monitoring

می توانید با استفاده از:

terraform workspace select monitoring

*4. متغیرها را برای فضاهای کاری و محیط ها جدا کنید
*

هنگام استقرار منابع در محیط توسعه دهنده احتمالاً از گره های EKS کوچکتر و برای تولید از گره های بزرگتر استفاده خواهید کرد. برای رسیدن به آن می توانید از فایل tfvars و سپس برای هر محیط عبور خاص استفاده کنید، به این معنی که:

eks/dev.tfvars
eks/qa.tfvars
eks/prod.tfvars

و البته برای سایر فضاهای کاری هم همینطور. به این ترتیب هر فضای کاری می تواند مجموعه ای از مقادیر متغیر در هر محیط را داشته باشد که به معنای انعطاف پذیری بیشتر در هنگام استقرار منابع است.

نتیجه گیری

ماژول ها و فضاهای کاری Terraform ویژگی های قدرتمندی برای مدیریت زیرساخت های مقیاس پذیر هستند. با ایجاد ماژول های قابل استفاده مجدد و پارامتری شده، مدیریت وابستگی بین آنها و استفاده از فضاهای کاری، می توانید زیرساخت های پیچیده خود را ساده کنید. استفاده از فایل‌های tfvars در ترکیب با فضاهای کاری بهترین راه برای مدیریت پویا زیرساخت بر اساس سناریوهای مختلف است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا