AWSを使用したTerraformを使ったScyllaDBクラスターのセットアップ

この記事では、Terraformを使用してAWSクラウドにScyllaDBを簡単かつ迅速にインストールする例を示します。

当初はHashiCorp Packerを使用してScyllaDBのAMIイメージを作成する予定でしたが、後に公式イメージが利用可能であることがわかり、インスタンスの初期化中にユーザーデータを介してScyllaDBを簡単に構成できるようになりました。

実際、ユーザーデータはscylla.yamlでサポートされているすべてのパラメータを定義できます。追加のオプションや例については、scylla-machine-image GitHubリポジトリを参照してください。

他に知っておくべきことは何ですか?ScyllaDBが自動的に構成されて起動するためには、サポートされているインスタンスタイプを使用する必要があります。そのようなインスタンスタイプのリストはここにあります:ScyllaDBのAWSシステム要件。私たちの例では、サポートされているタイプの中で最も安価な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 "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プロバイダーを初期化します:

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(正常)を持っている必要があります。

クラスタへのホストの追加

ScyllaDBはクラスタにホストを簡単に追加できます(削除はできません)。Terraformは、前回の実行の状態を保存し、例えばシードホストのIPアドレスを記憶します。したがって、変数内のホスト数を単純に増やし、再度Terraformを実行するだけで、新しいホストが自動的にクラスタに参加します。

変数ファイルに次の行を追加してください:

Plain Text

 

number_of_regular_hosts = 3

この例では、クラスターに1つのホストを追加しますが、変数を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