Terraform实战10:RDS + Secrets Manager——数据库与密钥管理

发布时间:2026/10/6 19:02:14

Terraform实战10:RDS + Secrets Manager——数据库与密钥管理 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文档
延伸阅读

更多相关文章

2026/9/24 9:57:32

多行文本替换全攻略:跨行匹配与批量处理实践

这次我们来看一个在文本处理中非常实际的需求:如何高效、准确地替换包含换行符的多行文本。无论是处理代码、日志文件、配置文件,还是进行数据清洗,当需要替换的字符串本身包含换行符时,传统的单行替换工具(如记事本的…

2026/10/3 16:58:04

Ubuntu 22.04 LTS 安装与换源全攻略:从零搭建高效开发环境

1. 项目概述:为什么Ubuntu22.04的安装与换源是开发者的第一课 如果你刚拿到一台新电脑,或者准备在虚拟机里搭建一个开发环境,Ubuntu 22.04 LTS(Jammy Jellyfish)大概率是你的首选。它稳定、社区支持强大,是…

2026/10/6 18:59:36

YOLOv8果园避障机器人实战:从检测到部署

简介:本资源是一套基于YOLOv8实现的智慧果园避障割草机器人完整项目方案,面向计算机、人工智能、自动化等专业本科生及课程设计/毕业设计实践者,解决农业场景下移动机器人实时目标检测与自主避障的核心问题。包内共8个文件,含3个核…

2026/10/6 18:59:36

Redis内存淘汰策略详解:LRU与LFU的原理、选型与调优

这两年做Redis调优和面试准备,绕不开的一个话题就是内存淘汰策略,尤其是LRU和LFU这两个算法。你可以把它们理解成Redis内存遇到压力时的“清退机制”,直接决定了当maxmemory被耗尽时,哪些key会被优先踢掉、哪些key会被留下来继续提…

2026/10/6 18:59:36

社区发现实战指南:5大算法选型、7大评估指标与6大基准数据集

简介:本资源是一份面向网络科学初学者与算法实践者的复杂网络社区发现综合学习包,聚焦社区划分算法实现、效果评估与真实数据验证三大核心环节。压缩包共28个文件,含6个Python算法脚本(GN、谱聚类等)、8个GML格式经典网…

2026/10/6 18:59:36

WinForms并发编程:Parallel+Semaphore+Timer

如果你在 WinForms 项目里碰过并发编程,一定对那个经典的红色异常不陌生:"跨线程操作无效,从不是创建控件的线程访问它"。多少人在后台开了一个Task.Run,想顺手更新一下进度条,结果直接被这个异常打懵。WinF…

2026/10/6 18:59:36

基于机器学习的恶意加密流量检测平台:TLS指纹与流特征实战

简介:基于机器学习的恶意加密流量监测平台.zip 是一套面向网络安全学习者的完整项目资源,涵盖从流量采集、预处理、建模到可视化展示的闭环流程,适用于高校实验、课题研究与入门进阶。压缩包共包含66个文件,以14个Python脚本、8个…

2026/10/6 18:54:36

第1章:下载 Linux 0.12 内核

专栏导航 上一篇:第1章:开发环境搭建,在 Windows 中安装 Git 回到目录 下一篇:第1章:开发环境搭建,在 Windows 中安装 VS 2019 本节前言 对于本节所讲解的知识,有可能,你会需要时…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑