terraform 变量内部变量

terraform 变量内部变量

我正在创建一个 vpc,然后创建子网、路由表和其他 vpc 组件,在许多资源中需要提供 vpc id,在下面的示例的 aws_subnet 资源中,我必须提供 vpc_id = "${aws_vpc.测试_vpc。ID}”

# Create vpc
resource "aws_vpc" "test_vpc" {
    cidr_block = "${var.vpc_cidr}"

    tags {
        Name = "test_vpc"
    }
}

# Create public subnets
resource "aws_subnet" "public" {
    vpc_id = "${aws_vpc.test_vpc.id}"
    ...
    ...     
    tags {
        Name = "subnet_1"
    }
}

如果要更改 vpc 资源名称,我必须在所有地方查找并替换 vpc_id,有没有更好的方法?我尝试在变量中使用变量,但没有效果。

# Create vpc
resource "aws_vpc" "${var.vpc_name}" {
    cidr_block = "${var.vpc_cidr}"

    tags {
        Name = "${var.vpc_name}"
    }
}

# Create public subnets
resource "aws_subnet" "public" {
    vpc_id = "${aws_vpc.${var.vpc_name}.id}"
    ...
    ...     
    tags {
        Name = "subnet_1"
    }
}

答案1

Terraform 不支持这种“动态插值”;预计在特定模块内图形是定义明确的,因为模块中的所有内容都在同一范围内,因此事物之间的关系不应该不断变化。

您并没有真正提到您在这里试图解决什么现实问题,但看起来您正在尝试推广子网创建,以便您可以将相同的配置用于不同 VPC 中的多个子网。在这种情况下,建议的模式是创建一个单独的模块对于子网部分,然后将 VPC ID 作为模块变量传入。子网模块可能如下所示:

variable "vpc_id" {
}

variable "name" {
}

resource "aws_subnet" "public" {
    vpc_id = "${var.vpc_id}"
    ...
    ...     
    tags {
        Name = "${var.name}"
    }
}

定义此模块后,您可以从另一个模块中多次实例化它:

resource "aws_vpc" "test_vpc" {
    cidr_block = "${var.test_vpc_cidr}"

    tags {
        Name = "test_vpc"
    }
}

resource "aws_vpc" "production_vpc" {
    cidr_block = "${var.production_vpc_cidr}"

    tags {
        Name = "production_vpc"
    }
}

module "test_subnet" {
    source = "./subnet" # specify where the subnet module can be found

    name = "test_subnet_1"
    vpc_id = "${aws_vpc.test_vpc.id}"
}

module "production_subnet" {
    source = "./subnet" # specify where the subnet module can be found

    name = "production_subnet_1"
    vpc_id = "${aws_vpc.production_vpc.id}"
}

此处子模块仅包含一个子网,因为这是您在示例中给出的。如果您有其他依赖于 VPC 的资源,则可以将它们全部组合到单个模块中,然后您就可以实现仅在一个位置更改 VPC 的目标:您只需在调用模块中更改模块参数的值,模块内变量的所有插值都将自动更新以进行下一次运行。

答案2

插值是现已推出. 以下文档:

resource "aws_instance" "web" {
  subnet = "${var.env == "production" ? var.prod_subnet : var.dev_subnet}"
}

相关内容