这是我的 Terraform Karpenter 模块:
module "karpenter" {
source = "terraform-aws-modules/eks/aws//modules/karpenter"
cluster_name = module.eks.cluster_name
node_iam_role_additional_policies = {
AmazonSSMManagedInstanceCore = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
}
您可以看到
source
在“aws”和“modules”之间有两个斜杠。我最初以为我犯了一个错误,但事实证明两条斜线效果很好。
文档也有两个斜杠。
如果我更新为一个斜杠并运行
terraform apply
,它实际上会抛出错误:
│ Error: Invalid module source address
│
│ on main.tf line 73, in module "karpenter":
│ 73: source = "terraform-aws-modules/eks/aws/modules/karpenter"
│
│ Terraform failed to determine your intended installation method for remote module package "terraform-aws-modules/eks/aws/modules/karpenter".
│
│ If you intended this as a path relative to the current module, use "./terraform-aws-modules/eks/aws/modules/karpenter" instead. The "./" prefix indicates that the address is a relative filesystem path.
╵
这是我运行
.terraform
后terraform init
的文件夹结构:
出于好奇,有人可以帮忙解释一下这条带有两个斜杠的路径在源代码中是如何工作的吗?谢谢!
在 Terraform 模块源路径中使用双斜杠 (
//
) 引用模块存储库中的子目录。让我尝试以最好的方式解释这一点。
Terraform 允许模块源地址采用不同的形式:
要指定 Terraform 注册表模块或 Git 存储库中的子目录,请在源路径中使用
//
:
source = "<module-source>//<subdirectory>"
您的情况:
source = "terraform-aws-modules/eks/aws//modules/karpenter"
terraform-aws-modules/eks/aws
指向 Terraform 注册表上的模块。//modules/karpenter
告诉 Terraform 使用该模块内的 karpenter
子目录。使用单斜杠 (
/
) 会导致错误:
source = "terraform-aws-modules/eks/aws/modules/karpenter"
出现此错误是因为 Terraform 将此解释为本地相对路径,而不是注册表模块中的子目录,从而导致模块源地址无效错误。
运行后
terraform init
,Terraform 将模块存储在:
.terraform/modules/
此目录反映了您的配置中指定的模块路径。
总而言之,使用
//
正确地将 Terraform 定向到远程模块存储库中的子目录,避免路径解释问题。有关更多详细信息,请查看有关包子目录中模块的 Terraform 文档。
希望这有帮助。