Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 18 additions & 74 deletions modules/app_stack/db_ec2.tf
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ data "aws_subnet" "db_ec2" {
id = var.db_subnet_id
}

# 운영 데이터 볼륨은 app_stack 에 남겨 기존 state 주소와 prevent_destroy 보호를 유지합니다.
# 재사용 가능한 db_ec2 모듈은 전달받은 볼륨을 DB EC2에 연결하는 역할만 담당합니다.
resource "aws_ebs_volume" "db_data" {
count = var.enable_db_ec2 ? 1 : 0

Expand All @@ -21,78 +23,20 @@ resource "aws_ebs_volume" "db_data" {
}
}

data "cloudinit_config" "db_init" {
count = var.enable_db_ec2 ? 1 : 0
gzip = true
base64_encode = true

part {
content_type = "text/x-shellscript"
content = templatefile("${path.module}/scripts/mysql_setup.sh.tftpl", {
db_root_username_b64 = base64encode(var.db_username)
db_root_password_b64 = base64encode(var.db_password)
db_data_volume_id = aws_ebs_volume.db_data[count.index].id
mysql_config_content = file("${path.module}/templates/mysql_tuning.cnf")
})
filename = "mysql_setup.sh"
}
}

resource "aws_instance" "db_server" {
count = var.enable_db_ec2 ? 1 : 0

ami = var.db_ami_id
instance_type = var.db_instance_type
subnet_id = var.db_subnet_id
# 인스턴스를 교체해도 Parameter Store 의 datasource 주소와 API 서버 설정을 그대로 쓰도록 주소를 고정합니다.
private_ip = var.db_private_ip

vpc_security_group_ids = [
aws_security_group.db_ec2_sg[count.index].id,
aws_security_group.db_ec2_alarm_client_sg[count.index].id,
]
associate_public_ip_address = false
iam_instance_profile = var.ec2_iam_instance_profile
key_name = var.key_name

user_data_base64 = data.cloudinit_config.db_init[count.index].rendered

metadata_options {
http_endpoint = "enabled"
http_tokens = "required"
http_put_response_hop_limit = 1
}

root_block_device {
volume_size = 8
volume_type = "gp3"
encrypted = true
delete_on_termination = true
}

tags = {
Name = "solid-connection-db-mysql-${var.env_name}"
}

user_data_replace_on_change = false

lifecycle {
# AMI 갱신이 운영 중인 DB EC2를 교체하지 않도록 무시하고, 인스턴스가 재생성되는 시점에 새 AMI를 적용합니다.
ignore_changes = [
ami,
key_name,
user_data,
user_data_base64,
user_data_replace_on_change,
]
}
}

resource "aws_volume_attachment" "db_data" {
count = var.enable_db_ec2 ? 1 : 0

device_name = "/dev/sdf"
volume_id = aws_ebs_volume.db_data[count.index].id
instance_id = aws_instance.db_server[count.index].id
stop_instance_before_detaching = true
module "db_ec2" {
source = "./modules/db_ec2"

enabled = var.enable_db_ec2
env_name = var.env_name
db_instance_type = var.db_instance_type
db_ami_id = var.db_ami_id
db_subnet_id = var.db_subnet_id
db_private_ip = var.db_private_ip
data_volume_id = try(aws_ebs_volume.db_data[0].id, null)
db_security_group_id = try(aws_security_group.db_ec2_sg[0].id, null)
alarm_client_security_group_id = try(aws_security_group.db_ec2_alarm_client_sg[0].id, null)
ec2_iam_instance_profile = var.ec2_iam_instance_profile
key_name = var.key_name
db_username = var.db_username
db_password = var.db_password
}
2 changes: 1 addition & 1 deletion modules/app_stack/db_users.tf
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ resource "mysql_user" "users" {

depends_on = [
aws_db_instance.default,
aws_instance.db_server,
module.db_ec2,
]
}

Expand Down
Loading
Loading