En este artículo, presento un ejemplo de una instalación simple y rápida de ScyllaDB en la nube de AWS utilizando Terraform.
Inicialmente, tenía la intención de crear una imagen AMI de ScyllaDB usando HashiCorp Packer. Sin embargo, más tarde descubrí que hay imágenes oficiales disponibles, lo que permite que ScyllaDB se configure fácilmente durante la inicialización de la instancia a través de datos de usuario.
De hecho, los datos de usuario pueden definir todos los parámetros soportados en scylla.yaml
. Opciones adicionales y ejemplos se pueden encontrar en el repositorio de GitHub de scylla-machine-image.
¿Qué más deberías saber? Para que ScyllaDB se configure y se inicie automáticamente, deben usarse tipos de instancia soportados. Una lista de dichos tipos de instancia se puede encontrar aquí: Requisitos del sistema de ScyllaDB para AWS. En nuestro ejemplo, utilizaremos el tipo i4i.large
ya que es el más barato entre los tipos soportados.
Suposiciones
- Un solo nodo semilla es suficiente para la configuración.
- Los hosts son accesibles públicamente con acceso restringido desde una dirección IP específica (se requiere una IP pública estática).
Ejemplo de configuración de Terraform
Siguiendo las mejores prácticas, el código de Terraform se divide en múltiples archivos en un solo directorio.
Archivo de Variables (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."
}
Este archivo contiene la definición de las variables utilizadas en el código contenido en main.tf
. Las discutiremos más adelante.
Archivo de configuración principal (main.tf)
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# Configurar el proveedor de 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
}
El archivo main.tf
describe los recursos de infraestructura a crear.
Archivo que describe las salidas (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."
}
Este archivo especifica los datos que se mostrarán al final. En nuestro caso, queremos conocer las direcciones IP de los hosts para poder conectarnos a ellos.
También puedes encontrar este código en GitHub: Ejemplo de Terraform de ScyllaDB.
Cómo utilizar este archivo de configuración de Terraform
Primero, necesitas instalar Terraform y AWS CLI.
La instalación de Terraform difiere según los sistemas operativos. Los detalles se pueden encontrar en la documentación oficial: Guía de instalación de Terraform.
AWS CLI es un módulo de Python que se puede instalar a través de pip de manera similar en todos los sistemas operativos donde esté disponible Python. Las instrucciones detalladas están disponibles en la documentación oficial: AWS CLI en PyPI.
El siguiente paso es configurar las credenciales de seguridad para AWS CLI. Las credenciales de seguridad se pueden crear utilizando el servicio IAM en AWS. Asumimos que ya las tienes.
Para habilitar AWS CLI y, consecuentemente, el proveedor de AWS para Terraform para usar sus credenciales, necesita configurarlas utilizando el siguiente comando:
aws configure
Hay otras formas de pasar credenciales a Terraform. Puede encontrar más detalles aquí: Autenticación del Proveedor AWS.
Entendiendo las Variables
Aquí se detalla todas las variables:
- scylladb_version: La versión de ScyllaDB, utilizada en el nombre de la imagen para buscar la AMI.
- your_public_network: La dirección IP externa desde la cual se permitirá el acceso a los hosts. Debe estar en formato CIDR (por ejemplo, /32 para una única dirección).
- instance_type: El tipo de instancia de AWS. Debe utilizar uno de los tipos recomendados mencionados anteriormente.
- number_of_regular_hosts: El número de hosts en el clúster, excluyendo el host semilla.
- ssh_key_name: El nombre de la clave pública SSH precargada que se agregará a los hosts.
Aunque las variables se pueden sobrescribir directamente en el archivo variables.tf
, es mejor usar un archivo separado para este propósito. Este puede ser cualquier archivo con extensión .tfvars
, como terraform.tfvars
, ubicado en el mismo directorio que el archivo de configuración de Terraform.
En dicho archivo, las variables se escriben en el formato <NOMBRE> = <VALOR>. Por ejemplo:
ssh_key_name = "KEYNAME"
Cómo Aplicar una Configuración de Terraform
Para crear el clúster, navega al directorio que contiene el código y ejecuta los siguientes comandos:
Inicializa el Proveedor de AWS:
terraform init
Ejemplo de salida:
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!
Aplica la Configuración:
terraform apply
La salida del comando mostrará que algunos parámetros fueron tomados de la configuración proporcionada a Terraform, mientras que otros se agregarán automáticamente después de aplicar los cambios. Confirma la aplicación escribiendo sí.
Después de que Terraform complete su trabajo, mostrará las direcciones IP públicas de los hosts, que puedes usar para conectarte a ScyllaDB.
Verificando el Despliegue del Clúster
Para verificar que el clúster de ScyllaDB se haya desplegado correctamente, conéctate a él a través de SSH utilizando el siguiente comando:
ssh scyllaadm@<ip-address>
Una vez conectado, verás inmediatamente la lista de hosts en el clúster. Alternativamente, puedes ejecutar el siguiente comando:
nodetool status
Ejemplo de salida:
Datacenter: eu-west
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Dirección Carga Tokens Posee ID de 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
Todos los hosts deben tener UN (Up Normal) en la primera columna.
Agregando Hosts al Clúster
ScyllaDB te permite agregar fácilmente hosts a los clústeres (pero no eliminarlos). Terraform, a su vez, guarda el estado de la ejecución anterior y recuerda, por ejemplo, la dirección IP del host semilla. Por lo tanto, simplemente puedes aumentar el número de hosts en la variable y ejecutar Terraform nuevamente. El nuevo host se unirá automáticamente al clúster.
Agrega la siguiente línea a tu archivo de variables:
number_of_regular_hosts = 3
En este ejemplo, se agregará un host más al clúster, pero puedes establecer la variable a cualquier número mayor que 2.
Ejecuta terraform apply
de nuevo. Luego, inicia sesión en el host semilla y verifica que la lista de hosts haya aumentado.
Gestión de múltiples clústeres
Puedes implementar múltiples clústeres utilizando una única configuración de Terraform mediante el uso de espacios de trabajo.
Crea un nuevo espacio de trabajo:
terraform workspace new cluster_2
cluster_2
es solo un ejemplo de nombre para un espacio de trabajo. Puede ser cualquier cosa.
Implementa el nuevo clúster:
terraform apply
El clúster original permanecerá en el espacio de trabajo llamado predeterminado.
Lista de espacios de trabajo:
terraform workspace list
Cambia entre espacios de trabajo:
terraform workspace select default
Elimina un espacio de trabajo:
terraform workspace delete cluster_2
Destrucción del clúster
Para eliminar un clúster de ScyllaDB y todas las entidades asociadas, utiliza el siguiente comando en el espacio de trabajo deseado:
terraform destroy
Esto limpiará todos los recursos creados por Terraform para ese clúster.
Conclusión
Con esta guía, puedes configurar, gestionar y expandir con confianza clústeres de ScyllaDB en AWS utilizando Terraform. Las instrucciones paso a paso proporcionadas aseguran una experiencia de implementación sin problemas, lo que te permite centrarte en el rendimiento y la escalabilidad de tu aplicación.
Además, la flexibilidad de Terraform te permite adaptar y escalar fácilmente tu clúster según sea necesario, ya sea añadiendo nuevos hosts o gestionando múltiples clústeres con espacios de trabajo. Para más detalles y configuraciones avanzadas, consulta la documentación oficial de Terraform y ScyllaDB, que ofrecen una gran cantidad de recursos para ayudarte a maximizar el potencial de tu infraestructura.
Source:
https://dzone.com/articles/setting-up-a-scylladb-cluster-on-aws-using-terraform