首页 > 解决方案 > 在根模块中使用 aws_vpc 数据源的 Terraform 鸡/蛋问题

问题描述

我有一个根 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_vpcVPC ID 作为其他地方的输出读入?

标签: terraform

解决方案


对我来说,这听起来像是你在声明一个资源,比如

resource "aws_vpc" "example" {}

和数据提供者,如

data "aws_vpc" "example" {}

为了从数据中访问一些东西,比如data.aws_vpc.example.arn. 这不是必需的,实际上是导致您的错误。如果两者都处于相同的 terraform 状态,您可以简单地删除data "aws_vpc" "example" {}并通过 eg 引用资源resource.aws_vpc.example.arn

数据提供者实际上仅在您指的是在其他地方创建的资源时才需要,例如手动创建的资源,由不同的供应引擎(或也由 terraform,但在不同的层)。


推荐阅读