我有一个根 Terraform 模块,它声明了 VPC 模块和其他模块,例如要在 VPC 中启动的 EC2 实例。
在 EC2 模块中,我使用以下命令读取 VPCaws_vpc
type:
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 作为输出?
对我来说,这听起来像是您在声明两个资源,例如
resource "aws_vpc" "example" {}
和数据提供者一样
data "aws_vpc" "example" {}
为了从数据中访问某些内容,例如data.aws_vpc.example.arn
。这是不需要的,实际上会导致您的错误。如果两者处于相同的地形状态,您只需删除data "aws_vpc" "example" {}
并通过例如引用资源resource.aws_vpc.example.arn
.
实际上,仅当您引用在其他地方创建的资源(例如通过不同的配置引擎(或也通过 terraform,但在不同的层中)手动创建的资源)时,才需要数据提供程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)