In questo articolo, presento un esempio di un’installazione semplice e veloce di ScyllaDB nel cloud AWS utilizzando Terraform.
Inizialmente, avevo intenzione di creare un’immagine AMI di ScyllaDB utilizzando HashiCorp Packer. Tuttavia, ho scoperto in seguito che sono disponibili immagini ufficiali, che consentono di configurare facilmente ScyllaDB durante l’inizializzazione dell’istanza tramite i dati dell’utente.
Infatti, i dati dell’utente possono definire tutti i parametri supportati in scylla.yaml
. Ulteriori opzioni ed esempi possono essere trovati nel repository GitHub di scylla-machine-image.
Cosa altro dovresti sapere? Per configurare e avviare automaticamente ScyllaDB, devono essere utilizzati tipi di istanze supportati. Un elenco di tali tipi di istanze può essere trovato qui: Requisiti di sistema di ScyllaDB per AWS. Nel nostro esempio, useremo il tipo i4i.large
poiché è il più economico tra i tipi supportati.
Presupposti
- Un singolo nodo seed è sufficiente per la configurazione.
- Gli host sono accessibili pubblicamente con accesso limitato da un indirizzo IP specifico (è richiesto un IP pubblico statico).
Esempio di Configurazione Terraform
Seguendo le migliori pratiche, il codice Terraform è diviso in file multipli in una singola directory.
File delle Variabili (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."
}
Questo file contiene la definizione delle variabili utilizzate nel codice contenuto in main.tf
. Ne discuteremo più avanti.
File di Configurazione Principale (main.tf)
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# Configura il Provider 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
}
Il file main.tf
descrive le risorse di infrastruttura da creare.
File che Descrive gli Output (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."
}
Questo file specifica i dati da restituire alla fine. Nel nostro caso, vogliamo conoscere gli indirizzi IP degli host per poterci connettere a essi.
Puoi trovare anche questo codice su GitHub: Esempio di Terraform per ScyllaDB.
Come Utilizzare Questo File di Configurazione Terraform
Prima di tutto, è necessario installare Terraform e AWS CLI.
L’installazione di Terraform varia a seconda dei sistemi operativi. I dettagli sono disponibili nella documentazione ufficiale: Guida all’Installazione di Terraform.
AWS CLI è un modulo Python che può essere installato tramite pip in modo simile su tutti i sistemi operativi in cui è disponibile Python. Istruzioni dettagliate sono disponibili nella documentazione ufficiale: AWS CLI su PyPI.
Il prossimo passo è configurare le credenziali di sicurezza per AWS CLI. Le credenziali di sicurezza possono essere create utilizzando il servizio IAM in AWS. Presumiamo che tu le abbia già.
Per abilitare AWS CLI e, di conseguenza, il provider AWS per Terraform ad utilizzare le tue credenziali, è necessario configurarle utilizzando il seguente comando:
aws configure
Esistono altri modi per passare le credenziali a Terraform. Ulteriori dettagli possono essere trovati qui: Autenticazione del Provider AWS.
Comprensione delle Variabili
Ecco una scomposizione di tutte le variabili:
- scylladb_version: La versione di ScyllaDB, utilizzata nel nome dell’immagine per cercare l’AMI.
- your_public_network: L’indirizzo IP esterno da cui sarà consentito l’accesso agli host. Dovrebbe essere in formato CIDR (ad esempio, /32 per un singolo indirizzo).
- instance_type: Il tipo di istanza AWS. È necessario utilizzare uno dei tipi consigliati sopra.
- number_of_regular_hosts: Il numero di host nel cluster, escludendo l’host seed.
- ssh_key_name: Il nome della chiave pubblica SSH pre-caricata che verrà aggiunta agli host.
Sebbene le variabili possano essere sovrascritte direttamente nel file variables.tf
, è meglio utilizzare un file separato a tale scopo. Questo può essere qualsiasi file con estensione .tfvars
, come ad esempio terraform.tfvars
, situato nella stessa directory del file di configurazione di Terraform.
In un file del genere, le variabili sono scritte nel formato <NOME> = <VALORE>. Ad esempio:
ssh_key_name = "KEYNAME"
Come Applicare una Configurazione Terraform
Per creare il cluster, naviga nella directory contenente il codice e esegui i seguenti comandi:
Inizializza il Provider AWS:
terraform init
Esempio di 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!
Applica la configurazione:
terraform apply
L’output del comando mostrerà che alcuni parametri sono stati presi dalla configurazione fornita a Terraform, mentre altri verranno aggiunti automaticamente dopo l’applicazione delle modifiche. Conferma l’applicazione digitando sì.
Dopo che Terraform ha completato il suo lavoro, verranno mostrati gli indirizzi IP pubblici degli host, che potrai utilizzare per connetterti a ScyllaDB.
Verifica del Deployment del Cluster
Per verificare che il cluster di ScyllaDB sia stato distribuito con successo, connettiti ad esso tramite SSH usando il seguente comando:
ssh scyllaadm@<ip-address>
Una volta connesso, vedrai immediatamente l’elenco degli host nel cluster. In alternativa, puoi eseguire il seguente comando:
nodetool status
Esempio di output:
Datacenter: eu-west
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Indirizzo Carico Token Possiede ID Host 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
Tutti gli host devono avere UN (Up Normal) nella prima colonna.
Aggiunta di Host al Cluster
ScyllaDB ti consente di aggiungere facilmente host ai cluster (ma non di rimuoverli). Terraform, a sua volta, salva lo stato dell’esecuzione precedente e ricorda, ad esempio, l’indirizzo IP dell’host di seed. Pertanto, puoi semplicemente aumentare il numero di host nella variabile e eseguire nuovamente Terraform. Il nuovo host si unirà automaticamente al cluster.
Aggiungi la seguente riga al tuo file di variabili:
number_of_regular_hosts = 3
In questo esempio, verrà aggiunto un altro host al cluster, ma è possibile impostare la variabile su qualsiasi numero maggiore di 2.
Esegui nuovamente terraform apply
. Successivamente, accedi all’host seed e verifica che l’elenco degli host sia aumentato.
Gestione di Più Cluster
È possibile distribuire più cluster utilizzando una singola configurazione di Terraform utilizzando i workspaces.
Crea un nuovo workspace:
terraform workspace new cluster_2
cluster_2
è solo un esempio di nome per un workspace. Può essere qualsiasi cosa.
Effettua il Deploy del Nuovo Cluster:
terraform apply
Il cluster originale rimarrà nel workspace denominato default.
Elenco dei workspaces:
terraform workspace list
Passare tra i workspaces:
terraform workspace select default
Elimina un workspace:
terraform workspace delete cluster_2
Distruzione del Cluster
Per eliminare un cluster ScyllaDB e tutte le entità associate, utilizzare il seguente comando nel workspace desiderato:
terraform destroy
Questo pulirà tutte le risorse create da Terraform per quel cluster.
Conclusione
Con questa guida, puoi configurare, gestire ed espandere con fiducia i cluster ScyllaDB su AWS utilizzando Terraform. Le istruzioni passo dopo passo fornite assicurano un’esperienza di distribuzione senza soluzione di continuità, consentendoti di concentrarti sulle prestazioni e la scalabilità della tua applicazione.
Inoltre, la flessibilità di Terraform ti consente di adattare e scalare facilmente il tuo cluster secondo necessità, sia aggiungendo nuovi host che gestendo più cluster con spazi di lavoro. Per ulteriori dettagli e configurazioni avanzate, consulta la documentazione ufficiale per Terraform e ScyllaDB, che offrono una vasta gamma di risorse per aiutarti a massimizzare il potenziale della tua infrastruttura.
Source:
https://dzone.com/articles/setting-up-a-scylladb-cluster-on-aws-using-terraform