Infrastructure as Code, או בקיצור IaC, הוא תהליך שמאפשר לנהל ולהגדיר את התשתיות הטכנולוגיות שלכם באמצעות קוד, בדיוק כפי שאתם מנהלים את קוד המקור של היישום שלכם. במקום לנהל שרתים, רשתות, ותשתיות אחרות באופן ידני, IaC מאפשר לכם להגדיר את התשתיות כקבצים טקסטואליים שניתנים לגירסה, שיתוף, ואוטומציה. אחת מהשפות והכלים הנפוצים ביותר ליישום IaC הוא Terraform, כלי קוד פתוח שמפותח על ידי HashiCorp ומאפשר להגדיר תשתיות בענן בצורה פשוטה וברורה.
במאמר זה נלמד כיצד להשתמש ב-Terraform כדי להגדיר, לנהל, ולשדרג תשתיות בענן. נתמקד בדוגמאות פרקטיות שמראות כיצד ניתן ליצור משאבים שונים כמו שרתים, רשתות, ואחסון תוך כדי ניהול הגדרות התשתיות כקוד שניתן לגירסה ולשיתוף בין חברי הצוות.
התקנה והגדרת Terraform
לפני שנצלול לתוך כתיבת קוד עם Terraform, יש להתקין את הכלי במכונה שלכם. ההתקנה של Terraform היא תהליך פשוט שניתן לבצע על מערכות הפעלה שונות, כולל Windows, macOS, ולינוקס.
להתקנת Terraform על מערכת מבוססת לינוקס או macOS, ניתן להשתמש בפקודה הבאה:
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install terraform
לאחר ההתקנה, ניתן לוודא ש-Terraform הותקן בהצלחה על ידי הרצת הפקודה:
terraform --version
כעת, כש-Terraform מותקן, נוכל להתחיל להגדיר את התשתיות שלנו כקוד.
יצירת תשתיות בסיסיות עם Terraform
השלב הראשון בעבודה עם Terraform הוא יצירת קבצי הגדרה שמכילים את התצורה של המשאבים שברצונכם ליצור. הקבצים האלה נכתבים בפורמט HCL (HashiCorp Configuration Language), שפה פשוטה וקלה לקריאה שמאפשרת להגדיר את המשאבים בצורה דקלרטיבית.
נניח שברצונכם ליצור שרת וירטואלי (EC2 Instance) בענן של AWS. הנה דוגמה לקובץ הגדרה פשוט:
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "MyFirstInstance"
}
}
בקובץ הזה, אנחנו מגדירים ספק שירותים (Provider) של AWS, ומבצעים פריסה של שרת EC2 עם מזהה AMI וסוג Instance מסוים. שימו לב שניתן לשנות את האזור (Region) והגדרות נוספות לפי הצרכים שלכם.
כדי לפרוס את התשתית בפועל, יש להריץ מספר פקודות Terraform:
terraform init
terraform plan
terraform apply
הפקודה terraform init
מכינה את סביבת העבודה ומורידה את התוספים הדרושים, terraform plan
מציגה את השינויים שייעשו בתשתית, ו-terraform apply
מיישמת את השינויים בפועל.
ניהול גרסאות של תשתיות
אחד היתרונות הגדולים של שימוש ב-Terraform הוא היכולת לנהל גרסאות של התשתית שלכם כמו קוד. כל שינוי שנעשה בתשתית יכול להיות מגובה על ידי מערכת ניהול גרסאות כמו Git, מה שמאפשר לעקוב אחרי שינויים ולחזור לגרסאות קודמות במידת הצורך.
לדוגמה, אם אתם רוצים לשנות את סוג ה-Instance של השרת שיצרתם מ-"t2.micro" ל-"t2.medium", תוכלו לערוך את הקובץ ולעדכן אותו:
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.medium"
tags = {
Name = "MyUpdatedInstance"
}
}
לאחר מכן, תריצו שוב את הפקודות terraform plan
ו-terraform apply
כדי לעדכן את התשתית בפועל. השינויים האלו יכולים להיות מתועדים במערכת ניהול גרסאות, מה שמאפשר לנהל את התשתיות בצורה יעילה ושקופה.
שימוש במודולים (Modules) לשימוש חוזר
בפרויקטים גדולים, אתם תמצאו את עצמכם מגדירים את אותם המשאבים שוב ושוב. כדי למנוע כפילות ולייעל את תהליך ההגדרה, ניתן להשתמש במודולים (Modules). מודול הוא קבוצה של קבצי Terraform שמגדירים משאב או קבוצת משאבים שניתן להשתמש בהם מחדש במקומות שונים בפרויקט.
נניח שברצונכם ליצור מודול שיוצר רשת (VPC), תת-רשת (Subnet), ושער (Gateway) ב-AWS. ניתן להגדיר מודול בצורה הבאה:
module "vpc" {
source = "./modules/vpc"
vpc_name = "MyVPC"
cidr = "10.0.0.0/16"
azs = ["us-west-2a", "us-west-2b"]
public_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
}
במקרה הזה, המודול "vpc" מוגדר בתיקיית "modules/vpc" ומכיל את כל הקבצים הנדרשים ליצירת VPC ב-AWS. ניתן לשנות את הפרמטרים של המודול כדי להתאים אותו לצרכים שלכם ולשימוש חוזר בפרויקטים שונים.
ניהול State ב-Terraform
אחד המרכיבים החשובים ביותר בעבודה עם Terraform הוא ה-State, קובץ שמכיל את המצב הנוכחי של התשתית שלכם. קובץ זה מאפשר ל-Terraform לעקוב אחרי המשאבים שנוצרו ולבצע שינויים בצורה חכמה מבלי ליצור משאבים מחדש או למחוק משאבים קיימים.
באופן ברירת מחדל, קובץ ה-State נשמר במחשב המקומי שבו הרצתם את Terraform. עם זאת, בפרויקטים גדולים, מומלץ לשמור את ה-State במקום מרכזי ונגיש לכל חברי הצוות, כמו ב-S3 של AWS או ב-Remote Backend.
להלן דוגמה להגדרה של Remote Backend ב-S3:
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "global/s3/terraform.tfstate"
region = "us-west-2"
}
}
בקובץ הזה, הגדרנו את Terraform לשמור את ה-State בקובץ שנמצא בדלי S3 מסוים. זה מאפשר גישה משותפת לקובץ ה-State ומונע סיכונים של סנכרון לא נכון בין חברי הצוות.
Terraform Workspace: ניהול סביבות שונות
בפרויקטים מורכבים, ייתכן שתצטרכו לנהל מספר סביבות כמו פיתוח, בדיקות, וייצור. Terraform מספקת כלים לניהול סביבות שונות בעזרת Workspaces. כל Workspace מייצג סביבה נפרדת עם הגדרות State משלה.
כדי ליצור ולנהל Workspaces, ניתן להשתמש בפקודות הבאות:
terraform workspace new development
terraform workspace select development
terraform workspace list
הפקודות האלה יוצרות Workspace חדש בשם "development" ובוחרות בו כסביבה הפעילה. זה מאפשר לבצע שינויים בסביבה אחת מבלי להשפיע על סביבות אחרות.
שימוש ב-Terraform עם ספקי ענן שונים
אחד היתרונות הגדולים של Terraform הוא התמיכה הרחבה שלו בספקי ענן שונים כמו AWS, Azure, Google Cloud, ועוד. זה מאפשר לנהל תשתיות בעננים שונים עם אותו הכלי ואותם העקרונות.
להלן דוגמה לשימוש ב-Terraform עם Azure ליצירת מכונת וירטואלית:
provider "azurerm" {
features = {}
}
resource "azurerm_resource_group" "example" {
name = "example-resources"
location = "West Europe"
}
resource "azurerm_virtual_network" "example" {
name = "example-network"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.example.location
resource_group_name = azurerm_resource_group.example.name
}
בדוגמה הזו, אנחנו יוצרים קבוצת משאבים (Resource Group) ורשת וירטואלית ב-Azure. ניתן לשלב את ההגדרות הללו עם משאבים אחרים כדי ליצור תשתיות מורכבות ומגוונות.
סיכום
Terraform הוא כלי חזק וגמיש לניהול תשתיות כקוד (IaC), המאפשר להגדיר, לנהל ולשדרג תשתיות בענן בצורה יעילה ואוטומטית. בעזרת Terraform, ניתן לנהל תשתיות מורכבות בצורה פשוטה, לנצל את היתרונות של מודולים לשימוש חוזר, לנהל גרסאות של תשתיות כמו קוד, ולבצע אוטומציה של תהליכים בסביבות שונות.
אם אתם מעוניינים ללמוד בצורה מעמיקה יותר אתם מוזמנים להתייעץ איתנו על קורס DevOps.