Почему я должен указывать два значения при определении ресурса aws? - PullRequest
0 голосов
/ 13 декабря 2018

Я не знаю, почему я должен указывать два значения при идентификации ресурса AWS в terraform.Например,

resource "aws_instance" "test"

Я понимаю, что "aws_instance" - это тип ресурса, но как насчет другого?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Второй параметр, который вы указываете, - это «ИМЯ» ресурса, который вы создали.Параметр «NAME» должен быть установлен.Вы можете увидеть его важность, используя выходные данные ресурса, которые дают входные данные для создания другого ресурса.

0 голосов
/ 13 декабря 2018

Хотя имя ресурса ("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 просто использует свои локальные имена для ссылок в конфигурации.

0 голосов
/ 13 декабря 2018

Я не эксперт по terraform, но мое понимание второго значения - это «логический идентификатор» экземпляра, очень похожий на Cloudformation, т.е. это то, на что он будет ссылаться внутри terraform.Это означает, что если вы создаете этот экземпляр, а затем хотите экспортировать его IP-адрес в другое место, вы можете получить доступ к свойствам ресурса через второе значение, например:

"${aws_instance.test.private_ip}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...