首页 > 解决方案 > 在另一个模块或资源中使用输出

问题描述

我已经看到很多关于将模块的输出传递到另一个模块的帖子。出于某种原因,我无法让它工作。

我可以毫无问题地获得模块的输出

$ terraform output
this_sg_id = sg-xxxxxxxxxxxxxxxxx

但是,当我调用资源中的模块或另一个模块时,它会要求我提供安全组 ID。

$ terraform plan
var.vpc_security_group_ids
  Security Group ID
  Enter a value:

这是我的文件结构:

 ── dev
│     └── service
│       └── dev_instance
│           ├── main.tf
│           ├── outputs.tf
│           ├── variables.tf
├── modules
│       ├── ec2
│       │   ├── build_ec2.tf
│       │   ├── outputs.tf
│       │   └── variables.tf
│       └── sg
│           ├── build_sg.tf
│           ├── outputs.tf
│           └── variables.tf

不确定这是否正确,但在 dev/service/dev_instance/main.tf 中:

module "build_sg" {
source         = "../../../modules/sg/"
vpc_id         = var.vpc_id
sg_name        = var.sg_name
sg_description = var.sg_description
sg_tag         = var.sg_tag
sg_tcp_ports   = var.sg_tcp_ports
sg_tcp_cidrs   = var.sg_tcp_cidrs
sg_udp_ports   = var.sg_udp_ports
sg_udp_cidrs   = var.sg_udp_cidrs
sg_all_ports   = var.sg_all_ports
sg_all_cidrs   = var.sg_all_cidrs
}

module "build_ec2" {
source                         = "../../../modules/ec2/"
vpc_security_group_ids     = ["${module.build_sg.this_sg_id}"]
}

在 dev/service/dev_instance/output.tf 中:

output "this_sg_id" {
description = "The security group ID"
value       = "${module.build_sg.this_sg_id}"
}

我的 ec2 模块 build_ec2.tf 文件具有以下内容:

resource "aws_instance" "ec2" {
vpc_security_group_ids = ["${module.build_sg.this_sg_id}"]
}

标签: terraform

解决方案


你有一个var "vpc_security_group_ids"定义的地方,我假设在你的一个variables.tf文件中。Terraform 不会自动知道用模块的输出填充它。您需要删除var定义并仅在模板中使用模块输出引用。

变量用于从命令行传入值。它们不以任何方式绑定到模块输出。如果您希望值来自您正在使用的模块,那么您不应该将该值也定义为变量。


推荐阅读