【发布时间】:2020-09-24 12:58:45
【问题描述】:
我有一个根 Terraform 模块,它声明了一个 VPC 模块和其他模块,例如要在 VPC 中启动的 EC2 实例。
在 EC2 模块中,我使用 aws_vpc 类型读取 VPC:
data "aws_vpc" "vpc" {
filter {
name = "tag:Name"
values = [var.name_tag]
}
}
现在,如果我独立声明模块,这可以正常工作。
但是当声明一个单独声明这些其他模块的根模块时,我得到了这个失败:
▶ terraform apply
module.cloudwatch.data.aws_ami.ami: Refreshing state...
module.backend.data.aws_vpc.vpc: Refreshing state...
module.backend.data.aws_ami.ami: Refreshing state...
Error: no matching VPC found
on .terraform/modules/backend/main.tf line 1, in data "aws_vpc" "vpc":
1: data "aws_vpc" "vpc" {
所以这里有一个鸡/蛋的问题。
我很困惑。这怎么可能奏效?如果一个根模块不能同时声明一个VPC,然后使用aws_vpc数据源将其读入其他模块,那么这些数据源有什么用呢?我会很感激关于这里的最佳实践的建议。我是否应该不使用aws_vpc,而是在其他地方读取 VPC ID 作为输出?
【问题讨论】:
-
data应该是backend模块的输入变量。将 VPC ID 指定为另一个模块的输出以输入到backend模块确实是非常实用的第二步。通常,data在根配置(例如检索跨帐户route53)或在您永远不会期望管理该资源的模块内部(例如aws_ami,因为您使用 Packer 进行管理)中最有帮助。
标签: terraform