我有 2 个用于 Terraform 的脚本:
用于启动基础设施(VPC、安全组、MySQL、Redis、Cassandra)服务器。
用于启动应用程序(自动缩放组、负载均衡器、DNS 记录)。
我的问题是管理这些配置文件的最佳实践是什么。我希望两个应用程序都位于同一个 AWS VPC 中(将从基础架构.tf
文件创建)
编辑:为了进一步阐明我的观点,我对 Terraform 进行了以下设置:
- git repo 基础
- 基础设施
- vpc.tf
- git repo 应用程序
- 应用程序
- 负载均衡器.tf
我希望将所有*.tf
配置分两个阶段部署到同一个 AWS VPC 中:首先是基础 .tf 文件,然后是应用程序 .tf。
答案1
这种分层配置在 Terraform 中是可能的,但它需要一个中间存储来保留来自第一个配置(在您的情况下是基础设施)的信息,以便在应用第二个配置(应用程序)时可以检索它。
最直接的方法是使用 Terraform 内置的“远程状态”机制作为中间存储。为此,您首先需要在基础设施配置中配置远程后端(假设 Terraform 0.9 或更高版本)。例如,使用 Amazon S3 进行存储:
terraform {
backend "s3" {
bucket = "example-state-bucket"
key = "infrastructure.tfstate"
region = "us-east-1"
}
}
每次后端配置发生变化时,都需要运行terraform init
以将状态同步到新的位置。
您希望向应用程序配置公开的任何信息都必须声明为基础结构配置的“输出”:
output "aws_vpc_id" {
value = "${aws_vpc.example.id}"
}
output "aws_subnet_a_id" {
value = "${aws_subnet.a.id}"
}
output "aws_subnet_b_id" {
value = "${aws_subnet.b.id}"
}
添加新输出后,运行terraform apply
以确保其值被计算并写入状态。
最后,我们准备使用数据terraform_remote_state
源从应用程序配置中读取该值:
data "terraform_remote_state" "infrastructure" {
backend = "s3"
config {
# Config values should match that of the infrastructure backend settings
# as shown above.
bucket = "example-state-bucket"
key = "infrastructure.tfstate"
region = "us-east-1"
}
}
# For example, to create an EC2 instance in one of the subnets
resource "aws_instance" "example" {
# ...
subnet_id = "${data.terraform_remote_state.infrastructure.aws_subnet_a_id}"
}
在我的系列文章中可以看到这种模式的一个更详细的示例,使用 Consul 作为中间数据存储,而不是 Terraform 远程状态Terraform 环境+应用模式. 原则上,Terraform 可以写入和读取的任何数据存储都可以用于将数据从一种配置传递到另一种配置。