Terraform: инфраструктура на уровне кода | страница 22



эти файлы играют роль кода. Вот пример конфигурации Terraform:

resource "aws_instance" "example" {

  ami           = "ami-0c55b159cbfafe1f0"

  instance_type = "t2.micro"

}

resource "google_dns_record_set" "a" {

  name         = "demo.google-example.com"

  managed_zone = "example-zone"

  type         = "A"

  ttl          = 300

  rrdatas      = [aws_instance.example.public_ip]

}

Даже если вы никогда раньше не видели код Terraform, не должно быть особых проблем с тем, чтобы его понять. Этот фрагмент заставляет Terraform выполнить API-вызовы к двум провайдерам: к AWS, чтобы развернуть там сервер, и к Google Cloud, чтобы создать DNS-запись, которая указывает на IP-адрес сервера из AWS. Terraform позволяет использовать единый простой синтаксис (который вы изучите в главе 2) для развертывания взаимосвязанных ресурсов в нескольких разных облаках.

Вы можете описать всю свою инфраструктуру (серверы, базы данных, балансировщики нагрузки, топологию сети и т. д.) в конфигурационных файлах Terraform и сохранить их в системе управления версиями. Затем эту инфраструктуру можно будет развернуть с помощью определенных команд, таких как terraformapply. Утилита terraform проанализирует ваш код, преобразует его в последовательность API-вызовов к облачным провайдерам, которые в нем заданы, и выполнит эти API-вызовы от вашего имени максимально эффективным образом (рис. 1.6).

Рис. 1.6. Terraform — это утилита, которая преобразует содержимое ваших конфигурационных файлов в API-вызовы к облачным провайдерам

Если кто-то в вашей команде хочет изменить инфраструктуру, то вместо того, чтобы делать это вручную прямо на серверах, они редактируют конфигурационные файлы Terraform, проверяют их с помощью автоматических тестов и разбора кода, фиксируют обновленный код в системе управления версиями и затем выполняют коман­ду terraformapply, чтобы сделать необходимые для развертывания изменений API-вызовы.


Прозрачная переносимость между облачными провайдерами

Поскольку Terraform поддерживает множество разных облачных провайдеров, часто возникает вопрос: обеспечивает ли этот инструмент прозрачную переносимость между ними? Например, если вы использовали Terraform для описания кучи серверов, баз данных, балансировщиков нагрузки и другой инфраструктуры в AWS, можете ли вы несколькими щелчками кнопкой мыши развернуть все это в другом облаке, таком как Azure или Google Cloud?

На практике этот вопрос оказывается не совсем корректным. Вы не можете развернуть «идентичную инфраструктуру» в разных облаках, поскольку инфраструктура, предоставляемая облачными провайдерами, разнится! Серверы, балансировщики нагрузки и базы данных, предлагаемые в AWS, Azure и Google Cloud, сильно различаются с точки зрения возможностей, конфигурации, управления, безопасности, масштабируемости, доступности, наблюдаемости и т. д. Не существует простого и прозрачного способа преодолеть эти различия, особенно учитывая то, что некоторые функции одного облачного провайдера часто отсутствуют во всех остальных.