Configurando um Cluster ScyllaDB na AWS Usando Terraform

Neste artigo, apresento um exemplo de instalação simples e rápida do ScyllaDB na nuvem AWS utilizando Terraform.

Inicialmente, eu pretendia criar uma imagem AMI do ScyllaDB usando o HashiCorp Packer. No entanto, descobri posteriormente que imagens oficiais estão disponíveis, permitindo que o ScyllaDB seja facilmente configurado durante a inicialização da instância via dados do usuário.

Na verdade, os dados do usuário podem definir todos os parâmetros suportados no scylla.yaml. Opções adicionais e exemplos podem ser encontrados no repositório GitHub do scylla-machine-image.

O que mais você deve saber? Para que o ScyllaDB se configure e inicie automaticamente, é necessário usar tipos de instância suportados. Uma lista desses tipos de instância pode ser encontrada aqui: Requisitos do Sistema ScyllaDB para AWS. No nosso exemplo, usaremos o tipo i4i.large, pois é o mais barato entre os tipos suportados.

Pressupostos

  • Um único nó seed é suficiente para a configuração.
  • Os hosts são acessíveis publicamente com acesso restrito a partir de um endereço IP específico (um IP público estático é necessário).

Exemplo de Configuração do Terraform

Seguindo as melhores práticas, o código do Terraform é dividido em vários arquivos em um único diretório.

Arquivo de Variáveis (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."
}

Este arquivo contém a definição de variáveis usadas no código contido em main.tf. Vamos discuti-las mais tarde.

Arquivo de Configuração Principal (main.tf)

Plain Text

 

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

# Configurar o Provedor 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
}

O arquivo main.tf descreve os recursos de infraestrutura a serem criados.

Arquivo Descrevendo Saídas (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."
}

Este arquivo especifica os dados a serem exibidos no final. No nosso caso, queremos saber os endereços IP dos hosts para nos conectarmos a eles.

Você também pode encontrar este código no GitHub: Exemplo do Terraform ScyllaDB.

Como Usar Este Arquivo de Configuração do Terraform

Primeiro, você precisa instalar o Terraform e o AWS CLI.

A instalação do Terraform difere entre os sistemas operacionais. Detalhes podem ser encontrados na documentação oficial: Guia de Instalação do Terraform.

O AWS CLI é um módulo Python que pode ser instalado via pip de forma semelhante em todos os sistemas operacionais onde o Python está disponível. Instruções detalhadas estão disponíveis na documentação oficial: AWS CLI no PyPI.

O próximo passo é configurar credenciais de segurança para o AWS CLI. As credenciais de segurança podem ser criadas usando o serviço IAM na AWS. Pressupomos que você já as tenha.

Para habilitar o AWS CLI e, consequentemente, o provedor AWS para o Terraform usar suas credenciais, você precisa configurá-las usando o seguinte comando:

Shell

 

aws configure

Há outras maneiras de passar credenciais para o Terraform. Mais detalhes podem ser encontrados aqui: Autenticação do Provedor AWS.

Compreensão das Variáveis

Aqui está uma explicação de todas as variáveis:

  • scylladb_version: A versão do ScyllaDB, usada no nome da imagem para procurar a AMI.
  • your_public_network: O endereço IP externo do qual o acesso aos hosts será permitido. Deve estar no formato CIDR (por exemplo, /32 para um único endereço).
  • instance_type: O tipo de instância AWS. Você deve usar um dos tipos recomendados mencionados acima.
  • number_of_regular_hosts: O número de hosts no cluster, excluindo o host de semente.
  • ssh_key_name: O nome da chave pública SSH pré-carregada que será adicionada aos hosts.

Embora as variáveis possam ser substituídas diretamente no arquivo variables.tf, é melhor usar um arquivo separado para esse fim. Isso pode ser qualquer arquivo com a extensão .tfvars, como terraform.tfvars, localizado no mesmo diretório que o arquivo de configuração do Terraform.

Nesse arquivo, as variáveis são escritas no formato <NOME> = <VALOR>. Por exemplo:

Plain Text

 

ssh_key_name = "KEYNAME"

Como Aplicar uma Configuração do Terraform

Para criar o cluster, navegue até o diretório que contém o código e execute os seguintes comandos:

Inicialize o AWS Provider:

Shell

 

terraform init

Exemplo de saída:

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!

Aplicar a configuração:

Shell

 

terraform apply

A saída do comando mostrará que alguns parâmetros foram retirados da configuração fornecida ao Terraform, enquanto outros serão adicionados automaticamente após aplicar as alterações. Confirme a aplicação digitando yes.

Depois que o Terraform concluir o trabalho, ele mostrará os endereços IP públicos dos hosts, que você pode usar para se conectar ao ScyllaDB.

Verificar o Deploy do Cluster

Para verificar se o cluster do ScyllaDB foi implantado com sucesso, conecte-se a ele via SSH usando o seguinte comando:

Shell

 

ssh scyllaadm@<ip-address>

Depois de conectado, você verá imediatamente a lista de hosts no cluster. Alternativamente, você pode executar o seguinte comando:

Shell

 

nodetool status

Exemplo de saída:

Plain Text

 

Datacenter: eu-west
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Endereço       Carga      Tokens Possui ID do 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 os hosts devem ter UN (Ativo Normal) na primeira coluna.

Adicionando Hosts ao Cluster

O ScyllaDB permite adicionar facilmente hosts aos clusters (mas não removê-los). O Terraform, por sua vez, salva o estado da execução anterior e lembra, por exemplo, o endereço IP do host seed. Portanto, você pode simplesmente aumentar o número de hosts na variável e executar o Terraform novamente. O novo host se juntará automaticamente ao cluster.

Adicione a seguinte linha ao seu arquivo de variáveis:

Plain Text

 

number_of_regular_hosts = 3

Neste exemplo, será adicionado mais um host ao cluster, mas você pode definir a variável para qualquer número maior que 2.

Execute terraform apply novamente. Em seguida, faça login no host principal e verifique se a lista de hosts aumentou.

Gestão de Múltiplos Clusters

Você pode implantar vários clusters usando uma única configuração do Terraform usando workspaces.

Crie um novo workspace:

Shell

 

terraform workspace new cluster_2

cluster_2 é apenas um exemplo de nome para um workspace. Pode ser qualquer coisa.

Implante o Novo Cluster:

Shell

 

terraform apply

O cluster original permanecerá no workspace chamado default.

Liste os workspaces:

Shell

 

terraform workspace list

Alternar entre workspaces:

Shell

 

terraform workspace select default

Excluir um workspace:

Shell

 

terraform workspace delete cluster_2

Destruindo o Cluster

Para excluir um cluster do ScyllaDB e todas as entidades associadas, use o seguinte comando no workspace desejado:

Shell

 

terraform destroy

Isso limpará todos os recursos criados pelo Terraform para esse cluster.

Conclusão

Com este guia, você pode configurar, gerenciar e expandir com confiança clusters do ScyllaDB na AWS usando o Terraform. As instruções passo a passo fornecidas garantem uma experiência de implantação perfeita, permitindo que você se concentre no desempenho e escalabilidade de sua aplicação.

Além disso, a flexibilidade do Terraform permite que você adapte e escale seu cluster facilmente conforme necessário, seja adicionando novos hosts ou gerenciando vários clusters com workspaces. Para mais detalhes e configurações avançadas, consulte a documentação oficial do Terraform e ScyllaDB, que oferecem uma abundância de recursos para ajudá-lo a maximizar o potencial da sua infraestrutura.

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