In diesem Artikel präsentiere ich ein Beispiel für eine einfache und schnelle Installation von ScyllaDB in der AWS-Cloud mithilfe von Terraform.
Zunächst plante ich, ein ScyllaDB-AMI-Image mit HashiCorp Packer zu erstellen. Später entdeckte ich jedoch, dass offizielle Images verfügbar sind, die es ermöglichen, ScyllaDB während der Instanziierung über Benutzerdaten einfach zu konfigurieren.
Tatsächlich können Benutzerdaten alle in scylla.yaml
unterstützten Parameter definieren. Weitere Optionen und Beispiele finden Sie im scylla-machine-image GitHub-Repository.
Was sollten Sie sonst noch wissen? Damit sich ScyllaDB automatisch konfigurieren und starten kann, müssen unterstützte Instanztypen verwendet werden. Eine Liste solcher Instanztypen finden Sie hier: ScyllaDB Systemanforderungen für AWS. In unserem Beispiel verwenden wir den Typ i4i.large
, da er der günstigste unter den unterstützten Typen ist.
Annahmen
- Ein einzelner Seed-Knoten reicht für das Setup aus.
- Hosts sind öffentlich zugänglich, aber der Zugriff ist auf eine bestimmte IP-Adresse beschränkt (eine statische öffentliche IP-Adresse ist erforderlich).
Terraform-Konfigurationsbeispiel
Im Einklang mit bewährten Verfahren ist der Terraform-Code in mehrere Dateien in einem einzigen Verzeichnis unterteilt.
Variable-Datei (variables.tf)
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."
}
Diese Datei enthält die Definition von Variablen, die im Code in main.tf
verwendet werden. Wir werden sie später besprechen.
Hauptkonfigurationsdatei (main.tf)
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# Konfigurieren Sie den AWS-Anbieter
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
}
Die main.tf
Datei beschreibt die zu erstellenden Infrastrukturressourcen.
Datei zur Beschreibung der Ausgaben (outputs.tf)
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."
}
Diese Datei spezifiziert die Daten, die am Ende ausgegeben werden sollen. In unserem Fall möchten wir die IP-Adressen der Hosts wissen, damit wir uns mit ihnen verbinden können.
Sie können diesen Code auch auf GitHub finden: ScyllaDB Terraform-Beispiel.
So verwenden Sie diese Terraform-Konfigurationsdatei
Zuerst müssen Sie Terraform und AWS CLI installieren.
Die Installation von Terraform variiert je nach Betriebssystem. Details finden Sie in der offiziellen Dokumentation: Terraform Installationsanleitung.
AWS CLI ist ein Python-Modul, das über pip auf ähnliche Weise auf allen Betriebssystemen installiert werden kann, auf denen Python verfügbar ist. Detaillierte Anweisungen sind in der offiziellen Dokumentation verfügbar: AWS CLI auf PyPI.
Der nächste Schritt ist die Einrichtung von Sicherheitsanmeldeinformationen für AWS CLI. Sicherheitsanmeldeinformationen können mit dem IAM-Dienst in AWS erstellt werden. Wir gehen davon aus, dass Sie diese bereits haben.
Um AWS CLI und folglich den AWS-Provider für Terraform zu aktivieren, müssen Sie sie mit folgendem Befehl konfigurieren:
aws configure
Es gibt auch andere Möglichkeiten, Anmeldeinformationen an Terraform weiterzugeben. Weitere Details finden Sie hier: AWS Provider Authentication.
Verständnis der Variablen
Hier ist eine Aufschlüsselung aller Variablen:
- scylladb_version: Die Version von ScyllaDB, die im Bildnamen zur Suche nach der AMI verwendet wird.
- your_public_network: Die externe IP-Adresse, von der aus der Zugriff auf Hosts ermöglicht wird. Sie sollte im CIDR-Format vorliegen (z. B. /32 für eine einzelne Adresse).
- instance_type: Der Typ der AWS-Instanz. Sie müssen einen der oben genannten empfohlenen Typen verwenden.
- number_of_regular_hosts: Die Anzahl der Hosts im Cluster, ausgenommen der Seed-Host.
- ssh_key_name: Der Name des vorab geladenen öffentlichen SSH-Schlüssels, der den Hosts hinzugefügt wird.
Auch wenn Variablen direkt in der Datei variables.tf
überschrieben werden können, ist es besser, hierfür eine separate Datei zu verwenden. Dies kann eine Datei mit der Erweiterung .tfvars
terraform.tfvars, die sich im selben Verzeichnis wie die Terraform-Konfigurationsdatei befindet.
In einer solchen Datei werden Variablen im Format <NAME> = <VALUE> geschrieben. Zum Beispiel:
ssh_key_name = "KEYNAME"
Wie man eine Terraform-Konfiguration anwendet
Um den Cluster zu erstellen, navigieren Sie zum Verzeichnis, das den Code enthält, und führen Sie die folgenden Befehle aus:
Initialisieren des AWS-Anbieters:
terraform init
Beispiel Ausgabe:
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!
Konfiguration anwenden:
terraform apply
Die Befehlsausgabe zeigt, dass einige Parameter aus der Konfiguration übernommen wurden, während andere automatisch hinzugefügt werden, nachdem die Änderungen angewendet wurden. Bestätigen Sie die Anwendung, indem Sie „yes“ eingeben.
Nachdem Terraform seine Arbeit abgeschlossen hat, gibt es die öffentlichen IP-Adressen der Hosts aus, die Sie verwenden können, um eine Verbindung zu ScyllaDB herzustellen.
Überprüfung der Cluster-Bereitstellung
Um zu überprüfen, ob der ScyllaDB-Cluster erfolgreich bereitgestellt wurde, verbinden Sie sich über SSH damit mit dem folgenden Befehl:
ssh scyllaadm@<ip-address>
Nach der Verbindung sehen Sie sofort die Liste der Hosts im Cluster. Alternativ können Sie den folgenden Befehl ausführen:
nodetool status
Beispiel Ausgabe:
Datacenter: eu-west
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Adresse Last Tokens Besitzt Host-ID Rack
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
Alle Hosts müssen UN (Up Normal) in der ersten Spalte haben.
Hosts zum Cluster hinzufügen
ScyllaDB ermöglicht es Ihnen, Hosts einfach zu Clustern hinzuzufügen (aber nicht zu entfernen). Terraform speichert wiederum den Zustand des vorherigen Durchlaufs und erinnert sich beispielsweise an die IP-Adresse des Seed-Hosts. Daher können Sie einfach die Anzahl der Hosts in der Variablen erhöhen und Terraform erneut ausführen. Der neue Host tritt automatisch dem Cluster bei.
Fügen Sie die folgende Zeile zu Ihrer Variablen-Datei hinzu:
number_of_regular_hosts = 3
In diesem Beispiel wird ein weiterer Host zum Cluster hinzugefügt, aber Sie können die Variable auf eine beliebige Zahl größer als 2 setzen.
Führen Sie terraform apply
erneut aus. Melden Sie sich dann am Seed-Host an und überprüfen Sie, ob die Liste der Hosts gewachsen ist.
Verwalten mehrerer Cluster
Sie können mehrere Cluster mit einer einzigen Terraform-Konfiguration bereitstellen, indem Sie Workspaces verwenden.
Erstellen Sie einen neuen Workspace:
terraform workspace new cluster_2
cluster_2
ist nur ein Beispielname für einen Workspace. Er kann beliebig sein.
Bereitstellung des neuen Clusters:
terraform apply
Der ursprüngliche Cluster bleibt im Workspace mit dem Namen default.
Workspaces auflisten:
terraform workspace list
Zwischen Workspaces wechseln:
terraform workspace select default
Einen Workspace löschen:
terraform workspace delete cluster_2
Zerstören des Clusters
Um ein ScyllaDB-Cluster und alle zugehörigen Entitäten zu löschen, verwenden Sie den folgenden Befehl im gewünschten Workspace:
terraform destroy
Dies wird alle Ressourcen bereinigen, die von Terraform für dieses Cluster erstellt wurden.
Fazit
Mit diesem Leitfaden können Sie ScyllaDB-Cluster auf AWS mithilfe von Terraform sicher einrichten, verwalten und erweitern. Die bereitgestellten Schritt-für-Schritt-Anleitungen gewährleisten ein nahtloses Bereitstellungserlebnis, sodass Sie sich auf die Leistung und Skalierbarkeit Ihrer Anwendung konzentrieren können.
Zusätzlich ermöglicht Ihnen die Flexibilität von Terraform, Ihren Cluster problemlos an Ihre Bedürfnisse anzupassen und zu skalieren, sei es durch das Hinzufügen neuer Hosts oder das Verwalten mehrerer Cluster mit Arbeitsbereichen. Für weitere Details und erweiterte Konfigurationen konsultieren Sie die offizielle Dokumentation für Terraform und ScyllaDB, die eine Fülle von Ressourcen bieten, um das Potenzial Ihrer Infrastruktur optimal zu nutzen.
Source:
https://dzone.com/articles/setting-up-a-scylladb-cluster-on-aws-using-terraform