我的项目有2个回购。静态网站和服务器。我希望网站由cloudfront和s3以及elasticbeanstalk上的服务器托管。我知道这些资源需要知道一个route53资源,至少要在cors工作的同一域名下。其中包括vpcs和stuff。
所以我的问题是我如何管理多个回购的terraform。 我认为我可以拥有一个单独的基础设施仓库,可以为所有仓库建造。 我也可以将它们分开并传入arns / names / ids作为变量(烦人)。
答案 0 :(得分:2)
您可以使用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}"]
}
请注意,您只能从远程状态读取输出变量。您无法直接访问资源,因为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}