如何在Terraform模块中获取VPC ID

109次阅读
没有评论

问题描述

在使用Terraform构建基础设施时遇到了一个问题。他的模块结构如下所示:

module "vpc" {
  source = "./modules/vpc"
}

module "prod_subnets" {
  source = "./modules/vpc/modules/subnets/production"
}

在运行时,他遇到了一个错误,错误信息如下:

[0m on modules/vpc/modules/subnets/production/production.tf line     162, in resource "aws_subnet" "prod-pub-1b":
14:22:55 162: vpc_id = [4maws_vpc.production_vpc[0m.id
14:22:55 [0m    14:22:55 A managed resource "aws_vpc" "production_vpc" has not been declared in
14:22:55 prod_subnets.

他希望知道如何解决这个问题。

解决方案

请注意以下操作可能会因版本差异而有所不同。

为了解决这个问题,我们需要确保子模块(prod_subnets)能够访问到父模块(vpc)中声明的VPC ID。为此,我们可以使用Terraform的输出(output)和输入变量(input variable)功能。

以下是解决方案的步骤:

步骤1:在父模块中声明输出

在父模块(vpc)中,我们需要将VPC ID声明为输出值,以便子模块可以访问。在文件 modules/vpc/outputs.tf 中,添加以下内容:

output "vpc_id" {
  value = aws_vpc.production_vpc.id
}

步骤2:在子模块中声明输入变量

在子模块(prod_subnets)中,我们需要声明一个输入变量,用于接收VPC ID。在文件 modules/vpc/modules/subnets/production/variables.tf 中,添加以下内容:

variable "vpc_id" {
  type = string
}

步骤3:在子模块中使用输入变量

在子模块的资源配置文件(modules/vpc/modules/subnets/production/production.tf)中,将原来的 vpc_id 参数改为使用输入变量:

resource "aws_subnet" "prod-pub-1b" {
  # 其他配置...
  vpc_id = var.vpc_id
}

步骤4:在主配置文件中传递值

在你的主配置文件中,即包含上述模块引用的文件中,将父模块的输出值传递给子模块的输入变量。例如,假设主配置文件为 main.tf

module "vpc" {
  source = "./modules/vpc"
}

module "prod_subnets" {
  source = "./modules/vpc/modules/subnets/production"
  vpc_id = module.vpc.vpc_id
}

在上述示例中,module.vpc.vpc_id 表示从父模块的输出值中获取 VPC ID。

通过以上步骤,你就能够在子模块中正确地访问父模块中的VPC ID,从而解决了你遇到的问题。

注意:以上解决方案适用于较新版本的Terraform。如果你使用的是旧版本,可能需要做一些调整。

补充说明

另外,有一位用户提供了另一种解决方案,他建议在父模块中的输出声明中,将 value 改为 aws_vpc.production_vpc.id,即:

output "vpc_id" {
  value = aws_vpc.production_vpc.id
}

这样可以确保正确获取VPC ID。

希望以上解决方案能够帮助你成功解决问题。在实际操作中,请根据你的具体情况进行调整和验证。

正文完