什么是资源栈
当一套基础设施包含多个相互依赖的组件,并需要在开发、测试、生产等环境中重复部署时,逐环境维护独立代码容易产生配置差异。资源栈通过统一的组件定义和部署配置管理基础设施,使多个部署实例共享同一套组件结构,同时分别维护参数和状态。
使用场景
资源栈适用于以下场景:
多环境管理:将同一套VPC、ECS、RDS等基础设施部署到开发、测试和生产环境,并为各环境配置不同的地域、规格和网段。
多地域部署:为每个地域定义独立的部署实例,并传入对应的地域参数。
分层架构协作:网络、应用等基础设施由不同团队分别管理,并通过资源栈输出传递VPC ID等数据。
敏感变更审批:根据组件的新增、修改和删除情况设置自动执行条件。不满足条件的变更等待人工确认。
工作原理
资源栈通过以下两份YAML配置文件分离基础设施定义和部署参数:
组件配置(Component,
tfcomponent.yaml):定义基础设施组件、组件依赖、Provider、输入变量和输出值。部署配置(Deployment,
tfdeploy.yaml):定义一个或多个部署实例,并为每个实例配置地域、规格、网段等参数。
执行资源栈时,每个部署实例分别执行Terraform Plan并维护独立状态。系统根据审批配置决定自动执行Apply或等待人工确认。在单个部署实例内,Terraform根据组件间的引用和依赖关系处理资源。
功能特性
资源栈提供以下功能:
组件化管理:将网络、数据库、应用服务等基础设施拆分为独立组件,并通过输入和输出建立依赖关系。
多环境部署:通过多个部署实例复用同一套组件配置,并为不同环境配置独立参数和状态。
组件循环创建:根据集合为同一组件创建多个实例,适用于需要重复创建同类基础设施的场景。
条件审批:根据Terraform Plan的变更内容判断是否自动执行Apply。条件不成立时,本次部署等待人工确认。
跨资源栈协作:上游资源栈发布输出,下游资源栈引用这些输出。上游输出变化后,系统会触发存在消费关系的下游资源栈执行Plan。
说明跨账号引用资源栈输出前,由上游资源栈所属账号按照创建和管理资源栈中的“授权其他账号引用资源栈输出”完成账户授权。
参数集引用:引用参数集中管理的应用密码、Token等参数,避免将敏感值直接写入代码。
局部变量:集中定义重复使用的值,减少同一配置在多处重复书写。
不要在参数集中长期保存AccessKey。Terraform访问阿里云资源时,优先使用资源栈RAM角色。
与任务的区别
资源栈和任务的主要区别如下:
对比维度 | 资源栈 | 任务 |
适用场景 | 多组件或多环境的基础设施部署 | 一份模板版本和一组部署参数 |
配置方式 | 使用组件配置和部署配置两份文件 | 通过任务配置选择模板版本并设置参数 |
多环境管理 | 在同一资源栈中定义多个部署实例 | 为不同环境分别创建任务 |
组件编排 | 管理多个组件及其依赖关系 | 不提供资源栈级的多组件依赖编排 |
状态管理 | 每个部署实例维护独立状态,并在资源栈中统一查看 | 每个任务维护独立状态 |
数据协作 | 支持资源栈之间发布和引用输出 | 不提供资源栈级的输出消费关系 |
如果只需使用一份模板和一组参数部署基础设施,使用任务。如果需要管理多个关联组件,或将同一套组件结构部署到多个环境,使用资源栈。