This configuration does not support Terraform version 0.11.11. To proceed, either choose another supported Terraform version or update the root module's version constraint. Version constraints are normally set for good reason, so updating the constraint may lead to other errors or unexpected behavior.
Для кода промышленного уровня рекомендую еще строже закреплять версию:
terraform {
# Требуем исключительно версию Terraform 0.12.0
required_version = "= 0.12.0"
}
Это вызвано тем, что даже переход на новые «заплаточные» версии (скажем, 0.12.0 —> 0.12.1) может создать проблемы. Иногда они содержат ошибки, а иногда у них ломается обратная совместимость (хотя в наши дни это случается реже). Но еще более серьезной проблемой является то, что файл состояния, измененный более новой версией Terraform, уже нельзя использовать в старых версиях. Представьте, к примеру, что весь ваш код развернут с помощью Terraform 0.12.0, и тут вдруг разработчик, у которого установлена версия 0.12.1, применяет к некоторым из ваших модулей команду terraformapply. В результате файлы состояния этих модулей больше не совместимы с 0.12.0, поэтому вы вынуждены обновить все свои компьютеры для разработки и CI-серверы на 0.12.1!
Ситуация, скорее всего, улучшится, когда Terraform достигнет версии 1.0.0 и начнет соблюдать обратную совместимость, но, пока этого не произошло, я советую привязываться к
Рекомендую также закреплять версии всех ваших провайдеров:
provider "aws" {
region = "us-east-2"
# Разрешаем использовать любую версию провайдера AWS вида 2.x
version = "~> 2.0"
}
Этот пример привязывает код провайдера AWS к версиям вида 2.x (синтаксис ~>2.0 эквивалентен >=2.0,<3.0). И снова, чтобы избежать случайного внесения обратно несовместимых изменений, необходимо закрепить мажорную версию. Закрепление конкретной версии зависит от провайдера. Предположим, провайдер AWS часто обновляется и имеет хорошую поддержку обратной совместимости, поэтому будет разумно закрепить только его мажорную версию и позволить автоматическое обновление заплаток, чтобы получить удобный доступ к новым возможностям. Однако все провайдеры разные, поэтому обращайте внимание на то, насколько хорошо они справляются с поддержкой обратной совместимости, и закрепляйте номера версий соответствующим образом.
Модули, готовые к повторному использованию
Следующим шагом после написания и тестирования модулей будет их выпуск. Как вы уже видели в разделе «Управление версиями» на с. 53, для этого подходят теги Git в сочетании с семантическим версионированием:
$ git tag -a "v0.0.5" -m "Create new hello-world-app module"
$ git push --follow-tags
Например, чтобы развернуть в тестовом окружении версию v0.0.5 вашего модуля hello-world-app, в файле live/stage/services/hello-world-app/main.tf следует прописать такой код:
provider "aws" {
region = "us-east-2"
# Разрешаем использовать любую версию провайдера AWS вида 2.x
version = "~> 2.0"
}
module "hello_world_app" {
# TODO: подставить сюда URL и версию вашего собственного модуля!!
source = "[email protected]:foo/modules.git//services/hello-world-app?ref=v0.0.5"
server_text = "New server text"
environment = "stage"
db_remote_state_bucket = "(YOUR_BUCKET_NAME)"
db_remote_state_key = "stage/data-stores/mysql/terraform.tfstate"
instance_type = "t2.micro"
min_size = 2
max_size = 2
enable_autoscaling = false
}
Далее укажем доменное имя ALB в виде выходного параметра в файле live/stage/services/hello-world-app/outputs.tf:
output "alb_dns_name" {
value = module.hello_world_app.alb_dns_name
description = "The domain name of the load balancer"
}
Теперь вы можете развернуть свой модуль с поддержкой версионирования, выполнив команды terraforminit и terraformapply:
$ terraform apply
(...)
Apply complete! Resources: 13 added, 0 changed, 0 destroyed.
Outputs:
alb_dns_name = hello-world-stage-477699288.us-east-2.elb.amazonaws.com
Если все работает хорошо, можете развернуть эту же версию (и, следовательно, этот же код) в других средах, включая промышленную. Если у вас когда-нибудь возникнет проблема, вы сможете откатиться назад, развернув более старую версию.
Еще одним способом выпуска модулей является их публикация в реестре Terraform. Публичный реестр модулей Terraform находится по адресу registry.terraform.io и содержит сотни универсальных, открытых и поддерживаемых сообществом модулей для AWS, Google Cloud, Azure и многих других провайдеров. Для публикации в нем своих модулей необходимо соблюсти несколько требований53.
• Модуль должен находиться в репозитории GitHub.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии