この記事では、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)
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)
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)
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プロバイダーが資格情報を使用するためには、次のコマンドを使用してそれらを構成する必要があります。
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>の形式で書かれています。例:
ssh_key_name = "KEYNAME"
Terraform構成の適用方法
クラスタを作成するには、コードを含むディレクトリに移動し、次のコマンドを実行します:
AWSプロバイダーを初期化します:
terraform init
例の出力:
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!
構成を適用します:
terraform apply
コマンドの出力には、いくつかのパラメータがTerraformに提供された構成から取得されたことが表示され、他のパラメータは変更を適用した後に自動的に追加されます。適用を確認するには「yes」と入力してください。
Terraformの作業が完了すると、ホストのパブリックIPアドレスが出力され、ScyllaDBに接続する際に使用できます。
クラスタデプロイの確認
ScyllaDBクラスタが正常にデプロイされたことを確認するには、次のコマンドを使用してSSHで接続します:
ssh scyllaadm@<ip-address>
接続すると、クラスタ内のホストのリストがすぐに表示されます。あるいは、次のコマンドを実行することもできます:
nodetool status
例の出力:
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を実行するだけで、新しいホストが自動的にクラスタに参加します。
変数ファイルに次の行を追加してください:
number_of_regular_hosts = 3
この例では、クラスターに1つのホストを追加しますが、変数を2より大きい任意の数に設定することができます。
再度terraform apply
を実行してください。その後、シードホストにログインし、ホストのリストが増えたことを確認してください。
複数のクラスターの管理
ワークスペースを使用して、単一のTerraform構成を使用して複数のクラスターを展開することができます。
新しいワークスペースを作成します:
terraform workspace new cluster_2
cluster_2
はワークスペースの例としての名前です。任意の名前を使用できます。
新しいクラスターを展開します:
terraform apply
元のクラスターはデフォルトという名前のワークスペースに残ります。
ワークスペースのリスト:
terraform workspace list
ワークスペース間を切り替える:
terraform workspace select default
ワークスペースを削除する:
terraform workspace delete cluster_2
クラスターの破棄
ScyllaDBクラスターと関連するすべてのエンティティを削除するには、所定のワークスペースで以下のコマンドを使用してください:
terraform destroy
これにより、そのクラスターに対してTerraformによって作成されたすべてのリソースがクリーンアップされます。
結論
このガイドを使用すると、Terraformを使用してAWS上でScyllaDBクラスターを確実に設定、管理、および拡張できます。提供される段階的な手順により、シームレスな展開体験が可能となり、アプリケーションのパフォーマンスと拡張性に焦点を当てることができます。
さらに、Terraformの柔軟性によって、新しいホストを追加したりワークスペースで複数のクラスタを管理したりするなど、必要に応じてクラスタを簡単に適応させたり拡張したりすることができます。詳細や高度な設定については、TerraformとScyllaDBの公式ドキュメントを参照してください。これらのドキュメントには、インフラストラクチャのポテンシャルを最大限に引き出すのに役立つ多くのリソースが提供されています。
Source:
https://dzone.com/articles/setting-up-a-scylladb-cluster-on-aws-using-terraform