Хотя имя ресурса ("test"
в вашем примере) бесполезно в простой конфигурации с одним или двумя ресурсами, важной особенностью Terraform является использование атрибутов одного ресурса для заполнения другого.
Типичным примером этого в AWS является создание объектов VPC и подсетей:
variable "app_name" {}
variable "env_name" {}
resource "aws_vpc" "main" {
cidr_block = "10.1.0.0/16"
tags = {
Name = "${var.app_name}-${var.env_name}"
}
}
resource "aws_subnet" "a" {
vpc_id = "${aws_vpc.main.id}"
cidr_block = "${cidrsubnet(aws_vpc.main.cidr_block, 4, 1})"
availability_zone = "us-west-2a"
tags = {
Name = "${var.app_name}-${var.env_name}-usw2a"
}
}
resource "aws_subnet" "b" {
vpc_id = "${aws_vpc.main.id}"
cidr_block = "${cidrsubnet(aws_vpc.main.cidr_block, 4, 2})"
availability_zone = "us-west-2b"
tags = {
Name = "${var.app_name}-${var.env_name}-usw2b"
}
}
В этом примере имя "main"
ресурса "aws_vpc"
используется как часть ссылок из двух подсетей назад.к VPC.Это позволяет Terraform заполнять подсеть vpc_id
, даже если ее значение не будет известно до создания VPC.Это также позволяет избежать дублирования базового блока CIDR VPC в подсетях, вместо этого динамически вычисляя новый префикс подсети.
Обратите внимание, что имена ресурсов отличаются от тега Name
для каждого объекта, поскольку они имеют различную область видимости: имена ресурсов Terraform должны быть уникальными только в пределах одного модуля, и поэтому они обычно имеют короткие имена, которые просто различают любые ресурсы того же типа в этом одном модуле.Теги Name - и, для некоторых других типов ресурсов, уникальное имя ресурса - должны вместо этого быть уникальными либо во всем регионе AWS, либо, возможно, по всему разделу AWS (например, в случае S3).
Различное назначение этих специфичных для Terraform имен становится особенно важным для более сложных систем, в которых один и тот же модуль создается несколько раз в разных конфигурациях, таких как создание одинаковой инфраструктуры в разных средах.В этом случае специфичные для Terraform имена будут одинаковыми во всех случаях использования модуля - поскольку исходный код модуля идентичен - но они должны иметь разные имена в самом AWS, например, с учетом имени среды, к которой они принадлежат,Обычный способ добиться этого - добавить переменные в свои модули, чтобы указать подсистему и среду, а затем использовать ее для создания согласованной схемы именования объектов в AWS, тогда как сама Terraform просто использует свои локальные имена для ссылок в конфигурации.