初心者のためのTerraformの使い方: RDS作成編

スポンサーリンク

Terrraformを使ってAWSにRDSを作成する方法を解説していきます。

サブネットの作成

VPCにはサブネットの設定があるが、RDS用にもサブネットグループという設定がある。
これはRDSが起動するAvailability Zoneを指定する項目である。

  • vpc_subnet.tfに追記(VPCにAZが異なるサブネットを2つ追加)
resource "aws_subnet" "dbsub_a" {
  vpc_id = aws_vpc.my_vpc.id
  cidr_block = "10.0.3.0/24"
  availability_zone = "ap-northeast-3a"
  tags = {
    Name = "db-subnet-3a"
  }
}

resource "aws_subnet" "dbsub_b" {
  vpc_id = aws_vpc.my_vpc.id
  cidr_block = "10.0.4.0/24"
  availability_zone = "ap-northeast-3b"
  tags = {
    Name = "db-subnet-3b"
  }
}

サブネットグループの作成

  • touch rds.tfして以下を入力
resource "aws_db_subnet_group" "db_subgrp" {
  name = "db-subgrp"
  subnet_ids = [aws_subnet.dbsub_a.id, aws_subnet.dbsub_b.id]
  tags = {
    Name = "db-subnet-group"
  }
}

パラメータグループの作成

ここでは全てデフォルト値のパラメータグループを作成する。
クラスター用のパラメータはaws_rds_cluster_parameter_groupで、インスタンス用のパラメータはaws_db_parameter_groupで定義する。

  • rds.tfに追記
resource "aws_rds_cluster_parameter_group" "db_clstr_pmtgrp" {
  name = "db-clstr-pmtgrp"
  family = "aurora-mysql5.7"
  description = "RDS Cluster Parameter Group"
  parameter {
    name = "character_set_server"
    value = "utf8"
  }
  parameter {
    name = "character_set_client"
    value = "utf8"
  }
  parameter {
    name = "time_zone"
    value = "Asia/Tokyo"
    apply_method = "immediate" # 即時反映
  }
}

resource "aws_db_parameter_group" "db_pmtgrp" {
  name = "db-pmtgrp"
  family = "aurora-mysql5.7"
  description = "RDS Instance Parameter Group"
}

セキュリティグループの作成

APサーバから3306番の接続を許可する。

  • vpc_sg.tfに追記
resource "aws_security_group" "rds_sg" {
  name = "rds-sg"
  vpc_id = aws_vpc.my_vpc.id
  tags = {
    Name = "rds-sg"
  }
}

resource "aws_security_group_rule" "egress_rds_sg" {
  type = "egress"
  from_port = 0
  to_port = 0
  protocol = "-1"
  cidr_blocks = ["0.0.0.0/0"]
  security_group_id = aws_security_group.rds_sg.id
}

resource "aws_security_group_rule" "ingress_rds_3306" {
  type = "ingress"
  from_port = 3306
  to_port = 3306
  protocol = "tcp"
  cidr_blocks = ["10.0.2.0/24"]
  security_group_id = aws_security_group.rds_sg.id
}

RDSインスタンスの作成

RDSにはクラスターとインスタンスという考え方があり、クラスターの中にインスタンス(マスター・レプリカ)が存在する。

  • rds.tfに追記
# RDSクラスターを作成
resource "aws_rds_cluster" "aurora_clstr" {
  cluster_identifier = "aurora_cluster"
  database_name = "mydb"
  master_username = "admin"
  master_password = "1234Amin5678"
  port = 3306
  apply_immediate = false # 即時反映するか(false=次のメンテナンス期間)
  skip_final_snapshot = true # クラスター削除時に最終スナップショットをスキップ
  engine = "aurora-mysql"
  engine_version = "5.7.mysql_aurora.2.11.5"
  vpc_security_group_ids = [aws_security_group.rds_sg.id]
  db_subnet_group_name = aws_db_subnet_group.db_subgrp.name
  db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.db_clstr_pmtgrp.name
  tags = {
    Name = "aurora-cluster"
  }
}

# RDSインスタンスを作成
resource "aws_rds_cluster_instance" "aurora_instance" {
  count = 2
  identifier = "aurora_cluster-${count.index}" # 1台目は0, 2台目は1
  cluster_identifier = aws_rds_cluster.aurora_clstr.id
  instance_class = "db.t3.small"
  apply_immediate = false
  engine = "aurora-mysql"
  engine_version = "5.7.mysql_aurora.2.11.5"
  db_subnet_group_name = aws_db_subnet_group.db_subgrp.name
  db_parameter_group_name = aws_db_parameter_group.db_pmtgrp.name
  tags = {
    Name = "aurora-instance"
  }
}

# 作成時にクラスターの書き込み用エンドポイントを出力
output "rds-endpoint" {
  value = aws_rds_cluster.aurora_clstr.endpoint
}
# 作成時にクラスターの読み込み用エンドポイントを出力
output "rds-endpoint-ro" {
  value = aws_rds_cluster.aurora_clstr.reader_endpoint
}

接続確認

  1. WebサーバへSSH接続
  2. WebサーバからAPサーバへSSH接続
  3. mysqlコマンドでRDSに接続
    mysql -uadmin -p -xxxxxx.xxxxxx.xxxxx.rds.amazonaws.com

Auroraでは自動的にライターインスタンスとリーダーインスタンスになる(Auroraレプリカ)

    コメント