如何管理多个 repos 的 terraform

Cal*_*ack 6 terraform

我的项目有 2 个存储库。静态网站和服务器。我希望该网站由 cloudfront 和 s3 以及 elasticbeanstalk 上的服务器托管。我知道这些资源至少需要知道一个 route53 资源才能在相同的域名下才能使 cors 工作。其中包括 vpcs 和其他东西。

所以我的问题是如何使用多个 repos 管理 terraform。我想我可以有一个单独的基础设施回购,为所有回购构建。我也可以让它们分开并将 arns/names/ids 作为变量传递(烦人)。

fis*_*x01 5

您可以使用 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}"]
}
Run Code Online (Sandbox Code Playgroud)

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

更新

正如评论中提到的,terraform_remote_state这是一种跨多个状态共享显式发布的变量的简单方法。然而,它有两个问题:

  1. 代码组件之间的紧密耦合,即变量的生产者不能轻易改变。
  2. 它只能由 terraform 使用,即您无法轻松地在不同层之间共享这些变量。.tfstate如果没有一些额外的自定义插件/包装器,Ansible 等配置工具就无法本地使用。

推荐的 HashiCorp 方法是使用中央配置存储,例如 Consul。它还有更多好处:

  1. 消费者与变量生产者解耦。
  2. 显式发布变量(如 中terraform_remote_state)。
  3. 可以被其他工具使用。

更详细的解释可以在这里找到。