Ресурсы часто зависят друг от друга. Например, для создания сервера нужно указать 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]
}
Самостоятельная работа
-
Добавьте еще один сервер для приложения.
-
Добавьте балансировщик нагрузки и свяжите его с созданными ранее серверами
-
Примените изменения в инфраструктуре и запушьте код на Github
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.