Het opzetten van een ScyllaDB-cluster op AWS met behulp van Terraform

In dit artikel presenteer ik een voorbeeld van een eenvoudige en snelle installatie van ScyllaDB in de AWS-cloud met behulp van Terraform.

Aanvankelijk was het mijn bedoeling om een ScyllaDB AMI-image te maken met behulp van HashiCorp Packer. Ik ontdekte echter later dat officiële afbeeldingen beschikbaar zijn, waardoor ScyllaDB eenvoudig geconfigureerd kan worden tijdens de instantie-initialisatie via gebruikersgegevens.

In feite kan gebruikersgegevens alle parameters definiëren die worden ondersteund in scylla.yaml. Extra opties en voorbeelden zijn te vinden in scylla-machine-image GitHub-opslagplaats.

Wat moet je nog meer weten? Om ScyllaDB automatisch te configureren en te starten, moeten ondersteunde instantietypen worden gebruikt. Een lijst met dergelijke instantietypen is hier te vinden: ScyllaDB Systeemvereisten voor AWS. In ons voorbeeld zullen we het type i4i.large gebruiken, omdat dit het goedkoopste is onder de ondersteunde typen.

Veronderstellingen

  • Een enkele seed-node is voldoende voor de installatie.
  • Hosts zijn openbaar toegankelijk met beperkte toegang vanaf een specifiek IP-adres (een statisch openbaar IP-adres is vereist).

Terraform Configuratievoorbeeld

Volgens de beste praktijken is de Terraform-code verdeeld over meerdere bestanden in één map.

Variabelenbestand (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."
}

Dit bestand bevat de definitie van variabelen die worden gebruikt in de code die zich in main.tf bevindt. We zullen ze later bespreken.

Hoofdconfiguratiebestand (main.tf)

Plain Text

 

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

# Configureer de AWS Provider
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
}

Het main.tf bestand beschrijft de infrastructuurresources die moeten worden aangemaakt.

Bestand dat Outputs Beschrijft (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."
}

Dit bestand specificeert de gegevens die aan het einde moeten worden weergegeven. In ons geval willen we de IP-adressen van de hosts weten, zodat we verbinding met hen kunnen maken.

Je kunt deze code ook op GitHub vinden: ScyllaDB Terraform Voorbeeld.

Hoe deze Terraform-configuratiebestand te gebruiken

Eerst moet je Terraform en AWS CLI installeren.

De installatie van Terraform verschilt per besturingssysteem. Details zijn te vinden in de officiële documentatie: Terraform Installatiehandleiding.

AWS CLI is een Python-module die op een vergelijkbare manier via pip kan worden geïnstalleerd op alle besturingssystemen waar Python beschikbaar is. Gedetailleerde instructies zijn beschikbaar in de officiële documentatie: AWS CLI op PyPI.

De volgende stap is het instellen van beveiligingsreferenties voor AWS CLI. Beveiligingsreferenties kunnen worden aangemaakt met de IAM-service in AWS. We gaan ervan uit dat je deze al hebt.

Om AWS CLI en daarmee de AWS-provider voor Terraform in staat te stellen uw inloggegevens te gebruiken, moet u deze configureren met behulp van de volgende opdracht:

Shell

 

aws configure

Er zijn andere manieren om inloggegevens aan Terraform door te geven. Meer details zijn hier te vinden: AWS Provider Authenticatie.

De Variabelen Begrijpen

Hier is een overzicht van alle variabelen:

  • scylladb_version: De versie van ScyllaDB, gebruikt in de afbeeldingsnaam om de AMI te zoeken.
  • your_public_network: Het externe IP-adres waarmee toegang tot de hosts zal worden verleend. Het moet in CIDR-indeling zijn (bijv. /32 voor een enkel adres).
  • instance_type: Het type AWS-instance. U moet een van de hierboven aanbevolen types gebruiken.
  • number_of_regular_hosts: Het aantal hosts in de cluster, exclusief de seed-host.
  • ssh_key_name: De naam van de vooraf geladen openbare SSH-sleutel die aan de hosts zal worden toegevoegd.

Hoewel variabelen rechtstreeks in het variables.tf bestand kunnen worden overschreven, is het beter om hiervoor een apart bestand te gebruiken. Dit kan elk bestand zijn met een .tfvars extensie, zoals terraform.tfvars, dat zich in dezelfde directory bevindt als het Terraform-configuratiebestand.

In zo’n bestand worden variabelen geschreven in het formaat <NAAM> = <WAARDE>. Bijvoorbeeld:

Plain Text

 

ssh_key_name = "KEYNAME"

Hoe een Terraform-configuratie toe te passen

Om de cluster te maken, navigeer naar de map die de code bevat en voer de volgende opdrachten uit:

Initialiseer de AWS Provider:

Shell

 

terraform init

Voorbeeld output:

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!

Pas de configuratie toe:

Shell

 

terraform apply

De uitvoer van de opdracht zal tonen dat sommige parameters zijn overgenomen uit de gegeven configuratie aan Terraform, terwijl andere automatisch zullen worden toegevoegd na het toepassen van de wijzigingen. Bevestig de toepassing door ja te typen.

Na het voltooien van het werk zal Terraform de openbare IP-adressen van de hosts tonen, die je kunt gebruiken om verbinding te maken met ScyllaDB.

Verifiëren van de implementatie van de cluster

Om te controleren of de ScyllaDB-cluster succesvol is geïmplementeerd, maak verbinding ermee via SSH met de volgende opdracht:

Shell

 

ssh scyllaadm@<ip-address>

Zodra verbonden, zie je meteen de lijst met hosts in de cluster. Als alternatief kun je de volgende opdracht uitvoeren:

Shell

 

nodetool status

Voorbeeld output:

Plain Text

 

Datacenter: eu-west
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Adres       Belasting      Tokens Bezit 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 moeten UN (Up Normal) hebben in de eerste kolom.

Hosts toevoegen aan de cluster

ScyllaDB stelt je in staat om gemakkelijk hosts toe te voegen aan clusters (maar niet om ze te verwijderen). Terraform slaat daarentegen de staat van de vorige run op en onthoudt bijvoorbeeld het IP-adres van de seed host. Daarom kun je eenvoudig het aantal hosts in de variabele verhogen en Terraform opnieuw uitvoeren. De nieuwe host zal automatisch aan de cluster deelnemen.

Voeg de volgende regel toe aan je variabelenbestand:

Plain Text

 

number_of_regular_hosts = 3

In dit voorbeeld zal er één extra host aan de cluster worden toegevoegd, maar je kunt de variabele instellen op elk getal groter dan 2.

Voer terraform apply opnieuw uit. Log vervolgens in op de seed host en controleer of de lijst met hosts is toegenomen.

Beheren van Meerdere Clusters

Je kunt meerdere clusters implementeren met een enkele Terraform-configuratie door gebruik te maken van workspaces.

Maak een nieuwe workspace aan:

Shell

 

terraform workspace new cluster_2

cluster_2 is slechts een voorbeeldnaam voor een workspace. Het kan van alles zijn.

Implementeer de Nieuwe Cluster:

Shell

 

terraform apply

De oorspronkelijke cluster blijft in de workspace met de naam default.

Werkspaces opsommen:

Shell

 

terraform workspace list

Wisselen tussen workspaces:

Shell

 

terraform workspace select default

Een workspace verwijderen:

Shell

 

terraform workspace delete cluster_2

Het Vernietigen van de Cluster

Om een ScyllaDB-cluster en alle bijbehorende entiteiten te verwijderen, gebruik je de volgende opdracht in de gewenste workspace:

Shell

 

terraform destroy

Dit zal alle door Terraform gemaakte bronnen voor die cluster opruimen.

Conclusie

Met deze gids kun je met vertrouwen ScyllaDB-clusters op AWS opzetten, beheren en uitbreiden met behulp van Terraform. De stap-voor-stap instructies zorgen voor een naadloze implementatie-ervaring, zodat je je kunt concentreren op de prestaties en schaalbaarheid van je applicatie.

Bovendien stelt de flexibiliteit van Terraform je in staat om je cluster eenvoudig aan te passen en te schalen wanneer dat nodig is, of het nu gaat om het toevoegen van nieuwe hosts of het beheren van meerdere clusters met workspaces. Voor meer details en geavanceerde configuraties, raadpleeg de officiële documentatie voor Terraform en ScyllaDB, die een schat aan informatie bieden om je te helpen het potentieel van je infrastructuur te maximaliseren.

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