发布时间:2026/8/12 16:35:28
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/8/12 16:30:28

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

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

2026/8/12 16:30:28

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

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

2026/8/12 19:35:44

游戏化Python入门:从CodeCombat闯关到实战项目开发

你是不是也遇到过这样的困境:想学Python,但面对枯燥的语法书和“Hello World”就昏昏欲睡?或者跟着教程敲了几行代码,却完全不知道这些代码能用来做什么,学习动力瞬间归零?今天要聊的,可能正是你…

2026/8/12 19:35:44

DEV C++图形学实践:从Bresenham算法到三维动画的期末作业指南

1. 项目概述:从零到一,用DEV C搞定图形学期末作业又到了期末季,对于很多计算机相关专业的同学来说,计算机图形学这门课的大作业,绝对算得上是一个“甜蜜的负担”。说它甜蜜,是因为亲手敲出代码,…

2026/8/12 19:35:44

从零搭建React开发环境:Node.js、VSCode与CRA实战指南

1. 项目概述:从零搭建React开发环境如果你正准备踏入前端开发,或者想从Vue、Angular等其他框架转向React,那么第一步也是最关键的一步,就是搭建一个顺手的开发环境。这听起来像是老生常谈,但根据我的经验,很…

2026/8/12 19:35:44

基于 Playwright + Pytest 的 Web自动化测试框架搭建

项目介绍 网址:http://47.116.12.183/ 项目简介:本项目基于 Python 编程语言,采用 Playwright 作为核心浏览器自动化驱动库,结合 Pytest 测试框架管理用例执行与断言,并集成 Allure 生成测试报告。 语言:…

2026/8/12 19:35:44

周测复盘【回溯】

P2089 烤鸡 直接上我的代码&#xff0c;等我彻底搞懂逻辑挂个链接来讲这个题呢&#xff0c;挂不来链接&#xff0c;反正给自己看的&#xff0c;挂个文件路径算了"C:\Users\22766\Videos\c5c32f36f01bbe40e0340881774c96cc.mp4" #include <bits/stdc.h> using…

2026/8/12 19:30:43

AI赋能前端单元测试:基于LLM的自动化测试生成与维护实践

1. 项目概述&#xff1a;当AI遇见前端单元测试最近和团队里的几个前端同学聊天&#xff0c;发现一个挺有意思的现象&#xff1a;大家一提到写单元测试&#xff0c;眉头就皱起来了。不是觉得不重要&#xff0c;而是觉得“性价比”不高。前端业务迭代快&#xff0c;UI交互复杂&am…

2026/8/12 10:37:12

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片&#xff1a;Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 5:35:25

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map&#xff0c;七种策略与六类陷阱引言&#xff1a;128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token&#xff08;≈ 0.5MB ~ 4MB 文本&#xff09;&#xff0c;但 LLM 想要处理的真实数据规模远远超过这个量级&#xff1a;真实…

2026/8/12 9:34:08

Ubuntu 23.10中双击运行.sh文件的完整指南:从权限原理到桌面配置

1. 项目概述&#xff1a;从一次“双击”引发的权限探索在Ubuntu桌面环境下&#xff0c;我们习惯了双击运行那些带有.exe后缀的Windows程序安装包&#xff0c;但当你拿到一个以.sh结尾的Shell脚本文件时&#xff0c;满怀期待地双击它&#xff0c;却很可能只看到一个文本编辑器窗…

2026/8/12 9:34:08

NumPy条件索引实战:np.where与np.argwhere高效数据筛选指南

1. 从一次数据筛选的“笨办法”说起 前几天&#xff0c;我帮一个刚入行的数据分析师同事看代码&#xff0c;他正在处理一批传感器数据&#xff0c;需要找出所有温度超过阈值的数据点&#xff0c;然后进行后续分析。我一看他的实现&#xff0c;好家伙&#xff0c;一个 for 循环…

2026/8/12 9:34:08

基于Docker与Selenium Grid构建高可用浏览器自动化测试环境

1. 项目概述&#xff1a;为什么需要容器化的浏览器自动化&#xff1f;在软件开发和测试领域&#xff0c;浏览器自动化早已不是新鲜事。无论是日常的UI回归测试、数据抓取&#xff0c;还是复杂的业务流程模拟&#xff0c;Selenium都是我们绕不开的利器。然而&#xff0c;但凡在团…

2026/8/10 11:20:30

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/11 17:06:59

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/11 3:05:11

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具&#xff0c;覆盖选题构思、文献整理、内容生成、格式排版等核心场景&#xff0c;真正帮你高效搞定论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首…