Configurando um Cluster ScyllaDB na AWS Usando Terraform

Neste artigo, apresento um exemplo de uma instalação simples e rápida do ScyllaDB na nuvem AWS usando 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.

De fato, 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, tipos de instância suportados devem ser usados. Uma lista de tais tipos de instância pode ser encontrada aqui: Requisitos do Sistema do ScyllaDB para AWS. Em 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 de um endereço IP específico (é necessário um IP público estático).

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 das 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. Em 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 Terraform do 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 as 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.

Entendendo as 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 buscar a AMI.
  • your_public_network: O endereço IP externo a partir 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 seed.
  • 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 este fim. Este arquivo pode ter qualquer nome com a extensão .tfvars, como por exemplo 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!

Aplique 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 a aplicação das alterações. Confirme a aplicação digitando yes.

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

Verificando a Implantação 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>

Ao se conectar, 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 (Up 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 semente e verifique se a lista de hosts aumentou.

Gerenciando Múltiplos Clusters

Você pode implantar múltiplos clusters usando uma única configuração do Terraform através de workspaces.

Crie um novo workspace:

Shell

 

terraform workspace new cluster_2

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

Implantar o Novo Cluster:

Shell

 

terraform apply

O cluster original permanecerá no workspace chamado default.

Listar 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 deletar um cluster ScyllaDB e todas as entidades associadas, use o seguinte comando no workspace desejado:

Shell

 

terraform destroy

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

Conclusão

Com este guia, você pode configurar, gerenciar e expandir clusters ScyllaDB na AWS usando o Terraform com confiança. As instruções passo a passo fornecidas garantem uma experiência de implantação tranquila, permitindo que você se concentre no desempenho e na escalabilidade da 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 múltiplos clusters com workspaces. Para mais detalhes e configurações avançadas, consulte a documentação oficial do Terraform e ScyllaDB, que oferecem uma riqueza de recursos para ajudá-lo a maximizar o potencial de sua infraestrutura.

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