我有2个terraform脚本:1.用于启动基础设施(VPC,安全组,MySQL,Redis,Cassandra)服务器,其次是启动应用程序(自动缩放组,负载平衡器,DNSlogging)。
我的问题是什么是pipe理这些configuration文件的最佳做法。 我希望这两个应用程序都在同一个AWS VPC(将从基础结构.tf文件创build)
编辑 :为了进一步明确我的观点,我有这样的设置关于Terraform:
我希望将所有* .tfconfiguration分两个阶段部署到同一个AWS VPC中:首先是infra .tf文件,然后是.tf
这种分层configuration对于Terraform来说是可能的,但是它需要一个中间存储来保存来自第一个configuration(基础结构,在你的情况下)的信息,所以在应用第二个configuration(应用)时可以检索到它。
最直接的方法就是使用Terraform内置的“远程状态”机制作为中间存储。 为此,首先在基础结构configuration中configuration远程后端(假定Terraform 0.9或更高版本)。 例如,使用Amazon S3进行存储:
terraform { backend "s3" { bucket = "example-state-bucket" key = "infrastructure.tfstate" region = "us-east-1" } }
每次后端configuration更改时,都需要运行terraform init
以将状态同步到新位置。
您希望暴露给应用程序configuration的任何信息都必须声明为基础结构configuration的“输出”:
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
数据源从应用程序configuration中读取这个值:
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}" }
在我的一系列关于Terraform环境+应用程序模式的文章中,可以看到这种模式的更精细的例子,使用Consul作为中间数据存储而不是Terraform远程状态。 原则上,Terraform可以写入和读取的任何数据存储都可用于将数据从一个configuration传递到另一个。