🍡
【入門#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自動デプロイの実装方法も解説していきます。
Discussion