
ちょっとマニアックなterraform RDSの設定
長くなってきてるのでDB部分だけ分離した。
resource "aws_security_group" "rds_sg" {
# RDS 用セキュリティグループ
vpc_id = aws_vpc.main.id
# インバウンドルール(MySQL 接続を許可)
ingress {
from_port = 3306
to_port = 3306
protocol = "tcp"
security_groups = [aws_default_security_group.default.id]
}
# アウトバウンドルール(全トラフィック許可)
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "RDS Security Group"
}
}
resource "aws_db_subnet_group" "db_subnet_group_private" {
# プライベートサブネットグループ
name = "private-db-subnet-group"
subnet_ids = values(aws_subnet.private_subnet)[*].id
lifecycle {
create_before_destroy = true
}
tags = {
Name = "Private DB Subnet Group"
}
}
resource "aws_db_instance" "mysql" {
# RDS インスタンス
identifier = "exampledb-instance"
allocated_storage = 20
engine = "mysql"
engine_version = "8.0"
instance_class = "db.t4g.micro"
db_name = "exampledb"
username = "admin"
password = "securepassword123!"
publicly_accessible = false
vpc_security_group_ids = [aws_security_group.rds_sg.id]
db_subnet_group_name = aws_db_subnet_group.db_subnet_group_private.name
skip_final_snapshot = true
tags = {
Name = "Private RDS MySQL Instance"
}
}
パスワードをパラメーターストアに移動する
さすがに
password = "securepassword123!"
はあんまよくないだろみたいな
resource "random_password" "db_pass" {
length = 16 # パスワードの長さ
special = false # 特殊文字を含めない(必要なら true)
}
こんな感じでランダムなパスワードを作っといた。登録すると

こんな感じでパラメータストアに登録される。どういうパスワードがセットされたんかは上記のスクショのように、パラメータストアにアクセスして複合してみる事
パラメーターグループ
DBの設定を弄るのにほぼ必須。パラメータを操作しないのであってもこれを脳死状態で作っておく事。
# RDS パラメーターグループ
resource "aws_db_parameter_group" "mysql_params" {
name = "custom-mysql-params"
family = "mysql8.0" # MySQL 8.0 に対応したパラメーターグループ
#parameter {
# name = "slow_query_log"
# value = "1" # スロークエリログを有効化
#}
#
#parameter {
# name = "long_query_time"
# value = "1" # スロークエリとみなす時間を1秒に設定
#}
tags = {
Name = "Custom MySQL Parameter Group"
}
}
スロークエリーとかは後でやるかもしれんけど、まあこんな感じで設定を置いていく。これを本体に適用する
resource "aws_db_instance" "mysql" {
# RDS インスタンス
identifier = "exampledb-instance"
allocated_storage = 20
engine = "mysql"
engine_version = "8.0"
instance_class = "db.t4g.micro"
db_name = "exampledb"
username = "admin"
password = aws_ssm_parameter.db_pass.value
publicly_accessible = false
vpc_security_group_ids = [aws_security_group.rds_sg.id]
db_subnet_group_name = aws_db_subnet_group.db_subnet_group_private.name
skip_final_snapshot = true
# これ
parameter_group_name = aws_db_parameter_group.mysql_params.name
tags = {
Name = "Private RDS MySQL Instance"
}
}
Performance Insights
resource "aws_db_instance" "mysql" {
# RDS インスタンス
identifier = "exampledb-instance"
...
performance_insights_enabled = true
みたいなのを付ける、といいたい所ではあるが、これが使えるのはmedium以上だったりするのでT系のmicroとかsmallとかでは使えない
resource "aws_db_instance" "mysql" {
# RDS インスタンス
identifier = "exampledb-instance"
allocated_storage = 20
engine = "mysql"
engine_version = "8.0"
#instance_class = "db.t4g.micro"
instance_class = "db.t4g.medium"
db_name = "exampledb"
username = "admin"
password = aws_ssm_parameter.db_pass.value
publicly_accessible = false
vpc_security_group_ids = [aws_security_group.rds_sg.id]
db_subnet_group_name = aws_db_subnet_group.db_subnet_group_private.name
skip_final_snapshot = true
parameter_group_name = aws_db_parameter_group.mysql_params.name
performance_insights_enabled = true
Performance Insightsについては別項で細かく見てみ、る、かも