terraform – join基础设施和应用程序configuration

我有2个terraform脚本:1.用于启动基础设施(VPC,安全组,MySQL,Redis,Cassandra)服务器,其次是启动应用程序(自动缩放组,负载平衡器,DNSlogging)。

我的问题是什么是pipe理这些configuration文件的最佳做法。 我希望这两个应用程序都在同一个AWS VPC(将从基础结构.tf文件创build)

编辑 :为了进一步明确我的观点,我有这样的设置关于Terraform:

  • git回购下
    • infra.tf
    • vpc.tf
  • git回购申请
    • app.tf
    • load_balancers.tf

我希望将所有* .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传递到另一个。