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
}
接続確認
- WebサーバへSSH接続
- WebサーバからAPサーバへSSH接続
- mysqlコマンドでRDSに接続
mysql -uadmin -p -xxxxxx.xxxxxx.xxxxx.rds.amazonaws.com
Auroraでは自動的にライターインスタンスとリーダーインスタンスになる(Auroraレプリカ)
コメント