/** * # rds-mysql-proxy * * Create vpc, rds, dbproxy, and a bastion */ locals { vpc_cidr = "10.18.0.0/16" # ensure there is room for future expansion private_net_start = cidrsubnet(local.vpc_cidr, 2, 1) public_net_start = cidrsubnet(local.vpc_cidr, 2, 2) rds_port = 13306 } data "aws_availability_zones" "this" { state = "available" } resource "random_shuffle" "Select2Az" { input = data.aws_availability_zones.this.names result_count = 2 } module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "6.6.0" name = "lab-${var.owner}-vpc" cidr = local.vpc_cidr azs = random_shuffle.Select2Az.result enable_ipv6 = false public_subnets = cidrsubnets(local.public_net_start, 8, 8) database_subnets = cidrsubnets(local.private_net_start, 8, 8) create_database_subnet_group = true enable_dns_hostnames = true enable_dns_support = true enable_nat_gateway = false enable_flow_log = false create_flow_log_cloudwatch_log_group = false create_flow_log_cloudwatch_iam_role = false manage_default_network_acl = false } module "db" { source = "terraform-aws-modules/rds/aws" version = "7.1.0" identifier = "${var.environment}-${var.owner}-test" engine = "mysql" engine_version = "8.4.8" family = "mysql8.4" # DB parameter group major_engine_version = "8.4" # DB option group instance_class = "db.t4g.medium" storage_type = "gp3" allocated_storage = 20 max_allocated_storage = 20 db_name = "appdb" username = "mysqldba" port = local.rds_port multi_az = false create_db_subnet_group = false db_subnet_group_name = module.vpc.database_subnet_group_name vpc_security_group_ids = [aws_security_group.rds-sg.id] skip_final_snapshot = true deletion_protection = false apply_immediately = true parameters = [ { name = "character_set_client" value = "utf8mb4" }, { name = "character_set_server" value = "utf8mb4" } ] } resource "aws_security_group" "rds-sg" { name = "rds-sg" description = "Allow rds inbound traffic" vpc_id = module.vpc.vpc_id ingress { description = "RDS access from bastion" from_port = local.rds_port to_port = local.rds_port protocol = "tcp" security_groups = [aws_security_group.bastion-sg.id, aws_security_group.dbproxy-sg.id] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } } # bastion module "BastionRole" { source = "../../modules/security_identity_compliance/iam-role-v2" description = "EKS bastion instance profile" role-name = "BastionInstanceProfile" trusted-entity = "ec2.amazonaws.com" create-instance-profile = true } resource "aws_iam_role_policy_attachment" "BastionProfilePermissions" { role = module.BastionRole.name policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" } module "bastion" { source = "../../modules/compute/ec2" additional-tags = {} ami-id = data.aws_ami.this.id asso-eip = false asso-public-ip = true use-ipv6 = true data-volumes = {} ebs-encrypted = true instance-name = "lab-${var.owner}-rds-client" instance-type = "t4g.micro" key-name = aws_key_pair.kp.key_name kms-key-id = "" root-volume-size = "8" security-groups = [aws_security_group.bastion-sg.id] subnet-id = module.vpc.public_subnets[0] instance-profile = module.BastionRole.profile-name[0] spot-max-price = 0.0116 # t4g.micro user-data = <