我有一个带有输出的模块,看起来像这样:
output "myvpc" { value = "${aws_vpc.myvpc.id}" }
我在另一个tf文件中调用该模块。
现在,我希望调用模块的tf文件具有我在模块中定义的输出。
但是我能够做到这一点的唯一方法是在调用tf文件中再次重新定义输出,如下所示:
output "myvpc" { value = "${module.myvpc.myvpc}" }
因此,现在我有了多余的配置行和另一层抽象层,可以做一些我希望在使用Terraform时必不可少的事情。
可以肯定我做错了,因为它感觉多余/错了。模块的全部目的是代码重用,但必须冗余地重新定义输出,甚至更糟的是,使用另一层抽象来屏蔽它们,因为这样会占用一些值。
答案 0 :(得分:1)
您正要遇到的行为正是预期的原因,因为模块抽象了实现的细节。
在编写模块时,您通过指定模型所需的变量(参数)来最小化接触面,但隐藏所有实现细节。相同的论点适用于输出。并不是从模块输出所有变量,而是仅公开语义上有用的值。
如果您可以接受上述行为为有效,那么将相同的逻辑应用于下一语义级别似乎也很直观。
如果您需要在抽象链中对值进行高层访问,则需要编写此“重复代码”。但是请注意,您可以根据语义需要重命名和更改值。