问题描述
在使用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。
希望以上解决方案能够帮助你成功解决问题。在实际操作中,请根据你的具体情况进行调整和验证。