نحوه انتخاب ابزار IaC مناسب – مقایسه AWS CDK، CloudFormation و Terraform
![](https://khabarkaav.ir/wp-content/uploads/2024/06/Level-Up-Tech-Design-Portfolio.jpg)
![](https://www.freecodecamp.org/news/content/images/2024/06/Level-Up-Tech-Design-Portfolio.jpg)
زیرساخت به عنوان کد (IaC) به سنگ بنای مدیریت منابع ابری مدرن تبدیل شده است. این برنامه توسعه دهندگان و مهندسان را قادر می سازد تا منابع ابری خود را با همان سطح کنترل و دقت کد برنامه مدیریت کنند.
هنگامی که با AWS کار می کنید، از جمله ابزارهایی که در خط مقدم استفاده از IaC قرار دارند، AWS CloudFormation، AWS Cloud Development Kit (CDK) و HashiCorp's Terraform هستند.
هر یک از این ابزارهای IaC ویژگی ها و رویکردهای منحصر به فردی را برای مدیریت زیرساخت ارائه می دهد. این باعث می شود آنها برای سناریوها و ترجیحات مختلف مناسب باشند و می توانند به شما کمک کنند تا استقرار منابع ابری خود یا تیمتان را خودکار و استاندارد کنید.
این مقاله مقایسه سطح بالایی از این سه ابزار را با تمرکز بر قابلیتها، سطوح انتزاع و موارد استفاده عملی ارائه میکند. شما تحلیل خواهید کرد که چگونه این ابزارها شما را قادر می سازند تا به طور برنامه ریزی شده زیرساخت های ابری پیچیده را ایجاد و مدیریت کنید.
به طور خاص، تمرکز بر روی استقرار یک زیرساخت شبکه معماری سه لایه خواهد بود. این شامل استقرار یک Virtual Private Cloud (VPC) است که با چندین زیرشبکه، جداول مسیر، یک دروازه اینترنت و دروازههای NAT پیکربندی شده است تا قابلیتها و نحو منحصر به فرد هر ابزار IaC را به نمایش بگذارد.
در پایان این مقاله، درک کاملی از عملکرد این ابزارها به دست خواهید آورد تا بتوانید هنگام انتخاب زیرساختهای ابری انعطافپذیر، مقیاسپذیر و با مدیریت کارآمد تصمیمی آگاهانه بگیرید.
بدون مقدمه، اجازه دهید این مهمانی را شروع کنیم!
آنچه را پوشش خواهیم داد:
زیرساخت به عنوان کد (IaC) چیست؟
زیرساخت به عنوان کد یک اصل کلیدی DevOps است که شامل مدیریت و تهیه منابع زیرساخت با تعریف آن به عنوان کد در فایل های پیکربندی، به جای استفاده از فرآیندها و تنظیمات دستی است.
اگر میخواهید درباره مبانی IaC بیشتر بدانید، در اینجا یک راهنمای مفید برای شروع ارائه شده است .
اکنون بیایید در مورد سه ابزاری که در این تحلیل کلی با هم مقایسه خواهیم کرد، کمی بیشتر بیاموزیم.
AWS CloudFormation چه کاری انجام می دهد؟
AWS CloudFormation از YAML یا JSON برای توصیف و همچنین ارائه خودکار و ایمن منابع زیرساخت مورد نیاز برای برنامههای شما - در همه مناطق و حسابهای موجود در محیط ابری AWS شما استفاده میکند.
کیت توسعه ابری AWS (CDK) چه کاری انجام می دهد؟
AWS Cloud Development Kit یک چارچوب توسعه نرم افزار است که به طور خاص برای تعریف زیرساخت ابری در کد استفاده می شود. در نهایت منابع را از طریق AWS CloudFormation فراهم می کند.
AWS CDK از زبان های برنامه نویسی آشنا مانند TypeScript، JavaScript، Python، Java و سایرین برای تعریف اجزای ابری قابل استفاده مجدد به نام ساختارها استفاده می کند. سپس این ها به اشتراک گذاشته می شوند و برای ایجاد معماری های ابری پیچیده و مقیاس پذیر استفاده می شوند.
سازه چیست؟
در زمینه AWS CDK، یک ساختار یک مؤلفه ابری را نشان می دهد که عملکرد و پیکربندی خاصی را به شکل قابل استفاده مجدد در بر می گیرد.
Terraform چه کاری انجام می دهد؟
Terraform یک ابزار چند مستاجر است که توسط HashiCorp ایجاد شده است که به شما امکان می دهد اجزای سطح پایین و سطح بالا زیرساخت ابری خود را با استفاده از یک زبان پیکربندی اعلامی تعریف کنید.
این ابر ناشناس است و قادر به مدیریت تنظیمات چند ارائه دهنده در یک پیکربندی واحد است.
ابر آگنوستیک به چه معناست؟
Cloud-Agnostic به توانایی یک ابزار یا سرویس برای عملکرد در ارائه دهندگان ابری مختلف بدون تغییرات قابل توجه در رویه های عملیاتی یا معماری آن اشاره دارد.
بسیار خوب، اکنون که ابزارهایی را که در مورد آن بحث خواهیم کرد را فهمیدید، بیایید وارد آن شویم.
پیش نیازها
حساب AWS با یک کاربر IAM با مجوزهای سرپرست
دانش اولیه و استفاده از AWS CloudFormation، AWS CDK و Terraform
درک اولیه YAML، Python و زبان پیکربندی HashiCorp
تجربه با محیط توسعه تعاملی (IDE)
از سناریوی موردی استفاده کنید
شما یک مهندس شبکه ابری در REXTECH Corp هستید، استارت آپی که در آستانه راه اندازی یک سرویس آنلاین جدید است که جریان محتوای دیجیتال را ارائه می دهد. از آنجایی که پیش بینی می شود این سرویس از همان ابتدا پایگاه کاربران قابل توجهی را جذب کند، شما باید یک زیرساخت ابری بسیار مقیاس پذیر، قابل اعتماد و ایمن را مستقر کنید که بتواند ترافیک اوج را مدیریت کند و در دسترس بودن مداوم را فراهم کند.
مدیر شما یک راه حل شبکه ابری را اجباری کرده است که نه تنها این الزامات عملکرد را برآورده می کند، بلکه امکان مقیاس بندی سریع و مدیریت کارآمد را نیز فراهم می کند.
در پاسخ به این، شما وظیفه دارید تا استقرار یک زیرساخت شبکه معماری سه لایه را خودکار کنید. برای اطمینان از انعطاف پذیری و پیکربندی بهینه، باید یک Virtual Private Cloud (VPC) داشته باشد که شامل چندین زیرشبکه در چندین منطقه در دسترس (AZs)، دروازه های NAT و جداول مسیر باشد.
با نیاز به چابکی و قابلیت نگهداری در زیرساخت خود، تصمیم می گیرید که بین AWS CloudFormation، AWS CDK و Terraform برای این پروژه ارزیابی و انتخاب کنید.
قبل از ارزیابی کاربرد هر ابزار در سناریو، اجازه دهید اجزای منبع استقرار را تجزیه کنیم.
این استقرار شامل پیکربندی یک VPC با دو زیرشبکه عمومی برای سرورهای وب رو به جلو، دو زیرشبکه خصوصی برای سرورها در ردیف برنامه و دو زیرشبکه خصوصی دیگر برای میزبانی پایگاه داده چند AZ است. همه زیرشبکه ها در چندین AZ مستقر خواهند شد و شامل تنظیمات اتصال بین اجزا از طریق جداول مسیر و یک دروازه اینترنتی خواهند بود.
همچنین، دو دروازه NAT در زیرشبکههای عمومی تضمین میکنند که منابع موجود در زیرشبکههای خصوصی لایه برنامه میتوانند به طور ایمن به اینترنت برای بهروزرسانی و ارتباطات بینسرویس بدون قرار گرفتن در معرض مستقیم دنیای خارج دسترسی داشته باشند.
اکنون، بیایید یاد بگیریم که چگونه میتوانید با استفاده از هر سه ابزار IaC، ایجاد این راهحل را خودکار کنید: AWS CloudFormation ، AWS CDK و Terraform .
نمونه کد ابزار IaC
مثال AWS CloudFormation
AWS CloudFormation به شما امکان می دهد زیرساخت مورد نظر خود را با استفاده از یک فایل پیکربندی JSON یا YAML تعریف کنید. اما شما باید وابستگی ها و ارتباطات بین منابع را با استفاده از توابع ذاتی مانند !Ref ، تعریف کنید. ارجاع به منابع دیگر یا !GetAtt ، برای کمک به انتخاب پویا مناطق در دسترس بودن.
در زیر نحوه تعریف راه حل شبکه سه لایه با استفاده از AWS CloudFormation آورده شده است:
AWSTemplateFormatVersion: '2010-09-09' Resources: MyVPC: Type: 'AWS::EC2::VPC' Properties: CidrBlock: '10.0.0.0/16' EnableDnsSupport: true EnableDnsHostnames: true InternetGateway: Type: 'AWS::EC2::InternetGateway' AttachGateway: Type: 'AWS::EC2::VPCGatewayAttachment' Properties: VpcId: !Ref MyVPC InternetGatewayId: !Ref InternetGateway PublicSubnetOne: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref MyVPC CidrBlock: '10.0.1.0/24' AvailabilityZone: !Select [0, !GetAZs ''] MapPublicIpOnLaunch: true PublicSubnetTwo: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref MyVPC CidrBlock: '10.0.2.0/24' AvailabilityZone: !Select [1, !GetAZs ''] MapPublicIpOnLaunch: true PrivateSubnetAppOne: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref MyVPC CidrBlock: '10.0.3.0/24' AvailabilityZone: !Select [0, !GetAZs ''] PrivateSubnetAppTwo: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref MyVPC CidrBlock: '10.0.4.0/24' AvailabilityZone: !Select [1, !GetAZs ''] PrivateSubnetDBOne: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref MyVPC CidrBlock: '10.0.5.0/24' AvailabilityZone: !Select [0, !GetAZs ''] PrivateSubnetDBTwo: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref MyVPC CidrBlock: '10.0.6.0/24' AvailabilityZone: !Select [1, !GetAZs ''] EIPOne: Type: 'AWS::EC2::EIP' EIPTwo: Type: 'AWS::EC2::EIP' NATGatewayOne: Type: 'AWS::EC2::NatGateway' Properties: AllocationId: !GetAtt 'EIPOne.AllocationId' SubnetId: !Ref PublicSubnetOne NATGatewayTwo: Type: 'AWS::EC2::NatGateway' Properties: AllocationId: !GetAtt 'EIPTwo.AllocationId' SubnetId: !Ref PublicSubnetTwo PublicRouteTable: Type: 'AWS::EC2::RouteTable' Properties: VpcId: !Ref MyVPC PublicRoute: Type: 'AWS::EC2::Route' Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: '0.0.0.0/0' GatewayId: !Ref InternetGateway PublicSubnetOneRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PublicSubnetOne RouteTableId: !Ref PublicRouteTable PublicSubnetTwoRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PublicSubnetTwo RouteTableId: !Ref PublicRouteTable PrivateAppRouteTableOne: Type: 'AWS::EC2::RouteTable' Properties: VpcId: !Ref MyVPC PrivateAppRouteTableTwo: Type: 'AWS::EC2::RouteTable' Properties: VpcId: !Ref MyVPC PrivateAppRouteOne: Type: 'AWS::EC2::Route' Properties: RouteTableId: !Ref PrivateAppRouteTableOne DestinationCidrBlock: '0.0.0.0/0' NatGatewayId: !Ref NATGatewayOne PrivateAppRouteTwo: Type: 'AWS::EC2::Route' Properties: RouteTableId: !Ref PrivateAppRouteTableTwo DestinationCidrBlock: '0.0.0.0/0' NatGatewayId: !Ref NATGatewayTwo PrivateSubnetAppOneRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PrivateSubnetAppOne RouteTableId: !Ref PrivateAppRouteTableOne PrivateSubnetAppTwoRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PrivateSubnetAppTwo RouteTableId: !Ref PrivateAppRouteTableTwo PrivateDBRouteTable: Type: 'AWS::EC2::RouteTable' Properties: VpcId: !Ref MyVPC PrivateSubnetDBOneRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PrivateSubnetDBOne RouteTableId: !Ref PrivateDBRouteTable PrivateSubnetDBTwoRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PrivateSubnetDBTwo RouteTableId: !Ref PrivateDBRouteTable
این اسکریپت YAML VPC مورد نظر، دو زیرشبکه عمومی، یک دروازه اینترنتی، دو آدرس IP الاستیک و دو دروازه NAT را ایجاد می کند. در اینجا، شما همچنین از قابلیتهای AWS CloudFormation برای پیوند دادن منابع و مدیریت صریح وابستگیها استفاده میکنید.
مثال AWS CDK
هنگام استفاده از AWS CDK، منابع ابری را به سبک برنامه نویسی ضروری تعریف می کنید. این یک انتزاع بر روی AWS CloudFormation ارائه میکند، اما با استفاده از ساختارهایی که میتوانند چندین منبع را در یک واحد منطقی کپسوله کنند، انعطافپذیری بیشتری را ارائه میدهد. همچنین به شما امکان می دهد از حلقه ها، شرطی ها و دیگر منطق برنامه نویسی برای تولید پویا منابع خود استفاده کنید.
وقتی منابع پیکربندی مانند زیرشبکهها هستند، با گروهبندی آنها تحت subnet_configuration در ساختار VPC سادهسازی میشود. این به طور خودکار ارتباطات زیر شبکه را برای شما مدیریت می کند.
در زیر، از زبان برنامه نویسی پایتون برای تعریف راه حل سه لایه با AWS CDK استفاده خواهید کرد:
from constructs import Construct from aws_cdk import ( Stack, aws_ec2 as ec2 ) class MyVpcStack(Stack): def __init__(self, scope: Construct, id: str, **kwargs): super().__init__(scope, id, **kwargs) # Create a VPC with specific configurations vpc = ec2.Vpc(self, "MyVpc", ip_addresses=ec2.IpAddresses.cidr("10.0.0.0/16"), max_azs=2, subnet_configuration=[ ec2.SubnetConfiguration( name="PublicSubnet", subnet_type=ec2.SubnetType.PUBLIC, cidr_mask=24 ), ec2.SubnetConfiguration( subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS, name="PrivateSubnet1", cidr_mask=24 ), ec2.SubnetConfiguration( subnet_type=ec2.SubnetType.PRIVATE_ISOLATED, name="PrivateSubnet2", cidr_mask=24 ) ], nat_gateways=2, # Number of NAT Gateways )
همانطور که می بینید، این اسکریپت پایتون AWS CDK مختصرتر است و به شما امکان می دهد با یک زبان برنامه نویسی بسیار آشنا در سطح بالا کار کنید که انتزاعات قدرتمندی را ارائه می دهد و از ساختارها استفاده می کند.
مثال Terraform
رویکرد Terraform شامل تعریف زیرساخت با استفاده از یک زبان پیکربندی اعلانی است. اما با AWS CloudFormation در رویکرد مدیریت وضعیت و وابستگی ها متفاوت است. همچنین امکان ایجاد منابع کنترل شده، به روز رسانی و تخریب با ساختارهایی مانند منبع ، ارائه دهنده و متغیر را فراهم می کند.
در اینجا نحوه تعریف همان راه حل با Terraform آمده است:
provider "aws" { region = "us-east-1" } resource "aws_vpc" "my_vpc" { cidr_block = "10.0.0.0/16" enable_dns_support = true enable_dns_hostnames = true } # Public Subnets resource "aws_subnet" "public_subnet_one" { vpc_id = aws_vpc.my_vpc.id cidr_block = "10.0.1.0/24" map_public_ip_on_launch = true availability_zone = "us-east-1a" } resource "aws_subnet" "public_subnet_two" { vpc_id = aws_vpc.my_vpc.id cidr_block = "10.0.2.0/24" map_public_ip_on_launch = true availability_zone = "us-east-1b" } # Private Subnets for Application Tier resource "aws_subnet" "private_app_subnet_one" { vpc_id = aws_vpc.my_vpc.id cidr_block = "10.0.3.0/24" availability_zone = "us-east-1a" } resource "aws_subnet" "private_app_subnet_two" { vpc_id = aws_vpc.my_vpc.id cidr_block = "10.0.4.0/24" availability_zone = "us-east-1b" } # Private Subnets for Database Tier resource "aws_subnet" "private_db_subnet_one" { vpc_id = aws_vpc.my_vpc.id cidr_block = "10.0.5.0/24" availability_zone = "us-east-1a" } resource "aws_subnet" "private_db_subnet_two" { vpc_id = aws_vpc.my_vpc.id cidr_block = "10.0.6.0/24" availability_zone = "us-east-1b" } resource "aws_internet_gateway" "igw" { vpc_id = aws_vpc.my_vpc.id } resource "aws_nat_gateway" "nat_gateway_one" { allocation_id = aws_eip.nat_one.id subnet_id = aws_subnet.public_subnet_one.id } resource "aws_nat_gateway" "nat_gateway_two" { allocation_id = aws_eip.nat_two.id subnet_id = aws_subnet.public_subnet_two.id } resource "aws_eip" "nat_one" { domain = "vpc" } resource "aws_eip" "nat_two" { domain = "vpc" } # Public Route Table resource "aws_route_table" "public_rt" { vpc_id = aws_vpc.my_vpc.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.igw.id } } # Private Route Tables for Application Tier resource "aws_route_table" "private_app_rt_one" { vpc_id = aws_vpc.my_vpc.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.nat_gateway_one.id } } resource "aws_route_table" "private_app_rt_two" { vpc_id = aws_vpc.my_vpc.id route { cidr_block = "0.0.0.0/0" nat_gateway_id = aws_nat_gateway.nat_gateway_two.id } } # Private Route Tables for Database Tier resource "aws_route_table" "private_db_rt" { vpc_id = aws_vpc.my_vpc.id } # Route Table Associations resource "aws_route_table_association" "public_subnet_one_association" { subnet_id = aws_subnet.public_subnet_one.id route_table_id = aws_route_table.public_rt.id } resource "aws_route_table_association" "public_subnet_two_association" { subnet_id = aws_subnet.public_subnet_two.id route_table_id = aws_route_table.public_rt.id } resource "aws_route_table_association" "private_app_subnet_one_association" { subnet_id = aws_subnet.private_app_subnet_one.id route_table_id = aws_route_table.private_app_rt_one.id } resource "aws_route_table_association" "private_app_subnet_two_association" { subnet_id = aws_subnet.private_app_subnet_two.id route_table_id = aws_route_table.private_app_rt_two.id } resource "aws_route_table_association" "private_db_subnet_one_association" { subnet_id = aws_subnet.private_db_subnet_one.id route_table_id = aws_route_table.private_db_rt.id } resource "aws_route_table_association" "private_db_subnet_two_association" { subnet_id = aws_subnet.private_db_subnet_two.id route_table_id = aws_route_table.private_db_rt.id }
این اسکریپت نشان می دهد که چگونه Terraform اجازه می دهد تا یک رویکرد مدولار به زیرساخت به عنوان کد، با تعاریف صریح و مدیریت وابستگی با نحوی که خواندن و نوشتن نسبتاً آسان است.
تجزیه و تحلیل و مقایسه
هنگام انتخاب بین AWS CloudFormation، AWS CDK و Terraform برای مدیریت زیرساخت ابری، تعدادی فاکتور را در نظر گرفته اید. اما در این مقاله، به طور خاص بر روی سهولت استفاده ، انعطاف پذیری ، مقیاس پذیری ، پشتیبانی از زبان و توانایی مدیریت محیط های پیچیده تمرکز خواهد شد.
منحنی سهولت استفاده و یادگیری
AWS CloudFormation فرمت قالب مبتنی بر JSON یا YAML را ارائه می دهد. این برای تعریف زیرساخت ساده است، اما می تواند با رشد زیرساخت پیچیده شود. این نیاز به درک نحو خاص و تعاریف منابع AWS دارد، که ممکن است برای کسانی که با JSON یا YAML آشنایی ندارند، منحنی یادگیری تندتری داشته باشد.
AWS CDK از زبان های برنامه نویسی آشنا مانند Python، JavaScript، TypeScript و Java استفاده می کند. این می تواند آن را برای توسعه دهندگانی که قبلاً با این زبان ها آشنا هستند در دسترس تر کند.
همچنین، از آنجایی که AWS CDK امکان تعریف زیرساخت از طریق کد را فراهم میکند، منطق، شرایط و حلقههای بصریتری را ارائه میکند و بسیاری از دیگهای مورد نیاز در AWS CloudFormation را انتزاع میکند. این روند توسعه را ساده می کند.
Terraform از زبان مخصوص دامنه خود به نام HashiCorp Configuration Language (HCL) استفاده می کند که به گونه ای طراحی شده است که به راحتی توسط انسان قابل خواندن و نوشتن باشد. در حالی که یادگیری آن می تواند آسان باشد، باید با زبان جدید دیگری آشنا باشید. با این حال، ماهیت اعلامی آن اجازه می دهد تا بدون نیاز به مشخص کردن چگونگی دستیابی به آن، تعاریف روشنی از اینکه زیرساخت باید چگونه باشد، ارائه دهد.
انعطاف پذیری و پشتیبانی از ارائه دهنده ابر
AWS CloudFormation کاملاً با AWS ادغام شده است و همزمان با خدمات AWS به روز می شود. اما ذاتاً به AWS محدود میشود و برای امکانات محیطهای هیبریدی یا چند ابری مناسب نیست.
AWS CDK همچنین در درجه اول خدمات AWS را هدف قرار می دهد اما از استفاده از منابع سفارشی AWS CloudFormation برای مدیریت منابع خارج از AWS پشتیبانی می کند. با این حال، به طور طبیعی خود را به مدیریت منابع چند ابری به طور مستقیم مانند Terraform نمیکند.
Terraform به گونهای طراحی شده است که ابری آگنوستیک باشد و از چندین ارائهدهنده از جمله AWS، Microsoft Azure، Google Cloud Platform و سایرین پشتیبانی میکند. این باعث میشود که آن را به گزینهای ایدهآل برای استقرارهای پیچیده که بیش از یک ارائهدهنده ابری را شامل میشود، تبدیل کند.
مقیاس پذیری و قابلیت نگهداری
قالبهای AWS CloudFormation میتوانند در مقیاس پروژهها سخت و دشوار شوند. اما AWS پشتههای تودرتو را به عنوان راهحلی برای مدیریت زیرساختهای بزرگ ارائه میکند، اما حتی با این قابلیت، مدیریت بسیاری از پشتهها میتواند به مسیر دست و پا گیر تبدیل شود.
AWS CDK انتزاعات سطح بالا و ساختارهای مدولار را ارائه میکند و مدیریت و مقیاسبندی زیرساختهای بزرگ را با تقسیم کردن آنها به اجزای کوچکتر و قابل استفاده مجدد آسانتر میکند.
Terraform در مدیریت زیرساختهای مقیاس بزرگ به دلیل رویکرد ماژولار خود برتر است. با استفاده از ماژولهای Terraform، میتوانید از پیکربندیها مجددا استفاده کنید و از ثبات در سراسر استقرار اطمینان حاصل کنید.
حمایت جامعه و اکوسیستم
AWS CloudFormation از پذیرش و پشتیبانی عالی AWS با پایگاه کاربر بزرگ برخوردار است، اما مشارکتهای انجمن آن به اشتراکگذاری قالبها محدود میشود.
AWS CDK منبع باز است و جامعه رو به رشدی دارد، به ویژه در میان توسعه دهندگانی که ترجیح می دهند از زبان های برنامه نویسی همه منظوره برای مدیریت زیرساخت استفاده کنند. این اکوسیستم شامل مجموعه ای غنی از سازه های سطح بالا است که هم توسط AWS و هم جامعه توسعه یافته اند.
Terraform از تعامل قوی با جامعه و اکوسیستم گسترده ای از ارائه دهندگان و ماژول های به اشتراک گذاشته شده عمومی در Terraform Registry سود می برد. پذیرش گسترده آن در پلتفرم های مختلف نیز به پرورش یک جامعه بزرگ و فعال کمک می کند.
طول و پیچیدگی کد
اسکریپت های AWS CloudFormation معمولاً پرمخاطب هستند و به مشخصات دقیق هر ویژگی نیاز دارند. این می تواند به الگوهای طولانی و پیچیده برای زیرساخت های بزرگتر منجر شود.
اسکریپت های AWS CDK به دلیل استفاده از ساختارهای برنامه نویسی که بسیاری از مشخصات دقیق مورد نیاز در AWS CloudFormation را انتزاعی می کنند، معمولاً کوتاه تر و پیچیده تر هستند.
پیکربندیهای Terraform تعادل را ایجاد میکنند، مختصرتر از AWS CloudFormation، اما معمولاً به دلیل ماهیت اعلامی آن، که به تعریف منابع و پیکربندی صریح نیاز دارد، از AWS CDK پرمخاطبتر است.
چرا یکی را بر دیگری انتخاب کنیم؟
هنگام انتخاب بین AWS CloudFormation، AWS CDK و Terraform، آپشن های منحصر به فرد هر ابزار، اصول عملیاتی و ترجیحات شخصی خود را در نظر بگیرید.
اکنون توصیههایی را بر اساس اطلاعات این مقاله به اشتراک میگذارم تا به شما کمک کند بفهمید چه زمانی بهتر است از هر یک از این ابزارهای IaC استفاده کنید.
AWS CloudFormation برای زمانی مناسب است که به دنبال ابزار پایدار و بومی AWS هستید و لزوماً نیازی به مدیریت منابع خارج از AWS ندارید. به ویژه هنگامی که رعایت تنظیمات AWS خاص مورد نیاز است بسیار عالی است.
زمانی که ترجیح می دهید از زبان های برنامه نویسی استاندارد استفاده کنید، AWS CDK را انتخاب کنید و از مزایای تکنیک های شی گرا برای ایجاد اجزای ابری قابل استفاده مجدد و ماژولار لذت ببرید. معمولاً برای توسعهدهندگانی که میخواهند بهترین شیوههای توسعه نرمافزار را برای تأمین زیرساختها اعمال کنند، جذابتر است.
Terraform رهبر نهایی برای محیط های چند ابری است، یا اگر به ابزاری نیاز دارید که برای مدیریت معماری های پیچیده به اندازه کافی قدرتمند و انعطاف پذیر باشد. همچنین اگر پیشبینی میکنید که انواع سرویسهای ابری را یکپارچه کنید و برای مدیریت آنها به یک رویکرد واحد نیاز دارید، انتخاب درستی است.
اگرچه این توصیهها بر اساس ترکیب خاص هر یک از این ابزارهای IaC است، من به شما توصیه میکنم در مورد هر ابزار کمی تجربه کسب کنید، پس میتوانید در مورد ابزاری تصمیم بگیرید که به بهترین وجه با مهارتها و نیازهای خاص تیم و پروژههای شما هماهنگ است.
اگر تا اینجا پیش رفته اید، خیلی ممنون که خواندید! امیدوارم براتون ارزشمند بوده باشه
اگر می خواهید درباره من و داستان انتقال من از یک ورزشکار حرفه ای به یک مهندس ابر بیشتر بدانید، در لینکدین با من در ارتباط باشید.
ارسال نظر