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)
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)
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)
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:
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:
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:
terraform init
Voorbeeld output:
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:
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:
ssh scyllaadm@<ip-address>
Zodra verbonden, zie je meteen de lijst met hosts in de cluster. Als alternatief kun je de volgende opdracht uitvoeren:
nodetool status
Voorbeeld output:
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:
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:
terraform workspace new cluster_2
cluster_2
is slechts een voorbeeldnaam voor een workspace. Het kan van alles zijn.
Implementeer de Nieuwe Cluster:
terraform apply
De oorspronkelijke cluster blijft in de workspace met de naam default.
Werkspaces opsommen:
terraform workspace list
Wisselen tussen workspaces:
terraform workspace select default
Een workspace verwijderen:
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:
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