CloudFormation مقابل Terraform

Terraform أفضل من CloudFormation في كل سيناريو إلا عندما يكون عليك استخدام ميزات حافة النزيف من AWS. إليكم السبب.

منحنى التعلم:

أعتقد أن معظم الناس يتعلمون التقنيات الجديدة ، من خلال اتباع البرامج التعليمية أو النظر في الأمثلة. هذا سهل إلى حد ما مع معظم لغات البرمجة ، على الأقل لمستوى الدخول.
ليس مع CloudFormation. إنه تنسيق JSON (أو YAML). تم تصميمه ليتم استهلاكه وإنتاجه بواسطة أجهزة الكمبيوتر - وليس البشر. جرب ذلك بنفسك ، فيما يلي مثال مقتطف للشفرة مطلوب لتدوير مثيل EC2 (في الأساس VM):

{
  "AWSTemplateFormatVersion": "2010-09-09" ،
....
150 خطوط بلاه بلاه بلاه ...
....
  }،

  "مصادر" : {
    "EC2Instance": {
      "النوع": "AWS :: EC2 :: مثيل" ،
      "الخصائص" : {
        "UserData": {"Fn :: Base64": {"Fn :: Join": [""، ["IPAddress ="، {"Ref": "IPAddress"}]]}}،
        "InstanceType": {"Ref": "InstanceType"}،
        "مجموعات الأمان": [{"Ref": "InstanceSecurityGroup"}] ،
        "KeyName": {"Ref": "KeyName"}،
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI"، {"Ref": "AWS :: Region"}،
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch"، {"Ref": "InstanceType"}، "Arch"]}]}
      }
    }،

    "InstanceSecurityGroup": {
      "النوع": "AWS :: EC2 :: SecurityGroup" ،
      "الخصائص" : {
        "GroupDescription": "تمكين الوصول إلى SSH" ،
        "SecurityGroupIngress":
          [{"IpProtocol": "tcp" ، "FromPort": "22" ، "ToPort": "22" ، "CidrIp": {"Ref": "SSHLocation"}}]
      }
    }،

    "IPAddress": {
      "النوع": "AWS :: EC2 :: EIP"
    }،

    "IPAssoc": {
      "النوع": "AWS :: EC2 :: EIPAssociation"،
      "الخصائص" : {
        "InstanceId": {"Ref": "EC2Instance"}،
        "EIP": {"Ref": "IPAddress"}
      }
    }
  }،
  "المخرجات": {
    "InstanceId": {
      "الوصف": "مثيل مثيل EC2 المنشأ حديثًا" ،
      "القيمة": {"Ref": "EC2Instance"}
    }،
    "InstanceIPAddress": {
      "الوصف": "عنوان IP لمثيل EC2 المنشأ حديثًا" ،
      "القيمة": {"Ref": "IPAddress"}
    }
  }
}

مقرف. 210 سطور من التعليمات البرمجية للحصول على VM مع IP عام محمي بواسطة Security Group 210. 210! مع كل قالب هناك كمية هائلة من كود الغلاية ، وهذا في الأساس الضوضاء (أكثر في هذا في وقت لاحق).
إذا لم يكن ذلك كافيًا لإيقافك في هذه المرحلة ، فقم بإلقاء نظرة على الوثائق الرسمية. لقد تحول الآن نحو استخدام YAML ، ولكن عندما تريد إلقاء نظرة على نماذج المقتطفات ، اتضح أنها كلها في JSON. وينطبق الشيء نفسه على نتائج جوجل.
بالمناسبة. عندما يكون لديك قصاصات مختلفة لكل منطقة ، يمكنك قول شيء مريب

الجولة رقم 1: CF: 0 TF: 1

كود الكتابة

تنطبق نفس الحجج المذكورة أعلاه إلى حد كبير على كتابة الكود نفسه. للحصول على مثال سريع ، ألقِ نظرة على الموارد نفسها بالضبط المذكورة أعلاه ، ولكن الموصوفة في Terraform:

المورد "aws_instance" "web" {
  عامي = "12345-6789-10"
  example_type = "t2.micro"

  العلامات {
    الاسم = "الحلو"
  }
}
البيانات "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

المصدر "aws_eip_association" "pip" {
  example_id = "$ {aws_instance.web.id}"
  تخصيص_ "=" $ {data.aws_eip.pip.id} "
}
المصدر "aws_security_group" "allow_all" {
  name = "allow_ssh"
  الوصف = "اسمح بـ ssh من كل مكان"

  دخول
    from_port = 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 بالتحقق من صحة ملفات .tf ، والتحقق ليس فقط من بناء الجملة ولكن أيضًا إذا تم حل جميع التبعيات بشكل صحيح ، وهو يوفر لك خطة! نعم ، مع Terraform ، ستتمكن فعلًا من رؤية ما سيتم إنشاؤه / تغييره / إتلافه قبل تطبيق الكود الخاص بك!

تم إنشاء خطة التنفيذ وهي موضحة أدناه.
تتم الإشارة إلى إجراءات الموارد مع الرموز التالية:
  + خلق
ستنفذ Terraform الإجراءات التالية:
+ azurerm_resource_group.test_tf101
      المعرف: <حساب>
      الموقع: "ukwest"
      الاسم: "test_tf101"
      العلامات.٪: 
+ azurerm_subnet.sub1
      المعرف: <حساب>
      address_prefix: "172.16.0.8/29"
      ip_configurations. #: 
      الاسم: "sub-1"
      network_security_group_id: 
      resource_group_name: "test_tf101"
      route_table_id: 
      virtual_network_name: "test_vnet"
خطة: 2 لإضافة ، 0 للتغيير ، 0 لتدمير.
-------------------------------------------------- ------------------

الجولة رقم 3 CF: 0 TF: 1

الدولة النائية

يسمح لك Terraform بسهولة استيراد البيانات من مصادر بعيدة ، على سبيل المثال البيئات الأخرى التي يتم التحكم فيها في حالة مختلفة. هذا يتيح لك سهولة فصل الموارد والمسؤوليات. أعلن ببساطة مصدر المعلومات الخارجية واستخدم كل ما تتعرض له.
لدى CloudFormation فكرة المراجع المتقاطعة ، لكن حتى الحصول على الوثائق هو ألم ، والمثال على AWS لإعداد نظراء VPC هو 71 سطرًا ، مقارنة بـ 17 في Terraform.

الجولة رقم 4 CF: 0 TF: 1

المهام

تحقق من المقتطف أدناه.

المورد "aws_instance" "web" {
  # إنشاء مثيل واحد لكل اسم المضيف
  count = "$ {length (var.hostnames)}"

  # اجتياز كل حالة من القوالب المقابلة لها
  user_data = "$ {data.template.web_init. *. المقدمة [count.index]}"
}

نعم. يحتوي Terraform على عدد قليل من الوظائف المضمنة التي تسمح لك بوضع المنطق في التعليمات البرمجية الخاصة بك ، بحيث يمكنك البناء بشكل أفضل باستخدام رمز أقل ، أو بناء هياكل مختلفة باستخدام نفس الرمز ، ولكن مع متغيرات مختلفة وفقًا للاحتياجات.

الجولة # 5 CF: 0 TF: 1

وحدات

يمكنك تجميع بعض الموارد التي تستخدمها دائمًا بالاقتران وإنشاء وحدات ، مما يجعل من السهل إعلان أنواع معينة من الموارد. يمكنك ضغطه بحيث يكون إعلان VM مجرد 4 سطور من التعليمات البرمجية! ما هو أكثر من ذلك ، باستخدام متغير "العد" يمكنك الحصول على ما تريد ، ببساطة عن طريق تغيير رقم.

متغير "العد" {
  الافتراضي = 2
}

المورد "aws_instance" "web" {
  # ...

  عدد = "$ {var.count}"

  # علامة المثال مع عداد تبدأ من 1 ، أي. شبكة-001
  العلامات {
    الاسم = "$ {format (" web-٪ 03d "، count.index + 1)}"
  }
}

الجولة # 6 CF: 0 TF: 1

العمل بروح الفريق الواحد

نظرًا لأن Terraform’s HCL يشبه أي لغة برمجة أخرى ، فهي تتميز بأنها سهلة الاستخدام وتؤدي إلى جذب الطلبات لإبراز التغييرات بشكل جيد ، لذلك من المريح إجراء المراجعات والتعاون على جزء من الشفرة. حاول أن تفعل الشيء نفسه مع JSON الذي هو في نهاية المطاف بنية البيانات. نصف الفرق هو مجرد ضجيج الغليان ، ثم بعض.

الجولة رقم 7 CF: 0 TF: 1

مقدمي

إن قدرة Terraform غير المستهلكة إلى حد كبير هي القدرة على التحكم في كل جانب من جوانب البنية التحتية الخاصة بك باستخدام نفس الأداة. لديك قائمة تضم أكثر من 70 مزوّدًا يمكنك استخدامه ، بدءًا من AWS ، من خلال Azure ، إلى 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.