我不太确定您是否要求生产环境依赖于开发环境,但抛开细节不谈,在 Terraform 中创建资源之间和模块之间的顺序的惯用方法是使用引用表达式。
您没有说生产环境消耗了开发环境的哪个方面,但是为了举例,假设生产环境需要在开发环境中创建的 VPC 的 id。在这种情况下,开发模块会将该 VPC id 导出为输出值:
# (this goes within a file in your mymod/dev directory)
output "vpc_id" {
value = "${aws_vpc.example.id}"
}
那么你的生产模块反过来就会有一个输入变量来指定这个:
# (this goes within a file in your mymod2/prod directory)
variable "vpc_id" {
type = "string"
}
有了这些,你的父模块就可以在两者之间传递值来建立你正在寻找的依赖关系:
module "dev" {
source = "./mymod/dev"
}
module "prod" {
source = "./mymod2/prod"
vpc_id = "${module.dev.vpc_id}"
}
之所以有效,是因为它创建了以下依赖链:
module.prod's input variable vpc_id depends on
module.dev's output value vpc_id, which depends on
module.dev's aws_vpc.example resource
然后,您可以在生产模块中的任何位置使用var.vpc_id 来获取该 VPC id,这会在该依赖链中创建另一个链接,告诉 Terraform 它必须等到创建 VPC 才能采取任何依赖于 VPC 的操作存在。
请特别注意,参与依赖链的是单个变量和输出,而不是整个模块。这意味着,如果您在 prod 模块中有任何资源不需要需要 VPC 存在,那么 Terraform 可以立即开始创建它们,而无需等待开发模块首先完全完成,同时仍确保在采取任何确实需要的操作之前完成 VPC 创建。
在文档部分Module Composition 中有更多关于此模式的信息。它在编写时考虑了 Terraform v0.12 语法和功能,但如果您使用 v0.11 语法和功能来表达它,通用模式仍然适用于早期版本,就像我在上面的示例中所做的那样。