הגדרת אשכול ScyllaDB על AWS באמצעות Terraform

במאמר זה, אני מציג דוגמה של התקנה פשוטה ומהירה של ScyllaDB בענן של AWS באמצעות Terraform.

מתחילים, כיוונתי ליצור תמונת AMI של ScyllaDB באמצעות HashiCorp Packer. אך מאוחר יותר גיליתי שתמונות רשמיות זמינות, שמאפשרות להגדיר את ScyllaDB בקלות במהלך אתחול המופע באמצעות user data.

בפועל, user data יכולה להגדיר את כל הפרמטרים הנתמכים ב- scylla.yaml. אפשרויות נוספות ודוגמאות ניתן למצוא ב- מאגר הקוד של scylla-machine-image ב-GitHub.

מה עוד עליכם לדעת? על מנת ש-ScyllaDB תגדיר ותתחיל באופן אוטומטי, עליכם להשתמש בסוגי מופע נתמכים. רשימת סוגי המופעים הנתמכים ניתן למצוא כאן: דרישות המערכת של ScyllaDB עבור AWS. בדוגמה שלנו, נשתמש בסוג i4i.large משום שהוא הכי זול מבין סוגי המופעים הנתמכים.

הנחיות

  • מופע זרע יחיד הוא מספיק עבור ההגדרה.
  • המארחים נגישים לציבור עם גישה מוגבלת מכתובת IP ספציפית (נדרשת IP ציבורי סטטי).

דוגמה לתצורת Terraform

בהתאם לשיטות המובילות, קוד ה-Terraform מחולק לקבצים מרובים בתיקייה אחת.

קובץ משתנים (variables.tf)

Plain Text

 

variable "scylladb_version" {
  type        = string
  default     = "6.2.1"
  description = "The version of the ScyllaDB to install."
}

variable "your_public_network" {
  type        = string
  default     = "0.0.0.0/0"
  description = "Your public static IP address or your provider network."
}

variable "instance_type" {
  type        = string
  default     = "i4i.large"
  description = "The AWS instance type."
}

variable "number_of_regular_hosts" {
  type        = number
  default     = 2
  description = "The number of the regular (not seed) hosts in a cluster."
}

variable "ssh_key_name" {
  type        = string
  default     = "my_ssh_key"
  description = "The name of your public SSH key uploaded to AWS."
}

קובץ זה מכיל את ההגדרה של המשתנים שמשמשים בקוד המופיע ב־main.tf. נדון בהם מאוחר יותר.

קובץ התצורה הראשי (main.tf)

Plain Text

 

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

# הגדרת ספק ה־AWS
provider "aws" {
  region = "eu-west-1"
}

variable "scylladb_version" {
  type        = string
  default     = "6.2.1"
  description = "The version of the ScyllaDB to install."
}

variable "your_public_network" {
  type        = string
  default     = "0.0.0.0/0"
  description = "Your public static IP address or your provider network."
}

variable "instance_type" {
  type        = string
  default     = "i4i.large"
  description = "The AWS instance type."
}

variable "number_of_regular_hosts" {
  type        = number
  default     = 2
  description = "The number of the regular (not seed) hosts in a cluster."
}

variable "ssh_key_name" {
  type        = string
  default     = "my_ssh_key"
  description = "The name of your public SSH key uploaded to AWS."
}

data "aws_ami" "scylladb_ami" {
  filter {
    name = "name"
    values = ["ScyllaDB ${var.scylladb_version}"]
  }
}

resource "aws_security_group" "scylladb_all" {
  name        = "scylladb_all"
  description = "Will allow all inbound traffic from your public IP"

  tags = {
    Name = "ScyllaDB"
  }
}

resource "aws_vpc_security_group_ingress_rule" "allow_all_inbound_traffic_ipv4" {
  security_group_id = aws_security_group.scylladb_all.id
  cidr_ipv4         = var.your_public_network
  ip_protocol       = "-1" # semantically equivalent to all ports
}

resource "aws_vpc_security_group_ingress_rule" "allow_all_internal_traffic_ipv4" {
  security_group_id            = aws_security_group.scylladb_all.id
  referenced_security_group_id = aws_security_group.scylladb_all.id
  ip_protocol                  = "-1" # semantically equivalent to all ports
}

resource "aws_vpc_security_group_egress_rule" "allow_all_traffic_ipv4" {
  security_group_id = aws_security_group.scylladb_all.id
  cidr_ipv4         = "0.0.0.0/0"
  ip_protocol       = "-1" # semantically equivalent to all ports
}

resource "aws_instance" "scylladb_seed" {
  ami           = data.aws_ami.scylladb_ami.id
  instance_type = var.instance_type
  vpc_security_group_ids = [aws_security_group.scylladb_all.id]
  key_name      = var.ssh_key_name

  user_data = <<EOF
scylla_yaml:
  cluster_name: test-cluster
  experimental: true
start_scylla_on_first_boot: true
EOF

  tags = {
    Name = "ScyllaDB seed"
  }
}

resource "aws_instance" "scylladb_host" {
  ami           = data.aws_ami.scylladb_ami.id
  instance_type = var.instance_type
  vpc_security_group_ids = [aws_security_group.scylladb_all.id]
  key_name      = var.ssh_key_name

  user_data = <<EOF
scylla_yaml:
  cluster_name: test-cluster
  experimental: true
  seed_provider:
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
        - seeds: ${aws_instance.scylladb_seed.private_ip}
start_scylla_on_first_boot: true
EOF

  tags = {
    Name = "ScyllaDB host"
  }

  count = var.number_of_regular_hosts
}

קובץ ה־main.tf מתאר את משאבי התשתית שיש ליצור.

קובץ המתאר את הפלטים (outputs.tf)

Plain Text

 

output "scylladb_seed_public_ip" {
  value       = aws_instance.scylladb_seed.public_ip
  description = "Public IP address of the ScyllaDB seed host."
}

output "scylladb_host_public_ip" {
  value = [aws_instance.scylladb_host.*.public_ip]
  description = "Public IP addresses of ScyllaDB regular hosts."
}

קובץ זה מציין את הנתונים שיש להוציא בסיום. במקרה שלנו, אנו רוצים לדעת את כתובות ה־IP של המארחים כדי שנוכל להתחבר אליהם.

ניתן גם למצוא את הקוד הזה ב־GitHub: דוגמא ל־ScyllaDB ב־Terraform.

איך להשתמש בקובץ התצורה של Terraform זה

ראשית, עליך להתקין את Terraform ו־AWS CLI.

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

־AWS CLI היא מודול Python שניתן להתקין באמצעות pip בדרך דומה בכל מערכת ההפעלה שבה זמין Python. הוראות מפורטות זמינות בתיעוד הרשמי: AWS CLI ב־PyPI.

השלב הבא הוא להגדיר את פרטי הכניסה לאבטחה עבור AWS CLI. פרטי הכניסה לאבטחה ניתן ליצור באמצעות שירות ה־IAM ב־AWS. אנו מניחים שכבר יש לך אותם.

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

Shell

 

aws configure

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

הבנת המשתנים

כאן פירוט של כל המשתנים:

  • גרסת_scylladb: הגרסה של ScyllaDB, המשמשת בשם התמונה כדי לחפש את ה-AMI.
  • your_public_network: כתובת ה-IP החיצונית ממנה ייאפשר גישה למארחים. עליה להיות בפורמט CIDR (לדוגמה, /32 עבור כתובת יחידה).
  • סוג_המופע: סוג המופע של AWS. עליך להשתמש באחד מהסוגים המומלצים שמוזכרים לעיל.
  • מספר_המארחים_הרגילים: מספר המארחים באשכול, ללא המארח הזרע.
  • שם_המפתח_ssh: שם המפתח הציבורי המטען מראש שיתווסף למארחים.

אף על פי שניתן לדרוס משתנים ישירות בקובץ variables.tf, עדיף להשתמש בקובץ נפרד למטרה זו. זה יכול להיות קובץ כלשהו עם סיומת .tfvars, כגון terraform.tfvars, הממוקם באותו תיקייה כקובץ התצורה של Terraform.

בקובץ כזה, המשתנים נכתבים בפורמט <שם> = <ערך>. לדוגמה:

Plain Text

 

ssh_key_name = "KEYNAME"

כיצד ליישם תצורת Terraform

כדי ליצור את האשף, נווט אל התיקייה שמכילה את הקוד והרץ את הפקודות הבאות:

אתחול ספק AWS:

Shell

 

terraform init

דוגמה לפלט:

Plain Text

 

Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 5.0"...
- Installing hashicorp/aws v5.82.2...
- Installed hashicorp/aws v5.82.2 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

החל את התצורה:

Shell

 

terraform apply

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

לאחר ש-Terraform סיים את עבודתו, יופיעו כתובות IP ציבוריות של המארחים, שתוכל להשתמש בהן כדי להתחבר ל-ScyllaDB.

אימות הפרישה של האשף

כדי לוודא שאשף ScyllaDB הוקם בהצלחה, התחבר אליו באמצעות SSH באמצעות הפקודה הבאה:

Shell

 

ssh scyllaadm@<ip-address>

לאחר התחברות, תראה מיד את רשימת המארחים באשף. בנוסף, תוכל להריץ את הפקודה הבאה:

Shell

 

nodetool status

דוגמה לפלט:

Plain Text

 

Datacenter: eu-west
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- כתובת       נטען      טוקנים מוחזקת מזהה מארח                              רחוב
UN 172.31.39.205 489.02 KB 256    ?    ac814131-bac5-488b-b7f8-b7201a8dbb23 1b  
UN 172.31.42.145 466.77 KB 256    ?    0bd8a16f-26d3-4665-878c-74b992b91a70 1b  
UN 172.31.46.42  526.42 KB 256    ?    3eb8966e-b42b-48c3-9938-7f24b1a6b097 1b  

כל המארחים חייבים להציג UN (מופעל תקין) בעמוד הראשון.

הוספת מארחים לאשף

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

הוסף את השורה הבאה לקובץ המשתנים שלך:

Plain Text

 

number_of_regular_hosts = 3

בדוגמא זו, יתווסף עוד מארח אחד לערך, אך ניתן להגדיר את המשתנה לכל מספר שהוא גדול מ-2.

הריצו את terraform apply שוב. לאחר מכן, התחברו למארח המקור ווודאו שרשימת המארחים התרחבה.

ניהול מרובי קבוצות

ניתן להפעיל מספר קבוצות באמצעות תצורת Terraform אחת באמצעות Workspaces.

צור מרחב עבודה חדש:

Shell

 

terraform workspace new cluster_2

cluster_2 הוא רק שם דוגמה למרחב עבודה. זה יכול להיות כל שם.

הפעל את הקבוצה החדשה:

Shell

 

terraform apply

הקבוצה המקורית תישאר במרחב העבודה בשם default.

רשימת מרחבי עבודה:

Shell

 

terraform workspace list

החלף בין מרחבי עבודה:

Shell

 

terraform workspace select default

מחק מרחב עבודה:

Shell

 

terraform workspace delete cluster_2

משמידים את הקבוצה

כדי למחוק את קבוצת המידע של ScyllaDB וכל הישויות הקשורות, השתמשו בפקודה הבאה במרחב העבודה הרצוי:

Shell

 

terraform destroy

פעולה זו תנקה את כל המשאבים שנוצרו על ידי Terraform עבור אותה קבוצה.

מסקנה

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

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

Source:
https://dzone.com/articles/setting-up-a-scylladb-cluster-on-aws-using-terraform