想象你是“云端咖啡”连锁品牌的全球开店工程师。过去开一家分店,你要飞过去蹲守三个月:盯装修、催设备、培训店员,每个国家都得从头来一遍。现在总部要求你写一本《开店手册》,把开店流程全部标准化——设备清单、水电图纸、资产标签、当地供应商匹配表,全部装进一个活页夹。于是,东京店、法兰克福店、硅谷店可以同时动工,三周内统一开业,各不相同的地理环境被同一本手册“翻译”成了相似的分店。 这本“开店手册”在云计算世界里有一个专业名字:基础设施即代码(Infrastructure as Code,简称 IaC)。当你要在多个云厂商上部署 GPU 集群,用于 AI 训练和推理时,手工点击控制台已经完全不现实——你需要一套可复用的 IaC 模板,像开店手册一样,把“算力分店”同时开到 AWS、Azure、GCP。而 Terraform 就是写这本手册最流行的“笔”。接下来,我们就从零开始,把这本手册一页一页地拆开来看。
学完本文,你将能设计一套可复用的跨云 GPU 集群 Terraform 模板,掌握模板分层、网络抽象、标签治理与状态管理,这是云架构师与 DevOps 工程师的核心竞争力。
目录
可视化演示
展示IaC模板统一管理多云GPU集群的部署流程,包含模板定义、跨云部署与GPU实例监控三个阶段。
本节配有交互动效(进入视口后自动加载,约 3KB)。
跨云GPU集群IaC模板设计 IaC模板:Terraform统一定义GPU实例规格 跨云部署:AWS/GCP/Azure三云同步应用 GPU监控:实例运行状态与资源利用率 总GPU = Σ(cloud_i.gpu_count)
1. 模板架构总览:开店手册的活页夹
你是一家跨国咖啡连锁的“开店工程师”。过去开一家分店,你要飞过去蹲守三个月,盯装修、催设备、培训店员,每个国家都从零折腾一遍。现在总部要求你把开店流程沉淀成一本《开店手册》,而且是活页夹:装修册、设备册、培训册、标签册各自独立。东京店只需要替换设备册里的电压适配页,其他册子原样照搬。不同国家的分店,就这样被同一本手册“翻译”成了相似的店面。
在云的世界里,这本活页夹就是 Terraform 工程的目录结构。modules/ 目录放可复用的子模块——gpu、network、tags 各占一册;根目录的 main.tf 负责把册子组装起来;variables.tf 是手册里的填空位,outputs.tf 是开业后向总部汇报的经营指标。再加上 dev、staging、prod 三套环境参数,试营业和正式营业互不干扰,就像手册的“演示版”和“正式版”分开印刷。
子模块按资源角色拆分,每个模块内部有独立的变量声明和输出定义,外部只通过变量传参沟通,就像活页册之间只通过目录索引互相引用。环境分层用 terraform.tfvars 按环境提供不同的变量值:生产环境的实例数量、规格、标签与开发环境完全隔离,避免“试营业把正式厨房搞乱”的悲剧。
1. project 项目标识:标记业务项目归属,如大模型训练项目 llm-lab,用于多项目隔离与账单归属。
2. env 环境标识:区分开发、预发与生产环境,保证环境之间互不干扰。
3. region 区域取值:写入云厂商的区域代码,如 ap-southeast-1,决定资源部署的物理位置。
4. role 资源角色:标注资源用途,如训练节点或推理节点,便于针对性治理与检索。
有了规范的活页夹,新店开业就变成“填表加组装”的流水线;有了规范的模板架构,接入新云、新环境也只是增加一页配置,而不是重写整本书。这,就是 IaC 模板设计的起点。
2. GPU实例模板:设备采购清单不写死品牌
翻开《开店手册》的设备册,你会发现它不会写“购买东京牌的咖啡机”,而是写“双锅炉意式咖啡机,支持 220V/110V 自适应,日产能不低于 500 杯”。东京店和法兰克福店按同一套能力标准在当地采购,品牌随区域而定。这样,设备清单才不会被单一供应商绑架。
GPU 实例模板也是同样的哲学:不把 p4d.24xlarge 这类具体机型写死在代码里,而是声明“我需要 8 卡 A100、显存 80GB、64 核 CPU”这样的能力规格。至于这个规格在 AWS 上是 p4d.24xlarge、在 Azure 上是 Standard_ND96asr_v4、在 GCP 上是 a2-highgpu-8g,统统交给适配层去翻译,模板主体永远只认抽象规格。
技术细节上,实例规格要用变量参数化:gpu_type、gpu_count、cpu_cores、memory_gb 全部来自变量;自定义镜像要固化驱动与 CUDA 版本,避免每次启动现场装环境;user_data 启动脚本负责拉起训练框架;弹性伸缩按训练队列长度扩容,闲时按需缩容,像“忙碌时段加开吧台,闲时关掉一台咖啡机”。
1. n 实例种类数:按 GPU 规格分组的实例种类数量,规格越少越易管理。
2. p_i 单位价格:第 i 种实例每小时的单价,不同云、不同区域价格不同。
3. t_i 运行时长:第 i 种实例累计运行的小时数,弹性伸缩会影响这一项。
设备清单的标准不锁定品牌,门店才能快速复制;GPU 规格的声明不锁定云厂商,集群才能随处开张。这就是 GPU 实例模板“规格化”的威力。
3. 网络配置抽象:水电图纸用相对坐标
装修册里的图纸从不写绝对 GPS 坐标,而是写“吧台位于门厅右侧 3 米、后厨与吧台隔一堵承重墙”。这样不管店面是扇形还是长方形,都能按相对位置套用。云网络也一样,如果把网段写死,换个区域就全盘作废。
网络模块的核心是把 VPC、子网、安全组抽象成“相对图纸”。统一规划 CIDR 网段:管理子网、计算子网、存储子网各占一段,像厨房的水路、电路、燃气分开铺设;安全组就是一张“门禁卡授权表”,规定 22 端口谁能 SSH、GPU 节点之间的数据面端口如何放行、公网入口对谁开放。
此外,跨云集群需要互联:通过 VPC Peering 或 VPN 隧道,把三朵云的控制面和数据面打通,让训练任务可以跨云调度;负载均衡器把推理流量分发到各云的多副本上,像“总台把顾客引导到不同分店”。子网规划时要预留扩容量,否则后期加节点发现 IP 不够用,只能推倒重来。
1. m 主机位位数:子网掩码中剩余的主机位个数,决定该子网能容纳多少 IP。
2. N_node 节点总数:需要承载的 GPU 计算节点数量,是容量的下限。
3. N_reserve 预留数量:为负载均衡、网关、运维跳板机预留的 IP 数。
图纸可复用、门禁规则跟人走,这就是网络配置抽象的价值:换一家店,重新量一下尺寸,但规则册一字不改。跨云组网亦是如此。
4. 资源标签策略:每台设备都有资产标签
每一家分店的每台设备,都要在显眼位置贴上“资产标签”:所属门店编号、购入日期、负责人姓名。月底财务对账靠它,总部盘点靠它,设备保修、事故追责还是靠它。没有标签的店,三个月后就成了一笔糊涂账。
云资源标签就是这套资产标签体系,本质是键值对。模板里要定义统一规范:project 标项目、env 标环境、team 标团队、cost_center 标成本中心。这些标签会跟随资源进入云厂商的账单,财务月底按标签自动出成本报表;IAM 权限策略也能按标签授权,比如“算法团队只能操作 team=algorithm 的资源”,相当于“只有后厨员工卡能开后厨门”。
实现上,标签要在模块入口统一注入,所有子资源强制继承,防止有人漏贴;标签键值要建立白名单校验,拼写漂移(如 team 和 Team 并存)会导致账单无法聚合;环境与团队标识是最低要求的两个标签,缺一不可。
1. k 标签键:标签的键必须来自白名单,如 project、env、team 等。
2. v 标签值:与键对应的取值,如团队名 algorithm,表示资源的归属。
3. 集合运算关系:每个资源都附带一组标签集合,查询、审计、分摊都按集合筛选。
资产标签让数百台设备井井有条,资源标签让跨云集群的账单和权限一清二楚。标签不是打给机器看的,是打给一个月后的自己看的。
5. 多云适配层:当地供应商匹配表
手册的最后几页,附了一张《当地供应商匹配表》:东京分店找东芝供货,法兰克福分店找西门子供货,多伦多分店找本地经销商。采购部照表执行,不需要临时询价、重新设计;手册正文永远只写“双锅炉意式咖啡机”。
适配层就是这张匹配表。Terraform 通过 provider 声明云厂商(aws、azurerm、google),每个 provider 是一个“当地供应商插件”;子模块内部用 count 或 for_each 根据 var.cloud 决定创建哪一类资源,用 provider 参数把不同云的具体资源配置传给子模块,结构上清晰得像查表。
实现技巧:维护一个“机型映射表”,把抽象规格翻译成各云机型;用 data source 读取区域可用区等只读信息,避免硬编码;多个 provider 别名对应多个区域,实现就近部署。用户只需在 tfvars 里声明“我要在 aws 的新加坡区域开 8 卡 A100”,剩下的由适配层完成。
1. cloud 云厂商标识:取值限定为已支持的云厂商,如 aws、azure、gcp。
2. spec 算力规格:用户声明的抽象算力要求,如 8 卡 A100。
3. M 映射关系:把抽象规格翻译为各云具体机型的映射规则,如 AWS 对应 p4d.24xlarge。
供应商匹配表让采购标准化,适配层让“同样的算力诉求”在每朵云上都找到最合适的机型。模板主体一次编写,多处复用,跨云不再意味着重复劳动。
6. 状态与编排:总部的统一账本与一把锁
总部绝不能靠各店微信汇报来掌握资产。每家店的设备台账必须实时同步到总部 ERP,而且这本账一次只允许一个店长修改——两个人同时改同一行,账必乱。这是连锁管理的基本常识。
Terraform 的状态(state)文件就是这套账本,记录“模板中的逻辑资源 ↔ 云上的真实资源”的映射关系。它必须放在远程后端(如 S3、OSS、GCS),配一张锁表(如 DynamoDB),让团队共享账本且一次仅一人可写。本地文件只适合单人练习,团队协作时放在各自电脑里的账本必然漂移。
状态锁机制保证并发 apply 时不会互相踩踏;依赖编排通过 depends_on 和资源依赖图保证创建顺序:先建 VPC,再建子网,最后建 GPU 实例;工作空间按环境隔离状态文件,prod 和 dev 各有一本账,互不干扰,像“总账与门店备用账分开登记”。
1. S_t 当前状态:当前状态文件所描述的资源集合,是“账本上的东西”。
2. D 期望状态:模板声明的目标状态,即“手册里写明的设备清单”。
3. Apply 差异执行:计算期望与当前的差集,对差集资源执行创建或更新,多余资源则删除。
有统一账本加一把锁,三家分店才敢同时动工互不踩踏;有了远程状态和锁机制,跨云集群的并发变更是安全、可审计的。
7. 密钥与安全:密码锁进保险库
开店手册的封面上,绝不会印“总保险柜密码 123456”。正确的做法是:密码由总部保险库保管,店长开业当天凭授权领取,手册里只写“去保险库领取本店密码”这一步操作。分店越多,越不能把密码写进每一本手册。
Terraform 项目同理。云厂商的访问密钥、数据库密码、API Key 这些敏感信息,绝不能以明文出现在模板或 tfvars 里。Provider 凭据通过环境变量或 CI 系统的密钥服务注入;资源密码通过 Vault、AWS SSM、Azure Key Vault 等密钥服务动态注入,模板里只写“从密钥服务读取”的声明,不写值本身。
还要注意:状态文件里会保存资源的敏感属性,因此远程状态必须加密存储、加密传输;权限遵循最小原则,生产与测试环境使用不同的凭据,就像“总店保险库的钥匙和分店备用钥匙分开保管”,即使一把泄露,损失也可控。
1. cipher 密文:状态文件或配置中的加密后敏感信息,泄露了也无法直接读取。
2. key 加密密钥:由 KMS 等密钥管理系统保管的主密钥,用于解密操作。
3. Decrypt 解密操作:仅授权实体可调用的解密函数,把密文还原为可用配置。
把密码交给保险库而不是印在手册里,分店再多也安全;把密钥交给密钥服务而不是写进模板,云再多也不泄露。
8. 运维实践方法:试营业、审批与版本统一
新店正式开业前必须“试营业”:把手册和店面条件过一遍,模拟一次完整营业流程,区域经理签字后才能正式动工。同时,手册每次改版要统一印刷版号,绝不允许东京用 v1、法兰克福用 v3 的分裂状态。
对应到 IaC 运维:CI 流水线里先运行 terraform plan 生成变更预览,像“试营业”一样告诉人们这次改动会创建什么、修改什么、删除什么;人工审批通过后,才执行 terraform apply 真正生效。模块要打语义化版本号(如 v1.2.0),模板用固定版本引用,杜绝“在我机器上是好的”这类事故。
工具链上,Atlantis 或 Terraform Cloud 可以做到“PR 驱动审批流”——代码提交后自动 plan,审批按钮亮起后由工具执行 apply;状态文件定期备份;成本效率方面,spot 实例与按需实例混部、设置自动缩容策略,并按可用性指标定期复盘,像“每季度核对一次各店坪效”。
1. T_up 可用时长:集群正常提供服务的小时数,是公式的分子。
2. T_down 不可用时长:故障或维护导致的不可用小时数,与可用时长相加为总时间。
3. A 可用性指标:最终计算出的百分比,目标是 99.9% 以上,作为运维复盘基准。
演练、审批、版本统一,让开分店变成可复制的流水线;跨云 GPU 集群的运维,也从“救火队”变成“标准化生产线”。
AI 应用场景
场景 1:跨云 AI 训练平台自动化交付
阶段:云基础设施交付(训练环境准备)
解决的问题:传统方式下,算法团队要在三个云控制台分别点击创建 VPC、实例、安全组,配置容易漂移,一套环境要等数周。采用 IaC 模板后,一套代码 + 适配层即可在半小时内交付三地同构的 GPU 训练环境,环境一致性由代码保证。
具体案例:某大模型创业公司在 AWS、Azure、GCP 上统一部署 8 卡 A100 训练集群,模板中声明 spec = "8xA100",适配层自动映射各云机型;所有资源打上 project=llm-lab、team=algorithm 标签,月底账单自动按团队分摊,训练环境从“申请-排队-搭建”变成“提交-自动交付”。
场景 2:推理集群跨云容灾与弹性扩容
阶段:推理服务部署与高可用运行
解决的问题:单一云厂商故障会导致线上推理中断。通过 IaC 模板把推理服务同时部署到两个云,配合跨云 VPN 与负载均衡,实现主备集群一键切换,故障时业务不中断。
具体案例:某智能客服 NLP 服务将推理集群部署在 AWS 与腾讯云,模板按 role=infer 标注资源,监控系统按标签聚合告警;高峰期通过弹性伸缩策略自动扩容 GPU 节点,闲时缩容,成本下降约 40%。
场景 3:多团队 GPU 成本归集与 FinOps 治理
阶段:资源成本管理与预算治理
解决的问题:多个算法团队共享 GPU 资源池,账单混在一起无法分账,预算超支找不到责任人。基于统一标签规范,资源自动归集到团队与成本中心,财务可按月输出分摊报表。
具体案例:某中型企业用模板强制注入 cost_center 标签并做白名单校验,接入云账单系统后,每个团队的 GPU 月成本一目了然;超出预算的团队在下次申请时收到自动提醒,治理效率大幅提升。
Python 演示
# -*- coding: utf-8 -*-# 演示: 跨云GPU模板的适配层 + 标签 + 成本估算from datetime import date INSTANCE_MAP = { "aws": {"8xA100": "p4d.24xlarge", "8xH100": "p5.48xlarge"}, "azure": {"8xA100": "Standard_ND96asr_v4", "8xH100": "Standard_ND96isr_H100_v5"}, "gcp": {"8xA100": "a2-highgpu-8g", "8xH100": "a3-highgpu-8g"},} PRICE_PER_HOUR = { ("aws", "8xA100"): 32.77, ("azure", "8xA100"): 31.50, ("gcp", "8xA100"): 29.84,} class GpuTemplate: def __init__(self, project, env, region, role): self._project = project self._env = env self._region = region self._role = role self._tags = {} def cluster_name(self): # 命名模板: project_env_region_role return "{}_{}_{}_{}".format(self._project, self._env, self._region, self._role) def build_tags(self, team, cost_center): self._tags = { "project": self._project, "env": self._env, "team": team, "cost_center": cost_center, "created": date.today().isoformat(), } return self._tags def map_instance(self, cloud, spec): # 适配层: 抽象规格 -> 各云具体机型 try: return INSTANCE_MAP[cloud][spec] except KeyError: raise ValueError("unsupported cloud or spec: {}/{}".format(cloud, spec)) def estimate_cost(self, cloud, spec, hours): # 成本公式: 单价 x 时长 price = PRICE_PER_HOUR[(cloud, spec)] return { "cloud": cloud, "instance": self.map_instance(cloud, spec), "hours": hours, "unit_price": price, "total": round(price * hours, 2), } def main(): tmpl = GpuTemplate("llm-lab", "prod", "ap-southeast-1", "train") print("cluster name:", tmpl.cluster_name()) print("tags:", tmpl.build_tags("algorithm", "CC-9001")) for cloud in ("aws", "azure", "gcp"): detail = tmpl.estimate_cost(cloud, "8xA100", 24) print("{} -> {} cost ${} for {}h".format( cloud, detail["instance"], detail["total"], detail["hours"])) if __name__ == "__main__": main()
return "{}_{}_{}_{}".format(...)实现命名模板project_env_region_role,与正文公式一一对应。self._tags = {...}统一注入标签规范,所有资源继承同一套键值对。INSTANCE_MAP[cloud][spec]适配层查表逻辑,把抽象规格翻译成各云具体机型。PRICE_PER_HOUR[(cloud, spec)]成本单价表,对应成本公式中的p_i。price * hours计算总成本,对应成本公式C = Σ p × t。if __name__ == "__main__":可执行入口,让脚本既能被导入也能直接运行。
常见误区
误区“Terraform 支持多个 provider,我直接把 `aws_instance` 写死不就行了?跨云无非就是把这套文件复制一份改成 azure 的写法。”
正解为每个云各维护一套完整模板,等于三本手册各写一遍,改一处要同步三处,迟早走向配置漂移。正确做法是抽象出能力规格(如 8xA100),由适配层映射到各云机型。就像开店手册写死“东芝咖啡机”,到德国就抓瞎;应该写“双锅炉意式咖啡机”,让供应商匹配表去翻译。
为何常见:云厂商的 GPU 机型命名差异巨大,初学者直接照搬控制台上的机型名最省事,却忽略了模板复用才是 IaC 的价值所在。
误区“state 文件不就是个记录吗?丢了就丢了,我重新跑一遍 plan 让它对照真实资源生成一份新的不就行了。”
正解没有 state 文件,Terraform 无法判断哪些资源是自己创建的。重新 plan 时它会把所有资源当作“不在管理范围”,要么全部重建(造成停机与数据丢失),要么报错拒绝操作。state 是账本,账本丢了,设备台账就没了。必须使用远程状态并开启状态锁,定期备份。
为何常见:单人本地练手时,删掉 state 重来看似没损失,让人误以为它只是可再生的缓存,忽略了它记录“所有权”的关键作用。
误区“标签就是个备注,不影响功能,我随手写几个 key 就行,反正资源能跑起来。”
正解标签直接影响成本归集、权限控制和自动化运维。拼写不一致(如 team 和 Team 并存)会让账单无法聚合,月底财务对账时就像“两个分店的标签格式不同,总部盘点全乱”。应该在模块入口统一注入标签,并对键值做白名单校验。
为何常见:标签确实不改变资源的核心功能,短期内看不到任何后果;等到账单爆炸或权限出问题时,才意识到规范的重要性。
误区“反正我的仓库是私有的,把 access key 写进 tfvars 文件里,团队拉下来就能用,多方便。”
正解仓库私有不等于安全:代码会被复制进 CI 日志、会同步到同事电脑、可能出现在截图或备份里。密钥必须通过环境变量或密钥管理服务注入,状态文件中的敏感字段也要加密存储。就像手册封面不会印保险柜密码一样,模板里永远不该出现明文密钥。
为何常见:本地开发图省事,且私有仓库让人产生“没人看得到”的错觉,忽略了密钥一旦外泄就可能被用于恶意创建高价 GPU 实例。
面试题
Q1. 基础设施即代码(IaC)的核心思想是?
- A.用声明式配置管理基础设施← 正确答案
- B.用鼠标点击网页按钮建资源
- C.用人工编写文档记录全部改动
- D.用电子邮件审批所有变更请求
答案:A。IaC 的核心是把基础设施描述成声明式代码,由工具自动执行创建与变更。B 是传统控制台操作,C 只是文档化而非自动化,D 与基础设施管理无关。就像开店手册不是用来“读”的,而是用来“照着执行”的。
Q2. Terraform 模板文件默认使用的配置语言是?
- A.Python 脚本语言
- B.HCL 声明式语言← 正确答案
- C.Shell 批处理命令
- D.Docker 容器指令
答案:B。Terraform 使用 HCL(HashiCorp Configuration Language)声明式描述资源。Python 是通用编程语言,Shell 是命令脚本,Dockerfile 是容器构建指令,都不负责声明云资源状态。
Q3. 跨云 GPU 模板中“8 卡 A100”这类抽象规格,由哪一层负责映射到具体云机型?
- A.网络配置层负责转换
- B.资源标签层负责转换
- C.多云适配层负责转换← 正确答案
- D.远程状态层负责转换
答案:C。多云适配层维护“规格到机型”的映射表,把抽象算力规格翻译成 AWS、Azure、GCP 各自的实例型号。网络层管 IP 与安全,标签层管归属,状态层管账本,都不涉及机型翻译。
Q4. 资源标签策略最主要的业务价值是?
- A.实现成本归集与团队权限联动← 正确答案
- B.提高 GPU 芯片的浮点运算速度
- C.自动加密所有云上静态数据
- D.缩短跨区域网络传输的延迟
答案:A。标签是资源的资产标识,让账单按团队与项目归集,也让权限策略按标签授权。它与 GPU 算力、数据加密、网络延迟都没有关系,那些由硬件和专门的服务负责。
Q5. Terraform 远程状态文件的主要作用是?
- A.保存 Terraform 模板的全部源码
- B.缓存云厂商镜像用于快速启动
- C.记录已管理资源与真实资源映射← 正确答案
- D.存储应用日志以便排查线上故障
答案:C。状态文件是“逻辑资源到真实资源”的映射账本,是 Terraform 判断创建、更新还是删除的依据。源码由 Git 管理,镜像由云厂商管理,日志由日志系统管理,都不是 state 的职责。
Q6. 多人同时执行 apply 修改同一套资源,避免状态冲突的机制是?
- A.状态锁机制防止并发写覆盖← 正确答案
- B.多点备份防止文件意外丢失
- C.自动重试直到操作成功
- D.双机热备保障服务不中断
答案:A。远程后端配合锁表实现状态锁,同一时刻只允许一个 apply 写入状态,防止账本被并发改乱。备份解决丢失问题,重试不解决并发冲突,热备针对的是服务可用性而非状态一致。
Q7. 关于 IaC 模板模块化设计,下列做法最合理的是?
- A.每个云单独维护一套完整模板
- B.通用子模块按功能拆分复用← 正确答案
- C.全部资源集中写在单个文件里
- D.用复制粘贴方式实现环境隔离
答案:B。按功能拆分通用子模块(如 network、gpu、tags)并复用,是 IaC 最佳实践。每个云各写一套会导致维护成本翻倍,单文件集中不利于复用,复制粘贴会造成环境漂移。
Q8. 跨云 GPU 集群的网络配置抽象通常包含哪些?
- A.VPC 与子网的统一规划← 正确答案
- B.安全组的访问控制规则← 正确答案
- C.跨云专线或 VPN 互联← 正确答案
- D.实例的价格竞价策略
答案:ABC。网络抽象解决“资源如何连通、谁可以访问谁”的问题,包括子网规划、安全组规则和跨云互联。价格竞价策略属于成本优化范畴,与网络配置无关。
Q9. IaC 模板研发上线的合理流程包含哪些?
- A.提交代码后先执行 plan 预览← 正确答案
- B.管理人员审批通过后再 apply← 正确答案
- C.模块版本用语义化标签管理← 正确答案
- D.跳过审批直接在生产生效
答案:ABC。plan 预览变更、审批后 apply、模块打版本号,是 IaC 的标准发布流程,相当于“试营业 + 区域经理签字”。跳过审批直接生产生效会增加变更事故风险,违背变更管理原则。
Q10. 关于跨云 GPU 集群的密钥安全管理,正确的做法有哪些?
- A.敏感信息存入远程状态需加密存储← 正确答案
- B.云凭据通过环境变量或密钥服务注入← 正确答案
- C.模板代码中严禁硬编码密钥明文← 正确答案
- D.生产与测试环境可共用同一套密钥
答案:ABC。状态文件含敏感属性必须加密,凭据应通过环境变量或密钥服务注入,代码中禁止硬编码密钥。生产与测试环境共用密钥违背最小权限原则,一旦测试环境被攻破,生产资源也会暴露。