AWS에서 Terraform을 사용하여 ScyllaDB 클러스터 설정

이 기사에서는 Terraform을 사용하여 AWS 클라우드에 ScyllaDB를 간단하고 빠르게 설치하는 예제를 제시합니다.

처음에는 HashiCorp Packer를 사용하여 ScyllaDB AMI 이미지를 만들기로 했지만, 나중에 공식 이미지가 있다는 것을 발견하여 사용자 데이터를 통해 인스턴스 초기화 중에 ScyllaDB를 쉽게 구성할 수 있음을 알게 되었습니다.

사실, 사용자 데이터는 scylla.yaml에서 지원되는 모든 매개변수를 정의할 수 있습니다. 추가 옵션 및 예제는 scylla-machine-image GitHub 저장소에서 찾을 수 있습니다.

무엇을 더 알아야 할까요? ScyllaDB가 자동으로 구성 및 시작되려면 지원되는 인스턴스 유형을 사용해야 합니다. 이러한 인스턴스 유형의 목록은 여기에서 확인할 수 있습니다: AWS용 ScyllaDB 시스템 요구 사항. 이 예에서는 지원되는 유형 중에서 i4i.large 유형을 사용할 것입니다. 왜냐하면 이 유형이 지원되는 유형 중에서 제일 싸기 때문입니다.

가정

  • 설치에는 단일 시드 노드가 충분합니다.
  • 호스트는 특정 IP 주소에서 제한된 액세스로 공개적으로 접근 가능해야 합니다 (정적 공용 IP가 필요합니다).

Terraform 구성 예제

최선의 방법을 따라, Terraform 코드는 단일 디렉토리의 여러 파일로 나누어집니다.

변수 파일 (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."
}

이 파일에는 main.tf에 포함된 코드에서 사용되는 변수의 정의가 포함되어 있습니다. 나중에 그것들에 대해 논의할 것입니다.

주 구성 파일 (main.tf)

Plain Text

 

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

# 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
}

main.tf 파일은 생성할 인프라 리소스를 설명합니다.

출력 설명 파일 (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."
}

이 파일은 마지막에 출력할 데이터를 지정합니다. 우리의 경우, 호스트의 IP 주소를 알아내어 연결할 수 있습니다.

이 코드는 GitHub에서도 확인할 수 있습니다: ScyllaDB Terraform 예시.

이 Terraform 구성 파일 사용 방법

먼저, Terraform과 AWS CLI를 설치해야 합니다.

Terraform 설치는 운영 체제에 따라 다릅니다. 자세한 내용은 공식 문서에서 확인할 수 있습니다: Terraform 설치 가이드.

AWS CLI는 Python 모듈로, Python이 있는 모든 운영 체제에서 비슷한 방식으로 pip를 통해 설치할 수 있습니다. 자세한 지침은 공식 문서에서 확인할 수 있습니다: PyPI에서 AWS CLI.

다음 단계는 AWS CLI에 대한 보안 자격 증명을 설정하는 것입니다. 보안 자격 증명은 AWS의 IAM 서비스를 사용하여 생성할 수 있습니다. 이미 보유하고 있다고 가정합니다.

AWS CLI 및 따라서 Terraform의 AWS 제공자가 자격 증명을 사용하도록하려면 다음 명령을 사용하여 구성해야합니다:

Shell

 

aws configure

Terraform에 자격 증명을 전달하는 다른 방법이 있습니다. 자세한 내용은 여기에서 확인할 수 있습니다: AWS 제공자 인증.

변수 이해

모든 변수의 내용은 다음과 같습니다:

  • scylladb_version: AMI를 검색할 때 이미지 이름에 사용되는 ScyllaDB의 버전입니다.
  • your_public_network: 호스트에 액세스를 허용할 외부 IP 주소입니다. CIDR 형식이어야 합니다 (예: /32는 단일 주소용).
  • instance_type: AWS 인스턴스 유형입니다. 위에서 언급된 권장 유형 중 하나를 사용해야 합니다.
  • number_of_regular_hosts: 시드 호스트를 제외한 클러스터의 호스트 수입니다.
  • ssh_key_name: 호스트에 추가 될 미리로드된 공개 SSH 키의 이름입니다.

변수는 직접 variables.tf 파일에서 재정의 될 수 있지만, 이러한 목적으로 별도의 파일을 사용하는 것이 좋습니다. 이것은 .tfvars 확장자를 가진 terraform.tfvars와 같은 파일이 될 수 있으며 Terraform 구성 파일과 동일한 디렉토리에 있습니다.

이러한 파일에서 변수는 다음 형식으로 작성됩니다 <NAME> = <VALUE>. 예를 들면:

Plain Text

 

ssh_key_name = "KEYNAME"

Terraform 구성 적용 방법

클러스터를 만들려면 코드가 있는 디렉토리로 이동한 다음 다음 명령을 실행하십시오:

AWS Provider를 초기화합니다:

Shell

 

terraform init

예시 출력:

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!

구성을 적용합니다:

Shell

 

terraform apply

명령 출력에는 Terraform에 제공된 구성에서 일부 매개변수가 가져오는 것을 보여주고, 다른 매개변수는 변경 사항을 적용한 후 자동으로 추가될 것입니다. 적용을 확인하려면 yes를 입력하십시오.

Terraform이 작업을 완료하면 호스트의 공용 IP 주소가 출력되며, 이를 사용하여 ScyllaDB에 연결할 수 있습니다.

클러스터 배포 확인

ScyllaDB 클러스터가 성공적으로 배포되었는지 확인하려면 다음 명령을 사용하여 SSH를 통해 연결하십시오:

Shell

 

ssh scyllaadm@<ip-address>

연결한 후 클러스터의 호스트 목록이 즉시 표시됩니다. 또는 다음 몤령을 실행할 수 있습니다:

Shell

 

nodetool status

예시 출력:

Plain Text

 

Datacenter: eu-west
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- 주소       부하      토큰 보유 호스트 ID                              랙
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  

모든 호스트는 첫 번째 열에 UN (Up Normal)이 있어야 합니다.

클러스터에 호스트 추가하기

ScyllaDB를 사용하면 쉽게 클러스터에 호스트를 추가할 수 있습니다(제거는 불가능). 반면에 Terraform은 이전 실행의 상태를 저장하고, 예를 들어 시드 호스트의 IP 주소를 기억합니다. 따라서 변수에 호스트 수를 간단히 늘리고 Terraform을 다시 실행하면 새로운 호스트가 자동으로 클러스터에 가입합니다.

변수 파일에 다음 라인을 추가하십시오:

Plain Text

 

number_of_regular_hosts = 3

이 예제에서는 클러스터에 하나의 호스트를 추가하지만, 변수를 2보다 큰 임의의 숫자로 설정할 수 있습니다.

다시 terraform apply를 실행하세요. 그런 다음, 시드 호스트에 로그인하여 호스트 목록이 증가했는지 확인합니다.

여러 클러스터 관리하기

작업 공간을 사용하여 단일 Terraform 구성으로 여러 클러스터를 배포할 수 있습니다.

새 작업 공간 만들기:

Shell

 

terraform workspace new cluster_2

cluster_2는 작업 공간의 예시 이름일 뿐입니다. 무엇이든 될 수 있습니다.

새 클러스터 배포하기:

Shell

 

terraform apply

원래 클러스터는 기본이라는 이름의 작업 공간에 남아 있습니다.

작업 공간 목록 보기:

Shell

 

terraform workspace list

작업 공간 간 전환하기:

Shell

 

terraform workspace select default

작업 공간 삭제하기:

Shell

 

terraform workspace delete cluster_2

클러스터 파괴하기

ScyllaDB 클러스터와 모든 관련 엔티티를 삭제하려면 원하는 작업 공간에서 다음 명령을 사용하세요:

Shell

 

terraform destroy

이 명령은 해당 클러스터를 위해 Terraform이 생성한 모든 리소스를 정리합니다.

결론

이 가이드를 통해 Terraform을 사용하여 AWS에서 ScyllaDB 클러스터를 자신 있게 설정, 관리 및 확장할 수 있습니다. 제공된 단계별 지침은 원활한 배포 경험을 보장하여 애플리케이션의 성능 및 확장성에 집중할 수 있도록 합니다.

또한, Terraform의 유연성 덕분에 필요에 따라 클러스터를 쉽게 조정하고 확장할 수 있습니다. 새로운 호스트를 추가하거나 작업 공간을 통해 여러 클러스터를 관리하는 등 다양한 방식으로 가능합니다. 추가 세부정보 및 고급 구성에 대해서는 TerraformScyllaDB의 공식 문서를 참조하십시오. 이 문서들은 인프라의 잠재력을 극대화하는 데 도움이 되는 풍부한 자료를 제공합니다.

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