CloudFormation לעומת Terraform

הטראפורם עדיפה על CloudFormation בכל תרחיש למעט כאשר אתה בהחלט צריך להשתמש בתכונות קצות דימום מ- AWS. הנה למה.

עקומת למידה:

אני חושב שרוב האנשים לומדים טכנולוגיות חדשות, על ידי ביצוע הדרכות או התבוננות בדוגמאות. זה די קל לעשות עם רוב שפות התכנות, לפחות עבור רמת כניסה.
לא עם CloudFormation. זהו פורמט JSON (או YAML). הוא תוכנן לצריכה ומיוצר על ידי מחשבים - לא על ידי בני אדם. נסה זאת בעצמך, להלן דוגמא לקוד קוד הנדרש כדי להפיץ מופע EC2 (בעצם VM):

{
  "AWSTemplateFormatVersion": "2009-09-09",
....
150 שורות של בלה בלה בלה ...
....
  },

  "משאבים": {
    "EC2Instance": {
      "Type": "AWS :: EC2 :: Instance",
      "נכסים, מאפיינים" : {
        "UserData": {"Fn :: Base64": {"Fn :: הצטרף": ["", ["IPAddress =", {"Ref": "IPAddress"}]]}},
        "InstanceType": {"Ref": "InstanceType"},
        "SecurityGroups": [{"Ref": "InstanceSecurityGroup"}],
        "KeyName": {"Ref": "KeyName"},
        "ImageId": {"Fn :: FindInMap": ["AWSRegionArch2AMI", {"Ref": "AWS :: Region"},
                          {"Fn :: FindInMap": ["AWSInstanceType2Arch", {"Ref": "InstanceType"}, "Arch"]}]}
      }
    },

    "InstanceSecurityGroup": {
      "Type": "AWS :: EC2 :: SecurityGroup",
      "נכסים, מאפיינים" : {
        "GroupDescription": "אפשר גישה ל- SSH",
        "אבטחת קבוצת אבטחה":
          [{"IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": {"Ref": "SSHLocation"}}]
      }
    },

    "כתובת ה - IP" : {
      "Type": "AWS :: EC2 :: EIP"
    },

    "IPAssoc": {
      "Type": "AWS :: EC2 :: EIPAssociation",
      "נכסים, מאפיינים" : {
        "InstanceId": {"Ref": "EC2Instance"},
        "EIP": {"Ref": "IPAddress"}
      }
    }
  },
  "תפוקות": {
    "InstanceId": {
      "תיאור": "מופע זה של מופע EC2 החדש שנוצר",
      "Value": {"Ref": "EC2Instance"}
    },
    "כתובת InstanceIP": {
      "תיאור": "כתובת ה- IP של מופע EC2 החדש שנוצר",
      "Value": {"Ref": "IPAddress"}
    }
  }
}

נבזי. 210 שורות קוד כדי להשיג VM עם IP IP ציבורי המוגן על ידי קבוצת האבטחה. 210. 210! עם כל תבנית יש כמות עצומה של קוד לוח הדוד, זה בעצם רעש (עוד על כך בהמשך).
אם זה לא מספיק כדי לדחות אותך בשלב זה, התבונן בתיעוד הרשמי. זה עבר עכשיו לשימוש ב- YAML, אבל כשאתה רוצה לבדוק את קטעי המדגם, מסתבר שכולם ב- JSON. הדבר נכון גם לגבי תוצאות גוגל.
BTW. כשיש לך קטעי מדגם שונים לכל אזור, אתה יכול לומר משהו דג

סיבוב מס '1: CF: 0 TF: 1

כתיבת קוד

פחות או יותר אותם טיעונים כנ"ל חלים על כתיבת הקוד עצמו. לדוגמא מהירה התבונן באותם משאבים בדיוק כמו לעיל, אך מתוארים ב- Terraform:

משאב "aws_instance" "אינטרנט" {
  ami = "12345-6789-10"
  instance_type = "t2.micro"

  תגיות {
    שם = "מתוק"
  }
}
נתונים "aws_eip" "pip" {
  public_ip = "1.1.1.1"
}

משאב "aws_eip_association" "pip" {
  instance_id = "$ {aws_instance.web.id}"
  allocation_id = "$ {data.aws_eip.pip.id}"
}
משאב "aws_security_group" "allow_all" {
  name = "allow_ssh"
  תיאור = "אפשר ssh מכל מקום"

  חודר {
    מ-_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
      id: 
      מיקום: "ukwest"
      שם: "test_tf101"
      תגים.%: <ממוחשב>
+ azurerm_subnet.sub1
      id: 
      address_prefix: "172.16.0.8/29"
      ip_configurations. #: 
      שם: "תת -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" "אינטרנט" {
  # צור מופע אחד לכל שם מארח
  count = "$ {אורך (var.hostnames)}"

  # העבירו כל מופע לתבנית_הקבץ המקביל לו
  user_data = "$ {data.template.web_init. *. שניתנו [count.index]}"
}

כן. ל- Terraform יש לא מעט פונקציות מובנות המאפשרות לך להכניס את ההיגיון לקוד שלך, כך שתוכל לבנות טוב יותר עם פחות קוד, או לבנות מבנים שונים באמצעות אותו קוד, אך עם משתנים שונים בהתאם לצרכים.

סיבוב מס '5 CF: 0 TF: 1

מודולים

אתה יכול לקבץ משאבים מסוימים שאתה משתמש בהם תמיד יחד וליצור מודולים, מה שמקל על הכרזת סוגים מסוימים של משאבים. אתה יכול לדחוס את זה כך שהצהרת VM היא רק 4 שורות קוד! מה שכן, באמצעות "ספירה" משתנה אתה יכול לקבל כמה שרק תרצה, פשוט על ידי שינוי מספר.

משתנה "ספירה" {
  ברירת מחדל = 2
}

משאב "aws_instance" "אינטרנט" {
  # ...

  count = "$ {var.count}"

  # תייג את המופע עם מונה החל מ -1, כלומר. web-001
  תגיות {
    Name = "$ {פורמט (" web-% 03d ", count.index + 1)}"
  }
}

סיבוב מס '6 CF: 0 TF: 1

עבודת צוות

מכיוון שה- HCL של Terraform הוא כמו כל שפת תכנות אחרת, הוא ידידותי במיוחד באופן שמושך בקשות בצורה מדויקת להדגיש שינויים, כך שיהיה נוח לבצע ביקורות ולשתף פעולה על פיסת קוד. נסה לעשות את אותו הדבר עם JSON שבסופו של דבר הוא מבנה נתונים. מחצית מהבדלים הם רק רעש של boilerplate, ואז כמה.

סיבוב מס '7 CF: 0 TF: 1

ספקים

העוצמה המוערכת במידה רבה של Terraform היא היכולת לשלוט בכל היבט של התשתית שלך באותו הכלי. יש לך רשימה של למעלה מ -70 ספקים שבהם אתה יכול להשתמש, החל מ- AWS, דרך שוקת, לגיטלאב, במהירות, שף, דוקר, אתה קורא לזה. והכול משתמש באותה HCL שאתה צריך ללמוד פעם אחת. מדהים!

מחזור 8: CF: 0 TF: 1

סיכום

אחרי 8 מחזורים, זה

תצורת ענן: 0 לעומת טראפורם: 8.

אפילו לאחר הוספת נקודה נוספת, עצור אפילו שניים ל- CloudFormation על היותו קרוב יותר לתוצאות הסופיות של AWS הוא CF 2 TF 8, מה שאומר שטראפורם מוחצת לחלוטין את יריבתה!
אני די בטוח שהדבר תקף גם לתבניות של Azure ARM לעומת Terraform, אז הנה, שתי השוואות באחת. עכשיו זה מה שאני מכנה יעילות.

הצהרת אחריות
פוסט זה מלא בקיצורי דרך וכנראה גם טעויות ותפיסות שגויות, אשר אתקן בשמחה כאשר מציינים אותי. אשמח לעורר דיון, אז אולי יש פה או שם פיתיון. טרקטורון FTW.