Я работаю над обновлением версии terraform с 0.12 до 0.13. Пока что я могу создавать необходимые части, меняя провайдеров, а также свои модули.
Текущий статус service.tf
module "services" {
source = "../../modules/aws-ecs-servicev2"
for_each = var.applications
container_name = each.value.container_name
container_cpu = each.value.container_cpu
container_image = each.value.container_image
container_memory_total = each.value.container_memory_total
container_memory_reservation = each.value.container_memory_reservation
deployment_max_percent = each.value.deployment_max_percent
deployment_min_healthy = each.value.deployment_min_healthy
container_host_port = each.value.container_host_port
container_port = each.value.container_port
command = each.value.command
replica_count = each.value.replica_count
stage = each.value.stage
alb_enabled = each.value.alb_enabled
alb_subnets = module.vpc.public_subnets
alb_https_enabled = each.value.alb_https_enabled
alb_ssl_arn = each.value.alb_ssl_arn
health_check_path = each.value.health_check_path
internal_lb = each.value.health_check_path
vault_key = each.value.vault_key
vault_backend = each.value.vault_backend
cpu_based_autoscaling = each.value.cpu_based_autoscaling
target_cpu_value = each.value.target_cpu_value
max_capacity = each.value.max_capacity
min_capacity = each.value.min_capacity
scale_out_adjustment = each.value.scale_out_adjustment
scale_out_cooldown = each.value.scale_out_cooldown
scale_in_adjustment = each.value.scale_in_adjustment
scale_in_cooldown = each.value.scale_in_cooldown
disable_scale_in = each.value.disable_scale_in
ecs_arn = module.ecs.arn
namespace = var.namespace
sd_namespace_id = aws_service_discovery_private_dns_namespace.default.id
vpc_id = module.vpc.vpc_id
health_check_response = "200"
alb_sgs = [aws_security_group.ecs_sg.id]
}
и application.tf
variable "applications" {
description = "Map for the services to be deployed"
type = any
default = {
service-a = {
container_cpu = 512
container_image = service-a-image:latest
container_memory_total = 2048
container_memory_reservation = 1024
container_name = "service-a"
command = null
deployment_max_percent = 200
deployment_min_healthy = 50
container_host_port = [0]
container_port = [80]
replica_count = 1
stage = "dev"
health_check_path = null
internal_lb = false
vault_key = null
vault_backend = null
alb_enabled = false
alb_ssl_arn = null
alb_https_enabled = false
cpu_based_autoscaling = false
target_cpu_value = null
max_capacity = null
min_capacity = null
scale_out_adjustment = null
scale_out_cooldown = null
scale_in_adjustment = null
scale_in_cooldown = null
disable_scale_in = false
}
}
}
Чего я хочу добиться?
Можно ли каким-то образом передать значения по умолчанию нескольким переменным, таким как health_check_path= null
, чтобы мне не пришлось беспокоиться о том, что это не будет включено в службы, которым не требуются эти значения. Есть также некоторые службы, которые требуют таких значений, которые я затем предоставлю из тех же переменных. Пример
service-b = {
container_name = "service-b-container"
container_cpu = 1024
container_image = "service-b-image:latest"
container_memory_total = 1024
container_memory_reservation = 1024
deployment_max_percent = 200
deployment_min_healthy = 50
container_host_port = [0]
container_port = [80]
command = null
replica_count = 1
stage = "dev"
alb_enabled = true
alb_https_enabled = true
alb_ssl_arn = "ssl-arn"
health_check_response = 200
health_check_path = "/status"
internal_lb = false
vault_key = "servia-b"
vault_backend = "service"
cpu_based_autoscaling = true
target_cpu_value = 40
max_capacity = 8
min_capacity = 1
scale_out_adjustment = 2
scale_out_cooldown = 60
scale_in_adjustment = 1
scale_in_cooldown = 300
disable_scale_in = false
},
Я пытался использовать локальные или любые другие подобные переменные внутри раздела переменных, например, следующие
variable "cpu" {
type = number
default = 1024
description = "cpu to associate"
}
variable "applications" {
description = "Map for the services to be deployed"
type = any
default = {
service-b = {
container_name = "service-b-container"
container_cpu = var.cpu
container_image = "service-b-image:latest"
container_memory_total = 1024
container_memory_reservation = 1024
},
service-a = {
container_name = "service-a-container"
container_cpu = var.cpu
container_image = "service-b-image:latest"
container_memory_total = 1024
}
}
}
но оказывается terraform этого не позволяет. Чтобы уточнить это, позвольте мне добавить его журнал здесь
Error: Variables not allowed
on application.tf line 56, in variable "applications":
56: container_cpu = var.cpu
Variables may not be used here.
Если я попытаюсь не включать переменные, которые присутствуют в моем services.tf
, я получу следующую ошибку
Acquiring state lock. This may take a few moments...
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_exec[0]: Refreshing state...
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_service_policy[0]: Refreshing state...
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_task_exec[0]: Refreshing state...
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_task[0]: Refreshing state...
module.services["service-a"].module.ecs_alb_service_task.data.aws_iam_policy_document.ecs_service[0]: Refreshing state...
module.vpc.aws_vpc.this[0]: Refreshing state... [id=vpc-0641c1d3435df195a]
aws_service_discovery_private_dns_namespace.default: Refreshing state... [id=ns-vyggm2ltoxjufhfa]
Error: Unsupported attribute
on Service.tf line 22, in module "services":
22: alb_enabled = each.value.alb_enabled
|----------------
| each.value is object with 12 attributes
This object does not have an attribute named "alb_enabled".
Error: Unsupported attribute
on Service.tf line 25, in module "services":
25: alb_https_enabled = each.value.alb_https_enabled
|----------------
| each.value is object with 12 attributes
This object does not have an attribute named "alb_https_enabled".
В любом случае, я могу добиться этого, поскольку существует более 10 сервисов, которые необходимо развернуть таким образом, а также некоторым сервисам не хватает переменной, а другим требуется.
Позвольте мне обновить мой вопрос @Marcin
@Marcin, пожалуйста, проверьте обновленный вопрос.
Вариант 1. Судя по документации, это может помочь - объявить какой-то особый тип объекта и там выставить значения по умолчанию: https://www.terraform.io/docs/configuration/variables.html#declaring-an-input-variable
Вариант 2. Также может помочь (не пробовал) - использование поиска со значением по умолчанию https://www.terraform.io/docs/configuration/functions/lookup.html
Простой пример для варианта 2:
дочерний модуль:
main.tf
resource "local_file" "simple_file" {
filename = "file/${var.file_name}"
content = "foo!"
}
переменные.tf
variable "file_name" {
description = "file name"
}
корневой модуль: main.tf
module "file" {
source = "./child_module"
for_each = var.applications
file_name = lookup(each.value, "Not_existing_key", "default_value" )
}
default_value используется в этом случае в дочернем модуле
версия для терраформирования 0.14.3
«терраформ этого не позволяет». не очень конкретно. Вы получаете сообщение об ошибке? Где именно не получается?