Зарегистрируйтесь, чтобы продолжить обучение

Зависимости Terraform: Основы

Ресурсы часто зависят друг от друга. Например, для создания сервера нужно указать ssh-ключ, который добавляется как отдельный ресурс. Terraform позволяет не только описывать ресурсы, но и извлекать информацию о них, для использования в других ресурсах. Для доступа используется синтаксис <RESOURCE TYPE>.<NAME>.<ATTRIBUTE>.

// Ключ загружается на Digital Ocean
resource "digitalocean_ssh_key" "somename" {
  name       = "Hexlet Example"
  // Загрузка ключа из файловой системы
  public_key = file("files/somename.pub")
}

resource "digitalocean_ssh_key" "anothername" {
  name       = "Hexlet Example"
  public_key = file("files/anothername.pub")
}

resource "digitalocean_droplet" "web" {
  image    = "ubuntu-22-04-x64"
  name     = "web-1"
  region   = "nyc3"
  size     = "s-1vcpu-1gb"
  // Массив ключей
  ssh_keys = [
    digitalocean_ssh_key.somename.fingerprint,
    digitalocean_ssh_key.anothername.fingerprint
  ]
}

В примере выше используется атрибут fingerprint ресурса digitalocean_ssh_key. Этот атрибут не указан явно, Terraform его получает автоматически на основе значения атрибута public_key. Полный список атрибутов ресурса доступен в его документации.

Помимо аргументов указанных в конфигурации, ресурсы часто предоставляют атрибуты, значения которых известны только после создания ресурса, например, ip-адреса, внутренние идентификаторы, тому подобное. Например, для привязки домена в Digital Ocean к серверу, нужен ip-адрес этого сервера.

resource "digitalocean_droplet" "web1" {
  image    = "ubuntu-22-04-x64"
  name     = "web-1"
  region   = "nyc3"
  size     = "s-1vcpu-1gb"
}

resource "digitalocean_domain" "web1" {
  name       = "code-basics.com"
  ip_address = digitalocean_droplet.web1.ipv4_address
}

Порядок в котором задаются ресурсы зависящие друг от друга не важен. Terraform автоматически анализирует выражения используемые внутри блока каждого ресурса для поиска ссылок на другие объекты. Ссылки позволяют Terraform определить правильный порядок создания, обновления и удаления ресурсов.

В некоторых ситуациях Terraform не может определить правильный порядок зависимостей, так как он может быть неявным. Например, в ситуации, когда Terraform должен выполнить некоторые действия, которые сначала нужно разрешить выполнять через политики доступа. В таких ситуациях используется аргумент depends_on.

// Пример с AWS

resource "aws_s3_bucket" "example" {
  bucket = "hexlet-terraform-getting-started-guide"
  acl    = "private"
}

resource "aws_instance" "example" {
  ami           = "ami-2757f631"
  instance_type = "t2.micro"

  // Всегда массив
  depends_on = [aws_s3_bucket.example]
}

Самостоятельная работа

  1. Добавьте еще один сервер для приложения.

  2. Добавьте балансировщик нагрузки и свяжите его с созданными ранее серверами

  3. Примените изменения в инфраструктуре и запушьте код на Github


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу