🎉

Terraformを使って、AWS RDS AuroraのAutoScalingを実験してみた

2024/02/05に公開

記事の内容

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クラスターが作成されます。

Aurora Autoscale

ローカル環境から接続する

今回はテストのために作成したので、インターネット上からアクセスできるようになっています。

ローカル環境から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.

正常に適用できました。

コンソール上からも確認できます。

Aurora Autoscale

これでAutoScalingを設定できました。

CPU負荷が50%以内に維持できるように自動でリードレプリカの台数を増やしてくれます。

オートスケーリングした時

※実際にCPU負荷を高めることでオートスケーリングが実際に行われる様子を確認できます。ただ、CPUを高めるために負荷をかけるのは各自で慎重に行なってください。

以下は、実際に負荷をかけてAuroraが自動でリードインスタンスを追加した時のクラスターの様子です。

Aurora Autoscale

※CPU負荷に合わせて、自動でインスタンスが作成されています。

まとめ

Auroraのオートスケーリングについてまとめました。

Sample Source

以下に今回作成したリソースのサンプルを配置してあります。

https://github.com/rara-tan/zenn-aws-aurora-autoscale

note

勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。

https://note.com/ring_belle/membership

Discussion