引用同一模块中的字段



假设我有一个这样的模块块:

resource "aws_instance" "server" {
ami           = "ami-a1b2c3d4"
instance_type = "t2.micro"
subnet_id     = var.subnet_ids
tags = {
Name = format("ami:%s", ami) # << **How to do this?**
}
}

我必须使用一个模块字段,如本例中的ami,作为另一个字段的值?有没有办法我能做到这一点。

上面是一个例子,实际上,我正在使用自定义模块,一个值被多次使用,所以我发现在多个地方写/更改同一个东西是无效的。我还希望避免创建单独的外部变量。

有没有一种方法可以通过对同一模块中的字段进行某种内部引用来实现上述目的?

使用变量重用同一模块中的值。如果要访问其他modulesresourcesLets,请使用data属性。

示例:从使用模块开始:

module "dev-server" {
source      = "./modules/server"
ami         = var.dev_ami_name
instance_id = var.instance_id
}

另外,添加一个模块var文件,其中包含您正在传递的正确变量。然后你的模块:

resource "aws_instance" "server" {
ami           = var.ami
instance_type = var.instance_id
tags = {
Name = format("ami:%s", var.ami) # << **How to do this?**
}
}

对此的一般答案是将公共值分解为一个单独的命名值,您可以在其他地方引用该值。

54m的答案显示了一种使用输入变量来实现这一点的方法。如果该值应由模块的用户选择,那么这是一个不错的选择。如果取而代之的是一些有意义的东西;硬编码";,但仍在多个位置使用,则可以使用本地值:

locals {
ami_id = "ami-a1b2c3d4"
}
resource "aws_instance" "server" {
ami           = local.ami
instance_type = "t2.micro"
subnet_id     = var.subnet_ids
tags = {
Name = format("ami:%s", local.ami)
}
}

本地值对于定义它的模块是私有的,因此这根本不会更改模块的公共接口。特别是,该模块的用户不可能像以前一样更改AMI ID。

如果您有通用编程语言的经验,那么将输入变量视为类似于函数参数可能会有所帮助,而局部值则有点类似于函数中的局部变量。在这个类比中,模块本身与函数相对应。

最新更新