إعداد مجموعة بيانات ScyllaDB على خدمة AWS باستخدام Terraform

في هذه المقالة، أقدم مثالاً على تثبيت بسيط وسريع لـ ScyllaDB في سحابة AWS باستخدام Terraform.

في البداية، كنت أنوي إنشاء صورة AMI لـ ScyllaDB باستخدام HashiCorp Packer. ومع ذلك، اكتشفت لاحقًا أن هناك صورًا رسمية متاحة، مما يسمح بتكوين ScyllaDB بسهولة أثناء تهيئة المثيل عبر بيانات المستخدم.

في الواقع، يمكن أن تحدد بيانات المستخدم جميع المعلمات المدعومة في scylla.yaml. يمكن العثور على خيارات إضافية وأمثلة في مستودع GitHub scylla-machine-image.

ماذا يجب أن تعرف أيضًا؟ لكي يتم تكوين وبدء 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 وحدة بايثون يمكن تثبيتها عبر pip بطريقة مشابهة عبر جميع أنظمة التشغيل التي تتوفر فيها بايثون. التعليمات التفصيلية متاحة في الوثائق الرسمية: AWS CLI على PyPI.

الخطوة التالية هي إعداد بيانات الاعتماد الأمنية لـ AWS CLI. يمكن إنشاء بيانات الاعتماد الأمنية باستخدام خدمة IAM في AWS. نفترض أنك تمتلكها بالفعل.

لتمكين سطر الأوامر AWS CLI وبالتالي موفر AWS لـ Terraform من استخدام بيانات الاعتماد الخاصة بك، تحتاج إلى تكوينها باستخدام الأمر التالي:

Shell

 

aws configure

هناك طرق أخرى لتمرير بيانات الاعتماد إلى Terraform. يمكن العثور على المزيد من التفاصيل هنا: مصادقة موفر AWS.

فهم المتغيرات

إليك تفصيل لجميع المتغيرات:

  • scylladb_version: إصدار ScyllaDB، المستخدم في اسم الصورة للبحث عن AMI.
  • your_public_network: عنوان IP الخارجي الذي سيتم السماح بالوصول إلى المضيفين منه. يجب أن يكون في تنسيق CIDR (على سبيل المثال، /32 لعنوان واحد).
  • instance_type: نوع مثيل AWS. يجب عليك استخدام أحد الأنواع الموصى بها المذكورة أعلاه.
  • number_of_regular_hosts: عدد المضيفين في العنقود، باستثناء المضيف البذري.
  • ssh_key_name: اسم المفتاح العام SSH المحمل مسبقًا الذي سيتم إضافته إلى المضيفين.

على الرغم من أنه يمكن تجاوز المتغيرات مباشرة في ملف variables.tf، إلا أنه من الأفضل استخدام ملف منفصل لهذا الغرض. يمكن أن يكون أي ملف بامتداد .tfvars، مثل terraform.tfvars، الموجود في نفس دليل ملف تكوين Terraform.

في مثل هذا الملف، يتم كتابة المتغيرات بالتنسيق <NAME> = <VALUE>. على سبيل المثال:

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

أضف السطر التالي إلى ملف المتغيرات الخاص بك:

Plain Text

 

number_of_regular_hosts = 3

في هذا المثال، سيتم إضافة مضيف آخر إلى المجموعة، ولكن يمكنك تعيين المتغير إلى أي رقم أكبر من 2.

قم بتشغيل terraform apply مرة أخرى. ثم، قم بتسجيل الدخول إلى المضيف الأصلي وتحقق من زيادة قائمة المضيفين.

إدارة عدة مجموعات

يمكنك نشر عدة مجموعات باستخدام تكوين Terraform واحد عن طريق استخدام مساحات العمل.

إنشاء مساحة عمل جديدة:

Shell

 

terraform workspace new cluster_2

cluster_2 هو مثال على اسم لمساحة عمل. يمكن أن يكون أي شيء.

نشر المجموعة الجديدة:

Shell

 

terraform apply

ستبقى المجموعة الأصلية في مساحة العمل التي تحمل الاسم الافتراضي.

قائمة بالمساحات العمل:

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