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

مقدمه
به عنوان یک علاقهمند به فضای ابری که در زیرساخت بهعنوان کد (IaC) تحقیق میکند، اخیراً شروع به ایجاد یک معماری دو لایه با استفاده از Terraform کردم. این پروژه هم یک چالش و هم یک تجربه یادگیری ارزشمند بود که به من در مورد طراحی زیرساخت کارآمد، بهینه سازی ماژول های Terraform و ایمن سازی منابع ابری آموزش داد. در این وبلاگ، من شما را در سفر خود راهنمایی می کنم و چالش ها، راه حل ها و بینش هایی را که در این راه به دست آورده ام برجسته می کنم.
معماری دو لایه چیست؟
یک معماری دو لایه لایه برنامه را از لایه پایگاه داده جدا می کند و مقیاس پذیری، امنیت و قابلیت نگهداری را افزایش می دهد. برای این پروژه، من بر ایجاد تمرکز کردم:
- لایه کاربردی: میزبانی شده توسط یک گروه مقیاس خودکار (ASG) که نمونه های EC2 را مدیریت می کند.
- لایه متعادل کننده بار: یک Application Load Balancer (ALB) که ترافیک ورودی را به نمونه های سالم هدایت می کند.
این راهاندازی با حفظ معماری ساده، دسترسی و مقیاسپذیری بالا را تضمین میکند.
بررسی اجمالی پروژه
در اینجا یک عکس از معماری من است:
- S3 Backend: برای مدیریت حالت Terraform استفاده می شود.
- VPC با زیرشبکه های عمومی: همه منابع در زیرشبکه های عمومی مستقر شدند و از طریق گروه های امنیتی به خوبی پیکربندی شده ایمن شدند.
- متعادل کننده بار: یک ALB که ترافیک را به سرورهای برنامه توزیع می کند.
- گروه مقیاس خودکار: مدیریت پویا سرورهای برنامه برای اطمینان از عملکرد ثابت.
نمودار معماری
در ابتدا، من چهار ماژول Terraform، از جمله یک ماژول مستقل EC2 را وارد کردم. با این حال، بعداً طراحی را با حذف ماژول EC2 بهینه کردم و متوجه شدم که ASG قبلاً به طور مؤثر ایجاد نمونه را مدیریت کرده است.
*بینش کلیدی: *
- از هر دو ماژول EC2 و ASG در زمانی که نیاز به سفارشی سازی گسترده برای نمونه های EC2 دارید و در عین حال از مقیاس خودکار ASG استفاده می کنید، استفاده کنید.
- هنگامی که پیکربندی EC2 ساده است، فقط از ماژول ASG برای یک راه حل ساده و مقیاس پذیر استفاده کنید.
پیاده سازی گام به گام
مرحله 1: راه اندازی شبکه
اولین گام ایجاد یک backend s3 برای ذخیره ایمن ایالت ها برای این پروژه بود. لطفا مراحل را با کلیک کردن در اینجا دنبال کنید.
سپس به سمت ایجاد یک VPC با دو زیرشبکه عمومی، هر کدام در یک منطقه در دسترس بودن جداگانه حرکت می کنیم:
#Create VPC
resource "aws_vpc" "main" {
cidr_block = var.cidr_block
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = var.vpc_name
}
}
#Create Subnets
resource "aws_subnet" "public" {
count = length(var.public_subnets)
vpc_id = aws_vpc.main.id
cidr_block = var.public_subnets[count.index]
availability_zone = var.availability_zones[count.index]
map_public_ip_on_launch = true
tags = {
Name = "${var.vpc_name}-public-${count.index}"
}
}
این پیکربندی شامل یک دروازه اینترنتی و جداول مسیر برای فعال کردن دسترسی به اینترنت بود.
مرحله 2: پیکربندی گروه مقیاس خودکار (ASG)
ASG به صورت پویا نمونه های EC2 را ایجاد و مدیریت می کند و مقیاس بندی را ساده می کند:
resource "aws_launch_template" "lt" {
name_prefix = var.name_prefix
image_id = var.image_id
instance_type = var.instance_type
network_interfaces {
associate_public_ip_address = true
security_groups = var.security_groups
}
user_data = base64encode(var.user_data)
}
resource "aws_autoscaling_group" "asg" {
desired_capacity = var.desired_capacity
min_size = var.min_size
max_size = var.max_size
vpc_zone_identifier = var.subnets
launch_template {
id = aws_launch_template.lt.id
version = "$Latest"
}
target_group_arns = [var.target_group_arn]
tag {
key = "Name"
value = var.name_prefix
propagate_at_launch = true
}
برای اطمینان از استفاده بهینه از منابع، سیاستهای چرخه حیات و تنظیمات مقیاسبندی خودکار را در معماری گنجاندهام. این اقدامات به طور خودکار تعداد نمونه های EC2 را بر اساس تقاضاهای بار کاری تنظیم می کند.
مرحله 3: اضافه کردن یک بار متعادل کننده
ALB توزیع کارآمد ترافیک و نظارت بر سلامت را تضمین کرد:
resource "aws_lb" "alb" {
name = var.name
internal = false
load_balancer_type = "application"
security_groups = var.security_groups
subnets = var.subnets
}
مرحله 4: ایمن سازی منابع
گروه های امنیتی دسترسی به منابع حیاتی را محدود کردند:
#Create Security Group for ALB
resource "aws_security_group" "alb_sg" {
name = "alb-sg"
description = "Security group for the Application Load Balancer"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # Allow HTTP traffic from the internet
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "sg-alb"
}
}
#Create Security Group for ASG
resource "aws_security_group" "asg_sg" {
name = "asg-sg"
description = "Security group for EC2 instances in the ASG"
vpc_id = aws_vpc.main.id
ingress {
description = "Allow HTTP traffic from ALB"
from_port = 80
to_port = 80
protocol = "tcp"
security_groups = [aws_security_group.alb_sg.id] # Reference ALB SG
}
egress {
description = "Allow all outbound traffic"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "asg-sg"
}
}
ALB ترافیک HTTP را پذیرفت، در حالی که نمونه های EC2 فقط اجازه ترافیک از ALB را می دادند.
مرحله 5: استقرار زیرساخت
در حالی که کدهای بالا فقط قطعه هستند. مخزن اصلی را کلون کنید تا مراحل زیر را ادامه دهید.
دایرکتوری را به dev تغییر دهید و root main.tf را پیکربندی کنید
cd envs/dev
من از دستورات زیر برای اجرای تنظیمات استفاده کردم:
- Terraform را راه اندازی کنید:
terraform init
- برنامه ریزی زیرساخت:
terraform plan
- تنظیمات را اعمال کنید:
terraform apply
خروجی شامل نام ALB DNS بود که برای آزمایش استفاده شد.
مرحله 6: تست تنظیمات
برای تأیید عملکرد و امنیت راهاندازی، نام ALB DNS را آزمایش کردم:
نام DNS را از خروجی Terraform کپی کرد.
آن را در مرورگر جایگذاری کرد تا اتصال به وب سرور را تأیید کند.
تایید امنیتی
من همچنین تأیید کردم که نمونههای EC2 فقط از طریق ALB DNS قابل دسترسی هستند. تلاش مستقیم برای اتصال به نمونه های EC2 با استفاده از IP های عمومی آنها منجر به عدم دسترسی شد. این با پیکربندی گروه های امنیتی به دست آمد برای پذیرش ترافیک فقط از ALB.
این مرحله به من اطمینان داد که:
مسیریابی ترافیک: تمام درخواست های دریافتی منحصراً از طریق ALB هدایت می شدند.
کنترل دسترسی: هیچ ترافیک غیرمجاز نمی تواند مستقیماً به نمونه های EC2 برسد، تضمین یک محیط امن.
تصاویری از اجزای AWS
تصویر زیر VPC، زیرشبکه های عمومی، جدول مسیر و دروازه اینترنت ایجاد شده با استفاده از Terraform را نشان می دهد. هر زیر شبکه در منطقه در دسترس بودن مربوطه است. این امر آمادگی شبکه برای منابع اینترنتی را برجسته می کند.
این اسکرین شات گروه هدف متصل به ALB را نمایش می دهد و موارد ثبت شده EC2 و وضعیت سلامت آنها را نشان می دهد. وضعیت “سالم” نشان می دهد که ALB می تواند با موفقیت ترافیک را به این موارد هدایت کند.
چالش ها و راه حل ها
-
ماژول اضافی EC2:
در ابتدا، من از یک ماژول EC2 مستقل در کنار ASG استفاده کردم که باعث افزونگی شد. حذف آن طراحی را ساده کرد و از تضادهای احتمالی جلوگیری کرد.
-
نگرانی های امنیتی با زیرشبکه های عمومی:
استقرار منابع در زیرشبکههای عمومی به پیکربندیهای گروه امنیتی دقیق نیاز داشت تا دسترسی و امنیت را متعادل کند.
یادگیری های کلیدی
- بهینه سازی استفاده از ماژول: با درک عملکرد هر ماژول از افزونگی اجتناب کنید.
- مسائل امنیتی: حتی در زیرشبکه های عمومی، پیکربندی موثر گروه امنیتی می تواند ایمنی را تضمین کند.
- تکرار و بهبود: طراحیهای آزمایش و پالایش برای مدیریت مؤثر زیرساخت حیاتی هستند.
نتیجه گیری
ساختن این معماری دولایه با Terraform یک سفر ارزشمند بود که درک من را از معماری ابری و بهترین شیوههای IaC افزایش داد. امیدوارم این وبلاگ به شما انگیزه دهد که پروژه های مشابهی را انجام دهید و مسیر شما را برای تسلط بر Terraform ساده کند.
کد کامل Terraform را در مخزن GitHub من پیدا کنید. با خیال راحت به لینکدین متصل شوید یا در زیر نظر خود را با هر گونه سوال یا بازخورد درج کنید!