برنامه نویسی

بهترین روش ها برای استقرار ECS با استفاده از Terraform

استقرار خدمات ECS با استفاده از Terraform به شما امکان می دهد یک زیرساخت ماژولار، قابل استفاده مجدد و پارامتر محور را حفظ کنید. در این راهنما، ما بر ایجاد و استفاده مجدد از تعاریف وظایف ECS، پیکربندی خدمات، و ادغام سایر اجزای AWS به طور موثر با Terraform تمرکز خواهیم کرد.

بیان مشکل

ایجاد یک استقرار قوی ECS اغلب شامل پیکربندی های تکراری و تنظیمات پیچیده است. با استفاده از Terraform، می توانید:

  • ایجاد تعاریف وظایف ECS قابل استفاده مجدد را ساده کنید.
  • متغیرهای پویا را به وظایف و خدمات منتقل کنید.
  • یکپارچه با سایر خدمات AWS مانند Secrets Manager و CloudWatch ادغام کنید.

استقرار ECS مبتنی بر Terraform

اجزای کلیدی

  1. تعاریف وظایف ECS

    • تنظیمات ظرف (CPU، حافظه، تصویر و غیره) را تعریف کنید.
    • از متغیرها برای ایجاد تعاریف قابل استفاده مجدد در چندین سرویس استفاده کنید.
  2. خدمات ECS

    • تعداد وظایف، سیاست های مقیاس بندی و ادغام با ALB ها را مدیریت کنید.
  3. ادغام خدمات AWS

    • برای داده های حساس به Secrets Manager متصل شوید.
    • ثبت گزارش و معیارهای CloudWatch را فعال کنید.

مرحله 1: تعریف کار قابل استفاده مجدد

تعریف کار پارامتری شده در Terraform:

resource "aws_ecs_task_definition" "app" {
  family                   = var.task_family
  container_definitions    = jsonencode([
    {
      name              = "${var.container_name}"
      image             = "${var.container_image}"
      cpu               = var.cpu
      memory            = var.memory
      essential         = true
      environment       = var.environment_variables
      logConfiguration  = {
        logDriver = "awslogs"
        options   = {
          "awslogs-group"         = var.log_group
          "awslogs-region"        = var.region
          "awslogs-stream-prefix" = var.log_stream_prefix
        }
      }
    }
  ])
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  execution_role_arn       = aws_iam_role.ecs_task_execution.arn
  task_role_arn            = aws_iam_role.ecs_task.arn
  cpu                      = var.task_cpu
  memory                   = var.task_memory
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

متغیرهای انعطاف پذیری

متغیرهایی را تعریف کنید تا تعریف کار قابل استفاده مجدد باشد:

variable "task_family" {}
variable "container_name" {}
variable "container_image" {}
variable "cpu" {}
variable "memory" {}
variable "environment_variables" { type = list(map(string)) }
variable "log_group" {}
variable "region" {}
variable "log_stream_prefix" {}
variable "task_cpu" {}
variable "task_memory" {}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 2: پیکربندی سرویس ECS

یک منبع سرویس را تعریف کنید و تعریف وظیفه را به صورت پویا ارسال کنید:

resource "aws_ecs_service" "app" {
  name            = var.service_name
  cluster         = aws_ecs_cluster.main.id
  task_definition = aws_ecs_task_definition.app.arn

  desired_count   = var.desired_count
  launch_type     = "FARGATE"

  network_configuration {
    subnets         = var.subnets
    security_groups = [aws_security_group.app.id]
    assign_public_ip = true
  }

  load_balancer {
    target_group_arn = aws_lb_target_group.app.arn
    container_name   = var.container_name
    container_port   = var.container_port
  }

  depends_on = [aws_lb_listener.frontend]
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: متغیرهای پارامتری برای سرویس ECS

تعریف متغیرهای سرویس:

variable "service_name" {}
variable "desired_count" {}
variable "subnets" { type = list(string) }
variable "container_port" {}`

### Step 4: Secrets Manager Integration

To securely manage environment variables:

`resource "aws_secretsmanager_secret" "app_secret" {
  name = var.secret_name
}

resource "aws_secretsmanager_secret_version" "app_secret_version" {
  secret_id     = aws_secretsmanager_secret.app_secret.id
  secret_string = jsonencode(var.secret_values)
}

variable "secret_name" {}
variable "secret_values" { type = map(string) }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اسرار را به عنوان متغیرهای محیطی در تعریف وظیفه منتقل کنید:

environment = [
  {
    name = "SECRET_KEY"
    valueFrom = aws_secretsmanager_secret.app_secret.arn
  }
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 5: خروجی برای قابلیت استفاده مجدد

تعریف خروجی برای تعریف وظیفه و سرویس:

output "task_definition_arn" {
  value = aws_ecs_task_definition.app.arn
}

output "service_name" {
  value = aws_ecs_service.app.name
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

  1. از ماژول ها استفاده کنید: کد Terraform خود را در ماژول های قابل استفاده مجدد سازماندهی کنید.

  2. قفل نسخه: از محدودیت های نسخه برای ارائه دهندگان Terraform استفاده کنید.

  3. مدیریت دولتی: از ذخیره سازی حالت راه دور استفاده کنید (به عنوان مثال، S3 با قفل DynamoDB).

  4. فروشگاه پارامتر: برای پیکربندی های پویا با SSM Parameter Store ادغام شود.

نتیجه گیری

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

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

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

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

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