CloudFormation vs Terraform

Terraform در هر سناریویی نسبت به CloudFormation برتر است ، مگر در مواردی که کاملاً مجبور باشید از ویژگی های لبه های خونریزی AWS استفاده کنید. به همین دلیل

منحنی یادگیری:

من فکر می کنم بیشتر افراد با پیروی از آموزش ها یا دیدن مثال ها ، فن آوری های جدید را یاد می گیرند. حداقل با سطح ورود ، این کار با اکثر زبانهای برنامه نویسی بسیار آسان است.
نه با CloudFormation. قالب JSON (یا YAML) است. این طرحی طراحی شده است که توسط رایانه ها ساخته شده و تولید شود - نه انسان. این کار را خودتان امتحان کنید ، در زیر نمونه ای از نمونه کد مورد نیاز برای چرخش نمونه EC2 (در اصل یک VM) وجود دارد:

{
  "AWSTemplateFormatVersion": "2010-09-09" ،
...
150 سطر بلاه بلها ...
...
  ،

  "منابع":
    "EC2Instance": {
      "نوع": "AWS :: EC2 :: نمونه" ،
      "خواص":
        "UserData": {"Fn :: Base64": {"Fn :: بپیوندید": ["" ، ["IPAddress =" ، {"Ref": "IPAddress"}]]}} ،
        "InstanceType": {"Ref": "InstanceType"} ،
        "SecurityGroups": [{"Ref": "InstanceSecuranceGroup"}] ،
        "KeyName": {"Ref": "KeyName"} ،
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI" ، Ref "Ref": "AWS :: Region"،
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch" ، Ref "Ref": "InstanceType"} ، "Arch"]}]
      }
    ،

    "InstanceSecuranceGroup": {
      "Type": "AWS :: EC2 :: SecurityGroup" ،
      "خواص":
        "GroupDescription": "دسترسی SSH را فعال کنید" ،
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp" ، "FromPort": "22"، "ToPort": "22"، "CidrIp": {"Ref": "SSHLocation"}}]
      }
    ،

    "آدرس آی پی" : {
      "Type": "AWS :: EC2 :: EIP"
    ،

    "IPAssoc": {
      "Type": "AWS :: EC2 :: EIPAssociation" ،
      "خواص":
        "InstanceId": {"Ref": "EC2Instance"} ،
        "EIP": {"Ref": "IPAddress"}
      }
    }
  ،
  "خروجی ها" : {
    "InstanceId":
      "توضیحات": "InstanceId از نمونه تازه EC2" ،
      "مقدار": {"Ref": "EC2Instance"}
    ،
    "InstanceIPAddress": {
      "توضیحات": "آدرس IP نمونه تازه EC2 ایجاد شده" ،
      "مقدار": {"Ref": "IPAddress"}
    }
  }
}

تند و زننده 210 خط کد برای بدست آوردن یک VM با IP عمومی که توسط گروه امنیتی محافظت می شود. 210. 210! با هر الگویی مقدار عظیمی از کد دیگ بخار وجود دارد ، که در اصل نویز است (بعداً درباره این مورد).
اگر این کافی نیست که شما را در این مرحله کنار بگذارید ، به اسناد رسمی نگاهی بیندازید. اکنون به سمت استفاده از YAML تغییر کرده است ، اما وقتی می خواهید قطعات نمونه را بررسی کنید ، معلوم می شود که همه آنها در JSON هستند. در مورد نتایج google نیز صادق است.
BTW وقتی قطعه های نمونه مختلفی را در هر منطقه بدست آورده اید ، می توانید چیزی ماهی بگویید

دور شماره 1: CF: 0 TF: 1

کد نوشتن

همان استدلال های فوق تقریبا برای نوشتن کد خود صدق می کند. برای مثال سریع ، دقیقاً به همان منابع موجود در بالا نگاهی بیندازید ، اما در Terraform توضیح داده شده است:

منبع "aws_instance" "وب"
  ami = "12345-6789-10"
  mînak_type = "t2.micro"

  برچسب ها
    نام = "شیرین"
  }
}
داده "aws_eip" "pip"
  public_ip = "1.1.1.1"
}

منبع "aws_eip_association" "pip"
  shembull_id = "$ {aws_instance.web.id}"
  alokary_id = "$ {data.aws_eip.pip.id}"
}
منبع "aws_securance_group" "اجازه_ت"
  name = "اجازه_سش"
  description = "اجازه دهید ssh از همه جا"

  ورود {
    از_پورت = 0
    to_port = 22
    پروتکل = "TCP"
    cidr_blocks = ["0.0.0.0/0"]
  }
}
منبع "aws_network_interface_sg_attachment" "sg_attachment"
  security_group_id = "$ {aws_security_group.allow_all.id}"
  network_interface_id = "$ {aws_instance.web.primary_network_interface_id}"
}

تفاوت تکان دهنده است ، اینطور نیست؟ توجه داشته باشید که مراجعه به منابع دیگر توسط شناسه آنها چقدر آسان است. با یک نگاه سریع می توانید آنچه را که اتفاق می افتد بگویید و تغییرات اساسی در زیرساخت ها ایجاد کنید. که به زیبایی ما را به نقطه دیگری می رساند

دور شماره 2 CF: 0 TF: 1

اعتبار سنجی کد

CF فقط برای بررسی نحو امکان پذیر است. بنابراین در بهترین حالت به شما خواهد گفت که براکت اینجا و آنجا را از دست داده اید. قبل از استفاده از الگوی CloudFormation ، نمی دانید که آیا هر متغیری که استفاده کرده اید قابل حل است اما بزرگترین اشکال این است که شما نمی دانید چه اتفاقی خواهد افتاد.
Terraform از طرف دیگر ، پرونده های TT را تأیید می کند ، چک کردن نحو نه تنها اگر همه وابسته ها به درستی حل شوند ، و این نیز به شما برنامه می دهد! بله ، با Terraform در واقع می بینید که قبل از اعمال کد خود چه چیزی ایجاد می شود / تغییر می کند و نابود می شود!

یک نقشه اعدام ایجاد شده است و در زیر نشان داده شده است.
اقدامات منابع با نمادهای زیر نشان داده شده اند:
  + ایجاد کنید
Terraform اقدامات زیر را انجام خواهد داد:
+ azurerm_resource_group.test_tf101
      شناسه: 
      مکان: "ukwest"
      نام: "test_tf101"
      برچسب ها.٪: <کامپيوتر>
+ azurerm_subnet.sub1
      شناسه: 
      address_prefix: "172.16.0.8/29"
      ip_configurations. #: <کامپایل شده>
      نام: "زیر 1"
      network_securance_group_id: 
      source_group_name: "test_tf101"
      path_table_id: 
      virtual_network_name: "test_vnet"
برنامه: 2 اضافه کردن ، 0 برای تغییر ، 0 برای از بین بردن.
-------------------------------------------------- ------------------

دور شماره 3 CF: 0 TF: 1

حالت از راه دور

Terraform به شما امکان می دهد تا داده ها را به راحتی از منابع از راه دور وارد کنید ، به عنوان مثال سایر محیط هایی که در حالت های مختلف کنترل می شوند. این امر به شما امکان جداسازی آسان منابع و مسئولیت ها را می دهد. به سادگی منبع اطلاعات خارجی را اعلام کنید و از آنچه در معرض آن قرار دارد استفاده کنید.
CloudFormation مفهومی از Cross-Stack References ندارد ، اما حتی دریافت مدارک مستند نیز یک درد است و مثال در AWS برای راه اندازی VPC همتا 71 خط است ، در مقایسه با 17 در Terraform.

دور شماره 4 CF: 0 TF: 1

توابع

قطعه زیر را بررسی کنید.

منبع "aws_instance" "وب"
  # برای هر نام میزبان یک نمونه بسازید
  count = "$ {طول (var.hostnames)}"

  # از هر نمونه الگو_فایل مربوطه را تصویب کنید
  user_data = "$ {data.template.web_init. *. ارائه شد [count.index]}"
}

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

دور شماره 5 CF: 0 TF: 1

ماژول ها

شما می توانید منابع خاصی را که همیشه از آنها استفاده می کنید ، گروه بندی کنید و ماژولهایی را ایجاد کنید ، و این باعث می شود که انواع خاصی از منابع را آسانتر کنید. شما می توانید آن را طوری جمع و جور کنید که اعلام یک VM فقط 4 خط کد است! علاوه بر این ، با استفاده از "تعداد" متغیر می توانید به سادگی با تغییر یک عدد ، تعداد دلخواه خود را داشته باشید.

متغیر "count"
  پیش فرض = 2
}

منبع "aws_instance" "وب"
  # ...

  count = "$ {var.count}"

  # مثال را با پیشخوان از اول شروع کنید ، مثلاً. وب-001
  برچسب ها
    نام = "$ {قالب (" وب-٪ 03d "، count.index + 1)}"
  }
}

دور شماره 6 CF: 0 TF: 1

کار گروهی

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

دور شماره 7 CF: 0 TF: 1

ارائه دهندگان

قدرت تخریب شده Terraform تا حد زیادی پایین می آید ، توانایی کنترل هر جنبه ای از زیرساخت های شما با همان ابزار. شما لیستی از ارائه دهندگان 70+ شما می توانید از آنها استفاده کنید ، از AWS ، از طریق لاجوردی ، گرفته تا Gitlab ، Fastly ، Chef ، Docker. و این همه استفاده از همان HCL است که باید یک بار یاد بگیرید. حیرت آور!

دور شماره 8 CF: 0 TF: 1

خلاصه

بعد از 8 دور ،

CloudFormation: 0 در مقابل Terraform: 8.

حتی بعد از اضافه کردن یک نکته اضافی ، حتی دو مورد CloudFormation را نیز برای نزدیک شدن به نتیجه نهایی AWS ، CF 2 TF 8 دانست ، و این بدان معنی است که Terraform کاملاً حریف خود را خرد کرد!
من کاملاً مطمئن هستم که همین موارد در مورد الگوهای Azure ARM در مقابل Terraform هم صدق می کند ، بنابراین در یک مقایسه ، دو مقایسه وجود دارد. این همان چیزی است که من آن را کارآیی می نامم.

سلب مسئولیت
این پست پر است از میانبرها و احتمالاً خطاها و تصورات غلط نیز وجود دارد که با خوشحالی آنها را تصریح خواهم کرد. من دوست دارم بحثی را ایجاد کنم ، بنابراین شاید یک طعمه در اینجا یا آنجا پنهان شده باشد. Terraform FTW.