【问题标题】:Terraform chicken/egg problem using aws_vpc data source in root module在根模块中使用 aws_vpc 数据源的 Terraform 鸡/蛋问题
【发布时间】: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


【解决方案1】:

您没有非常具体地提及您的查询。 据我从您的问题中了解到,您已经在根模块中声明了 VPC,并希望从中使用它的 id 或 arn 等,对吗? 因此,在这种情况下,您必须以 (.) 格式指定 vpc 模块的完美路径(例如 module.root.aws_vpc.vpc_name.id),您也可以使用 depends_on = [your vpc ] 在您的数据资源声明中。

注意:我在这里不需要声誉来向您推荐这些东西,就像在 cmets 中一样,我在这里回答您作为答案也可能会失去我的声誉。

请求:请在此处提及更多详细信息,并粘贴您的模块树结构以便更好地理解。

你可以参考这个链接:https://www.terraform.io/docs/providers/aws/d/vpc.html

【讨论】:

    【解决方案2】:

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

    resource "aws_vpc" "example" {}
    

    与数据提供者类似

    data "aws_vpc" "example" {}
    

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

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

    【讨论】:

    • 是的,但是我正在尝试创建可组合的模块,并且模块 A 不需要进入或知道模块 B 的内部。从模块 B 的角度来看,它可以假设 VPC 存在。模块 A 的工作是实际创建该 VPC。但我怀疑你是对的。
    • 在这种情况下,我建议向您的模块 B 添加一个参数,例如你的vpc的arn。通常最好不要在模块中引用 terraform 状态,而是使用参数来提供此类信息。
    • 是的,这是有道理的。谢谢。
    • Terraform 的“模块组合”指南terraform.io/docs/modules/composition.html#dependency-inversion的“依赖倒置”部分中提供了有关该方法的更多信息@
    猜你喜欢
    • 2021-09-15
    • 2021-10-01
    • 2011-08-29
    • 2017-05-29
    • 2011-07-08
    • 2010-10-21
    • 1970-01-01
    • 2020-05-18
    • 2023-03-22
    相关资源
    最近更新 更多