我的项目有 2 个存储库。静态网站和服务器。我希望该网站由 cloudfront 和 s3 以及 elasticbeanstalk 上的服务器托管。我知道这些资源至少需要知道一个 route53 资源才能在相同的域名下才能使 cors 工作。其中包括 vpcs 和其他东西。
所以我的问题是如何使用多个 repos 管理 terraform。我想我可以有一个单独的基础设施回购,为所有回购构建。我也可以让它们分开并将 arns/names/ids 作为变量传递(烦人)。
您可以使用 terraform remote_state来实现此目的。它允许您从另一个 terraform 状态文件读取输出变量。
假设您将状态文件远程保存在 s3 上,并且您拥有website.tfstate和server.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这是一种跨多个状态共享显式发布的变量的简单方法。然而,它有两个问题:
.tfstate如果没有一些额外的自定义插件/包装器,Ansible 等配置工具就无法本地使用。推荐的 HashiCorp 方法是使用中央配置存储,例如 Consul。它还有更多好处:
terraform_remote_state)。更详细的解释可以在这里找到。
| 归档时间: |
|
| 查看次数: |
3361 次 |
| 最近记录: |