首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
Terraform实战10:RDS + Secrets Manager——数据库与密钥管理
📅 2026/8/12 16:35:21
✍️ 爱科研究院
👁 阅读 3,247
Terraform实战10RDS Secrets Manager——数据库与密钥管理本篇目标用Terraform创建RDS MySQL数据库配合Secrets Manager安全管理数据库密码。理解数据库子网组、安全访问控制和密钥管理最佳实践。学完本篇你将掌握RDS数据库的创建和配置数据库子网组DB Subnet GroupSecrets Manager存储和管理密码random_password生成安全密码数据库安全组设计只允许应用层访问前置条件已完成前九篇练习理解VPC公私网和安全组为什么需要Secrets Manager之前的练习中密码可以写在变量里但生产环境这样做很危险方式问题密码写在代码里推到Git后所有人都能看到密码写在tfvars里tfvars可能被提交或本地泄露密码写在环境变量里不方便管理和轮转Secrets Manager加密存储、API获取、支持自动轮转、有审计日志架构图┌─────────────────────────────────────────────────────────┐ │ VPC (10.0.0.0/16) │ │ │ │ ┌───────────────┐ ┌───────────────┐ ┌───────────┐ │ │ │ 公有子网(2个) │ │ 私有子网(2个) │ │DB子网(2个)│ │ │ │ 10.0.1-2.0/24│ │ 10.0.10-11/24│ │10.0.20-21 │ │ │ └───────────────┘ └───────────────┘ └─────┬─────┘ │ │ │ │ │ ┌──────┴──────┐ │ │ │ RDS MySQL │ │ │ │ db.t3.micro│ │ │ │ port:3306 │ │ │ └─────────────┘ │ │ ↑ │ │ 安全组 │ │ 只允许VPC内部3306 │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────┐ │ Secrets Manager │ │ 存储DB用户名/密码 │ ← 应用通过API获取密码 └─────────────────────┘目录结构10-rds-secrets/ ├── main.tf # VPC RDS Secrets Manager 安全组 ├── variables.tf # 变量DB规格、库名、用户名 └── outputs.tf # 输出端点地址、Secret名称完整代码main.tfterraform { required_providers { aws { source hashicorp/aws version ~ 5.0 } random { source hashicorp/random version ~ 3.0 } } required_version 1.0 } provider aws { region var.region } locals { name_prefix ${var.project_name}-${var.environment} common_tags { Project var.project_name Environment var.environment ManagedBy terraform } } # VPC注意多了database_subnets module vpc { source terraform-aws-modules/vpc/aws version 5.16.0 name ${local.name_prefix}-vpc cidr 10.0.0.0/16 azs [${var.region}a, ${var.region}b] public_subnets [10.0.1.0/24, 10.0.2.0/24] private_subnets [10.0.10.0/24, 10.0.11.0/24] database_subnets [10.0.20.0/24, 10.0.21.0/24] # 【新增】数据库专用子网 # 社区模块自动创建数据库子网组 create_database_subnet_group true database_subnet_group_name ${local.name_prefix}-db-subnet-group enable_nat_gateway false enable_dns_hostnames true enable_dns_support true tags local.common_tags } # 【新资源】随机密码不把密码写在代码里 resource random_password db_password { length 16 special true override_special !#$%*()-_[]{}:? } # 【新资源】Secrets Manager - 密钥存储 resource aws_secretsmanager_secret db_credentials { name ${local.name_prefix}-db-credentials description RDS database credentials recovery_window_in_days 0 # 练习用生产用7-30天 tags local.common_tags } # Secret的值JSON格式 resource aws_secretsmanager_secret_version db_credentials { secret_id aws_secretsmanager_secret.db_credentials.id secret_string jsonencode({ username var.db_username password random_password.db_password.result dbname var.db_name host aws_db_instance.mysql.endpoint port 3306 engine mysql }) } # 安全组 - 只允许VPC内部访问3306 resource aws_security_group rds { name ${local.name_prefix}-rds-sg vpc_id module.vpc.vpc_id ingress { description MySQL from VPC from_port 3306 to_port 3306 protocol tcp cidr_blocks [module.vpc.vpc_cidr_block] } egress { from_port 0 to_port 0 protocol -1 cidr_blocks [0.0.0.0/0] } tags merge(local.common_tags, { Name ${local.name_prefix}-rds-sg }) } # 【新资源】RDS MySQL resource aws_db_instance mysql { identifier ${local.name_prefix}-mysql # 引擎 engine mysql engine_version 8.0 instance_class var.db_instance_class # 存储 allocated_storage 20 max_allocated_storage 50 storage_type gp3 storage_encrypted true # 数据库 db_name var.db_name username var.db_username password random_password.db_password.result # 网络 db_subnet_group_name module.vpc.database_subnet_group_name vpc_security_group_ids [aws_security_group.rds.id] publicly_accessible false # 不允许公网访问 # 备份 backup_retention_period 1 skip_final_snapshot true # 高可用练习关闭 multi_az false deletion_protection false tags merge(local.common_tags, { Name ${local.name_prefix}-mysql }) }variables.tfvariable region { default us-east-1 } variable project_name { default tf-practice } variable environment { default dev } variable db_instance_class { description RDS实例规格 default db.t3.micro } variable db_name { description 数据库名称 default myapp } variable db_username { description 数据库管理员用户名 default admin }outputs.tfoutput rds_endpoint { description RDS连接地址 value aws_db_instance.mysql.endpoint } output rds_port { value aws_db_instance.mysql.port } output rds_database_name { value aws_db_instance.mysql.db_name } output secret_name { description Secrets Manager中的密钥名称 value aws_secretsmanager_secret.db_credentials.name } output secret_arn { description Secret ARN value aws_secretsmanager_secret.db_credentials.arn } # 不输出密码明文通过API获取 output how_to_get_password { value aws secretsmanager get-secret-value --secret-id ${aws_secretsmanager_secret.db_credentials.name} --query SecretString --output text }新增资源说明RDS关键字段字段含义示例值identifierRDS实例标识控制台显示的名称“tf-practice-dev-mysql”engine/engine_version数据库引擎和版本“mysql” / “8.0”instance_class实例规格“db.t3.micro”allocated_storage初始存储(GB)20max_allocated_storage存储自动扩展上限(GB)50storage_type存储类型“gp3”性价比最高storage_encrypted是否加密存储truedb_subnet_group_name数据库子网组跨2个AZpublicly_accessible是否允许公网访问false必须multi_az是否多AZ高可用生产true练习falsebackup_retention_period备份保留天数生产7-30练习1skip_final_snapshot删除时是否跳过最终快照生产false练习truedeletion_protection防止误删生产true练习falseSecrets Manager关键字段字段含义name密钥名称全局唯一recovery_window_in_days删除后保留天数0立即删生产用7-30secret_string密钥值通常是JSON格式random_passwordresource random_password db_password { length 16 # 密码长度 special true # 包含特殊字符 override_special !#$%*()... # 指定允许的特殊字符 } # 引用random_password.db_password.resultdatabase_subnetsVPC模块新参数module vpc { # ... database_subnets [10.0.20.0/24, 10.0.21.0/24] # 数据库专用子网 create_database_subnet_group true # 自动创建子网组 database_subnet_group_name xxx-db-subnet-group # 子网组名称 }RDS要求至少2个AZ的子网才能创建子网组。社区VPC模块支持直接传database_subnets参数自动处理。操作步骤与实际输出ApplyRDS创建约6-7分钟terraform apply -auto-approvemodule.vpc.aws_db_subnet_group.database[0]: Creation complete after 3s aws_security_group.rds: Creation complete after 7s aws_db_instance.mysql: Still creating... [6m0s elapsed] aws_db_instance.mysql: Creation complete after 6m30s Apply complete! Resources: 27 added, 0 changed, 0 destroyed. Outputs: rds_endpoint tf-practice-dev-mysql.cqnyouc4a558.us-east-1.rds.amazonaws.com:3306 rds_database_name myapp secret_name tf-practice-dev-db-credentials how_to_get_password aws secretsmanager get-secret-value --secret-id tf-practice-dev-db-credentials --query SecretString --output text获取密码通过API而非明文输出aws secretsmanager get-secret-value\--secret-id tf-practice-dev-db-credentials\--querySecretString--outputtext返回JSON{username:admin,password:随机生成的16位密码,dbname:myapp,host:tf-practice-dev-mysql.xxx.rds.amazonaws.com:3306,port:3306,engine:mysql}控制台验证RDS实例详情引擎MySQL 8.0规格db.t3.micro状态Available连接与安全公网访问NoVPC和子网组Secrets Manager密钥已创建数据库子网组跨2个AZDestroyterraform destroy -auto-approve# Destroy complete! Resources: 27 destroyed.安全最佳实践实践本篇演示生产环境建议密码不写在代码里✅ random_password生成✅密码存在Secrets Manager✅✅ 开启自动轮转RDS不可公网访问✅ publicly_accessiblefalse✅安全组限制来源✅ 只允许VPC内部进一步限制到应用安全组存储加密✅ storage_encryptedtrue✅ 用自定义KMS key多AZ高可用❌ 省钱关闭✅ multi_aztrue删除保护❌ 练习关闭✅ deletion_protectiontrue备份保留1天7-30天延伸思考面试常见问题面试问题答案要点RDS密码怎么管理random_password生成 Secrets Manager存储不在代码中明文为什么RDS要放私有子网不暴露公网只允许VPC内部应用访问DB Subnet Group是什么告诉RDS可以在哪些子网创建实例至少跨2个AZmulti_az有什么用主从自动切换主实例挂了自动failover到备用AZ应用怎么获取数据库密码通过Secrets Manager API获取不写死在配置文件里gp3和gp2的区别gp3性价比更高基准性能更好可独立调整IOPS费用说明资源费用RDS db.t3.micro~$0.017/小时Secrets Manager~$0.40/月按比例VPC / 子网 / 安全组免费总计~$0.02/小时本次练习约15分钟约$0.01小结本篇核心收获RDS放私有子网publicly_accessiblefalse是安全标配random_password生成密码 Secrets Manager存储 安全的密码管理DB Subnet Group需要至少2个AZ的子网VPC模块可自动创建不输出密码明文通过Secrets Manager API获取生产环境要开multi_az、deletion_protection、更长的备份保留下一篇预告Terraform实战11完整三层架构VPC ALB EKS RDS下一篇将串联前面所有知识构建一个完整的生产级架构VPC网络层ALB负载均衡层EKS计算层RDS数据层所有组件通过模块组合参考链接本系列配套代码GitHubTerraform aws_db_instance文档Terraform aws_secretsmanager_secret文档AWS RDS最佳实践AWS Secrets Manager文档Terraform random_password文档
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/8/12 16:35:15
Tftpd64:5大网络服务一体化的开源解决方案,网络管理从此不同
2026/8/12 16:35:14
扩音器什么品牌音质最好?扩音喇叭哪个牌子好?音质最好扩音机!
2026/8/12 16:35:10
Java并发编程深度解析:从synchronized到分布式锁的实战指南
2026/8/12 16:37:55
Pygame性能优化:脏矩形技术原理、实战与避坑指南
2026/8/12 16:37:47
研发费用中“材料费硬塞”的识别方法——基于领料单与实验记录交叉验证的实务操作指南
2026/8/12 16:37:39
世界模型评测新基准:从因果推理到状态表征的范式变革
2026/8/12 16:37:22
软件测试管理四阶段演进:从救火到防火的质量体系构建
2026/8/12 16:37:06
终极指南:如何用渔人的直感FF14钓鱼计时器提升游戏效率
2026/8/12 16:36:56
AI Agent记忆系统架构设计:从短期对话到长期认知的完整实现
2026/8/12 16:33:47
Figma组件化设计:虚拟角色视觉资产高效生产全流程
2026/8/12 16:33:47
Rust宏系统:编译时代码生成与转换详解
2026/8/12 16:33:47
TVA-World驱动的具身智能交互机制研究