如何管理多个回购的terraform

时间:2018-01-09 11:05:04

标签: terraform

我的项目有2个回购。静态网站和服务器。我希望网站由cloudfront和s3以及elasticbeanstalk上的服务器托管。我知道这些资源需要知道一个route53资源,至少要在cors工作的同一域名下。其中包括vpcs和stuff。

所以我的问题是我如何管理多个回购的terraform。 我认为我可以拥有一个单独的基础设施仓库,可以为所有仓库建造。 我也可以将它们分开并传入arns / names / ids作为变量(烦人)。

2 个答案:

答案 0 :(得分:2)

您可以使用terraform remote_state。它允许您从另一个terraform状态文件中读取输出变量。

让我们假设您在s3上远程保存状态文件,并且您拥有website.tfstateserver.tfstate文件。您可以在hosted_zone_id中将route53区域的托管区域ID输出为website.tfstate,然后直接在服务器状态的terraform代码中引用该输出变量。

data "terraform_remote_state" "website" {
  backend = "s3"

  config {
    bucket = "<website_state_bucket>"
    region = "<website_bucket_region>"
    key = "website.tfstate"
  }
}

resource "aws_route53_record" "www" {
  zone_id = "${data.terraform_remote_state.website.hosted_zone_id}"
  name    = "www.example.com"
  type    = "A"
  ttl     = "300"
  records = ["${aws_eip.lb.public_ip}"]
}

请注意,您只能从远程状态读取输出变量。您无法直接访问资源,因为terraform将其他状态/模块视为黑盒子。

答案 1 :(得分:1)

我过去使用的一种方法是为所有基础设施提供一个回购。

另一种方法是使用2个单独的tf配置,每个配置使用remote state。 Config 1可以根据需要使用输出变量来存储任何arns / id。

然后,配置2可以remote_state data source查询相关的arns / ID。

E.g。

# Declare remote state
data "terraform_remote_state" "network" {
  backend = "s3"
  config {
    bucket = "my-terraform-state"
    key    = "network/terraform.tfstate"
    region = "us-east-1"
  }
}

然后,您可以使用标准插值语法来使用输出值 ${data.terraform_remote_state.network.some_id}