Terraformを使って、AWS RDS AuroraのAutoScalingを実験してみた
記事の内容
TerraformでAuroraのMySQLクラスターを作成し、AutoScalingを設定します。
記事の長さ
2分で読めます
Auroraクラスターの作成
まずは、Auto Scalingが設定されていないAuroraクラスターを作成します。
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "test-network"
cidr = "10.0.0.0/16"
enable_dns_hostnames = true
azs = ["ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"]
public_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
enable_nat_gateway = false
}
resource "aws_db_subnet_group" "database" {
name = "db-subnet-group"
description = "Database subnet group"
subnet_ids = module.vpc.public_subnets
}
module "services_app_mysql" {
source = "terraform-aws-modules/rds-aurora/aws"
name = "autoscale-test"
database_name = "autoscale"
master_username = "yossy"
engine = "aurora-mysql"
engine_version = "8.0.mysql_aurora.3.03.1"
instance_class = "db.t3.medium"
instances = {
one = {
publicly_accessible = true
}
two = {
publicly_accessible = true
}
}
vpc_id = module.vpc.vpc_id
db_subnet_group_name = aws_db_subnet_group.database.name
security_group_rules = {
vpc_ingress = {
cidr_blocks = [<ご自分のIPアドレス>]
}
}
storage_encrypted = true
monitoring_interval = 10
deletion_protection = false
apply_immediately = true
backtrack_window = 0
enabled_cloudwatch_logs_exports = ["audit", "error", "general", "slowquery"]
}
$ terraform apply
すると、Writer・Readerともに1つずつDBがあるAuroraクラスターが作成されます。
ローカル環境から接続する
今回はテストのために作成したので、インターネット上からアクセスできるようになっています。
ローカル環境からDBにアクセスします。(Node.jsを利用します。)
index.js
// 各種パッケージを読み込み
const express = require('express');
const mysql = require('mysql');
// MySQLへの接続設定
const db = mysql.createConnection({
host: '<Aurora Endpoint>',
user: 'yossy',
password: '<Password>',
database: 'autoscale'
});
// MySQLへ接続
db.connect((err) => {
if (err) {
throw err;
}
console.log('Connected to MySQL');
});
// Expressアプリ初期化
const app = express();
// ルートアクセス時にDBテスト
app.get('/', (req, res) => {
let sql = 'SHOW DATABASES';
db.query(sql, (err, result) => {
if(err) {
res.send('Error fetching rows');
} else {
console.log(result);
res.send('Rows fetched');
}
});
});
const port = 3000;
// サーバ起動
app.listen(port, () => console.log(`Server listening on port ${port}`));
※HostとPasswordはAWSコンソールから確認してください。(HostはRDSの管理画面・PasswordはSecretManagerの管理画面から確認できます。)
上記ソースを作成したら、サーバーを起動します。
$ node index.js
Server listening on port 3000
Connected to MySQL
無事にサーバーが起動し、MySQLと接続できたことを確認しました。
$ curl localhost:3000
Rows fetched
Curlでエンドポイントにもアクセスできます。また、アクセスするとサーバーログにSQLの結果が表示されます。
AutoScaleを設定する
Auroraの準備ができたので、次はAutoScaleを設定します。
- データベースのCPU使用率を50%以内
- 最少台数2台
- 最多台数3台
というAutoScalingを設定します。
Terraformを変更する
main.tf
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
...
}
resource "aws_db_subnet_group" "database" {
...
}
module "services_app_mysql" {
source = "terraform-aws-modules/rds-aurora/aws"
name = "autoscale-test"
...
apply_immediately = true
backtrack_window = 0
enabled_cloudwatch_logs_exports = ["audit", "error", "general", "slowquery"]
# ここから下を追加
autoscaling_enabled = true
autoscaling_min_capacity = 2
autoscaling_max_capacity = 3
autoscaling_target_cpu = 50
}
上記のようなAutoScalingに関する記述を追加します。
$ terraform apply
module.services_app_mysql.aws_appautoscaling_target.this[0]: Creating...
module.services_app_mysql.aws_appautoscaling_target.this[0]: Creation complete after 2s [id=cluster:autoscale-test]
module.services_app_mysql.aws_appautoscaling_policy.this[0]: Creating...
module.services_app_mysql.aws_appautoscaling_policy.this[0]: Creation complete after 1s [id=target-metric]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
正常に適用できました。
コンソール上からも確認できます。
これでAutoScalingを設定できました。
CPU負荷が50%以内に維持できるように自動でリードレプリカの台数を増やしてくれます。
オートスケーリングした時
※実際にCPU負荷を高めることでオートスケーリングが実際に行われる様子を確認できます。ただ、CPUを高めるために負荷をかけるのは各自で慎重に行なってください。
以下は、実際に負荷をかけてAuroraが自動でリードインスタンスを追加した時のクラスターの様子です。
※CPU負荷に合わせて、自動でインスタンスが作成されています。
まとめ
Auroraのオートスケーリングについてまとめました。
Sample Source
以下に今回作成したリソースのサンプルを配置してあります。
note
勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。
Discussion