问题描述
在使用Terraform时,面临一个需求:希望能够将生产和开发工作区的状态分别存储在不同的位置,避免在生产环境上运行可能影响生产的命令。这个问题的背景基于《Terraform: Up & Running, 2nd Edition》一书中所描述的一种“缺点”(drawback)(参考第93页):
所有工作区的状态文件都存储在同一个后端(例如,同一个S3存储桶)中。这意味着你需要为所有工作区使用相同的身份验证和访问控制,这也是工作区作为隔离环境的机制(例如,将分段环境与生产环境隔离开来)不太合适的一个主要原因。
用户想知道是否有工具可以解决这个问题,是否有办法将不同工作区的状态存储在不同的S3存储桶中,或者是否唯一的选择是完全放弃使用Terraform工作区。
解决方案
请注意以下操作可能涉及版本差异或风险,确保做好备份。
方案1
Terraform支持将工作区状态存储在不同的S3存储桶中,你可以通过在Terraform初始化时动态传入后端设置来实现。下面是如何在Terraform初始化时传入这些设置的步骤:
- 创建一个centralized pipeline template(集中式流水线模板),以确保开发人员可以自动处理这些设置,使其正确地传递到指定位置。
- 在Terraform初始化(terraform init)时,传入后端设置。你可以使用命令行中的键值对方式进行传参,具体的传参方式可以参考Terraform文档中的相关介绍:https://www.terraform.io/language/settings/backends/configuration#command-line-key-value-pairs
这个方案可以实现将每个工作区的状态存储在不同的S3存储桶中,同时可以保持适当的访问控制,从而确保生产和开发环境的隔离。
方案2
可以考虑将每个工作区的状态存储在各自的子目录中,但要注意这种方法可能带来一些管理复杂性。
除了在不同的S3存储桶中存储状态外,你还可以考虑将每个工作区的状态存储在各自的子目录中。这种方法可能会在S3存储桶中为每个工作区创建一个子目录(例如,env:/stage
和env:/prod
),这样能够一定程度上保持状态的分离。但需要注意,这种方法可能会增加一些管理复杂性,需要确保各个工作区之间的状态不会相互干扰。
以上两种方案可以根据你的实际需求来选择,根据你的安全要求和管理复杂性来决定如何管理Terraform工作区的状态存储。如果你有更多问题,欢迎继续提问。