🍡

【入門#5】TerraformでRDSを作ろう

に公開

今回の目標

Terraformを使って、RDSを作ります。
将来的には下記のシステム構成図になるように進めていきますが、今回はその中のRDSに絞って解説します。

◯今回のシステム構成図の全体像

関連記事:https://zenn.dev/alt_tanuki/articles/7c1f97da33496b

前提

下記記事を完了し、Terraformが使用できる状態になっていること。

【入門#1】Terraformをインストールしよう!(tfenv事前準備編)

ではやっていきましょう!

順番的には、下記を順を追って行っていきます。
・RDS用 サブネットグループ作成
・RDS用 セキュリティグループ作成
・RDS AuroraMySQL作成

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

まずはRDSを設置するサブネットグループを用意します。
基本的にprivateサブネットに設置するため、privateサブネットを作っていきます。

network.tfに下記を記述します。

# Subnet(プライベート)
resource "aws_subnet" "cask_tokyo_ecs_subnet_private1" {
  vpc_id                  = aws_vpc.cask_tokyo_ecs_vpc.id
  cidr_block              = "10.0.3.0/24"
  availability_zone       = "ap-northeast-1a"
  map_public_ip_on_launch = false
  tags = {
    Name = "${var.project_name}-subnet-private1-ap-northeast-1a"
  }
}

resource "aws_subnet" "cask_tokyo_ecs_subnet_private2" {
  vpc_id                  = aws_vpc.cask_tokyo_ecs_vpc.id
  cidr_block              = "10.0.4.0/24"
  availability_zone       = "ap-northeast-1c"
  map_public_ip_on_launch = false
  tags = {
    Name = "${var.project_name}-subnet-private2-ap-northeast-1c"
  }
}

# Subnetルートテーブル(プライベート)
resource "aws_route_table" "cask_tokyo_ecs_rt_priv1" {
  vpc_id = aws_vpc.cask_tokyo_ecs_vpc.id

  tags = {
    Name = "${var.project_name}-rt-priv1"
  }
}


resource "aws_route_table" "cask_tokyo_ecs_rt_priv2" {
  vpc_id = aws_vpc.cask_tokyo_ecs_vpc.id

  tags = {
    Name = "${var.project_name}-rt-priv2"
  }
}

# Subnetルートテーブルとの関連付け
resource "aws_route_table_association" "cask_tokyo_ecs_rt_association_private1" {
  subnet_id      = aws_subnet.cask_tokyo_ecs_subnet_private1.id
  route_table_id = aws_route_table.cask_tokyo_ecs_rt_priv1.id
}

resource "aws_route_table_association" "cask_tokyo_ecs_rt_association_private2" {
  subnet_id      = aws_subnet.cask_tokyo_ecs_subnet_private2.id
  route_table_id = aws_route_table.cask_tokyo_ecs_rt_priv2.id
}

# RDSサブネットグループ
resource "aws_db_subnet_group" "cask_tokyo_ecs_rds_subnet_group" {
  name = "${var.project_name}-db-subnet-group"
  subnet_ids = [
    aws_subnet.cask_tokyo_ecs_subnet_private1.id,
    aws_subnet.cask_tokyo_ecs_subnet_private2.id
  ]

  tags = {
    Name = var.project_name
  }
}

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

security_groups.tfに下記を記述します。
ECSからの通信のみ許可するようインバウンドを設定していきます。

# ECSクラスター
# SecurityGroup(RDS)
resource "aws_security_group" "cask_tokyo_ecs_sg_rds" {
  name        = "${var.project_name}-sg-rds"
  description = "For RDS"
  vpc_id      = aws_vpc.cask_tokyo_ecs_vpc.id

  tags = {
    Name = "${var.project_name}-sg-rds"
  }

  ingress {
    description     = "From ECS"
    protocol        = "tcp"
    from_port       = 3306
    to_port         = 3306
    security_groups = [aws_security_group.cask_tokyo_ecs_sg_ecs.id]
  }

  egress {
    description = "Allow all IPv4"
    protocol    = "-1"
    from_port   = 0
    to_port     = 0
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    description      = "Allow all IPv6"
    protocol         = "-1"
    from_port        = 0
    to_port          = 0
    ipv6_cidr_blocks = ["::/0"]
  }
}

RDS AuroraMySQL作成

compute.tfに下記を記述します。

# RDS Cluster
resource "aws_rds_cluster" "cask_tokyo_ecs_rds_cluster" {
  # クラスター名
  cluster_identifier = "${var.project_name}-database-cluster"

  # RDSサブネットグループ
  db_subnet_group_name   = aws_db_subnet_group.cask_tokyo_ecs_rds_subnet_group.name
  vpc_security_group_ids = [aws_security_group.cask_tokyo_ecs_sg_rds.id]

  # データベースエンジン
  engine         = "aurora-mysql"
  engine_version = "8.0.mysql_aurora.3.05.2"
  port           = "3306"

  # データベースアクセス情報(variable.tfで指定)
  master_username = var.database_user
  master_password = var.database_password

  # RDS削除時のスナップショット有効/無効
  skip_final_snapshot = true

  # Aurora ACU設定
  serverlessv2_scaling_configuration {
    min_capacity = var.rds_min_acu
    max_capacity = var.rds_max_acu
  }

  # RDSパラメータグループ設定(別で定義)
  db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.cask_tokyo_ecs_rds_parameter.name
}

# RDS Cluster Instance
resource "aws_rds_cluster_instance" "cask_tokyo_ecs_rds_cluster_instance" {
  # インスタンス名
  identifier         = "${var.project_name}-database-cluster-instance"

  # RDSクラスター
  cluster_identifier = aws_rds_cluster.cask_tokyo_ecs_rds_cluster.id

  # データベースエンジン
  engine         = aws_rds_cluster.cask_tokyo_ecs_rds_cluster.engine
  engine_version = aws_rds_cluster.cask_tokyo_ecs_rds_cluster.engine_version

  # インスタンス設定(今回はServerless.V2)
  instance_class       = "db.serverless"

  # RDSサブネットグループ
  db_subnet_group_name = aws_rds_cluster.cask_tokyo_ecs_rds_cluster.db_subnet_group_name
}

# RDSパラメータグループ
resource "aws_rds_cluster_parameter_group" "cask_tokyo_ecs_rds_parameter" {
  name   = "${var.project_name}-database-cluster-parameter-group"
  family = "aurora-mysql8.0"

  parameter {
    name  = "time_zone"
    value = "Asia/Tokyo"
  }
}

実行することで15分ほどかかりますが、RDSが作成されます!
RDSってなんか設定値多いですよね。
クラスターとインスタンスも設定値が結構被っている気もするぞ。

まぁひとまずよしですね!

下記の記事を目次として、続きをどんどん構築を行っていきますので、今回作成したRDSの使い方などが気になる方はぜひ見に来てください!

Github自動デプロイの実装方法も解説していきます。

https://zenn.dev/alt_tanuki/articles/7c1f97da33496b

Discussion