我在参考一个 Terraform 结构化项目时遇到了一些麻烦。 尝试在 EKS terraform 中使用两个子网 ID 的输出,但是当我尝试执行
terraform plan
或 terraform apply
时,我得到的结果是它将为我创建新的子网,但这不是真的,因为我已经在上一步中在 1-vpc/main.tf 中创建了一个
重要的是,我首先运行了
1-vpc
terraform,以便输出变量可用于 2-eks
目录的第二次运行。
文件夹结构:
terraform
└───1-vpc
│ │ main.tf
│ │ output.tf
└───2-eks
│ │ main.tf
│ │ output.tf
在 1-vpc output.tf 中我有以下内容:
output "subnet_a" {
description = "Subnet A block"
value = aws_subnet.subnet_a.id
}
output "subnet_b" {
description = "Subnet B block"
value = aws_subnet.subnet_b.id
}
以及我试图引用的 2-eks main.tf 文件:
module "vpc" {
source = "../1-vpc" # Source all the output variables
}
resource "aws_eks_cluster" "my_cluster" {
name = "my-cluster"
role_arn = aws_iam_role.eks_cluster_role.arn
vpc_config {
subnet_ids = [ module.vpc.subnet_a, module.vpc.subnet_b ]
}
我尝试遵循 terraform 的指南 https://developer.hashicorp.com/terraform/language/values/outputs#accessing-child-module-outputs 没有任何帮助。
我会这样做:
terraform
│ main.tf
│
└─── vpc
│ │ vpc.tf
│ │ output.tf
│
└─── eks
│ │ eks.tf
│ │ output.tf
│ │ variables.tf
然后
main.tf
会将它们放在一起
module "vpc" {
source = "./vpc"
}
module "eks" {
source = "./eks"
subnet_ids = [ module.vpc.subnet_a, module.vpc.subnet_b ]
}
就是这样,就像每个模块保持独立一样,代码的“入口”点位于父文件夹而不是模块内,我确信随着您的应用程序的增长,您将需要更多的模块,这样可以保持干净并且对于任何其他开发人员来说都很容易理解。
您可能没有注意到,eks 目录下有一个新的
variables.tf
,这是我们定义输入 subnet_ids
的地方,您可以在其中添加您可能需要的任何其他参数。
variable "subnet_ids" {
type = list(string)
}