113 lines
3.3 KiB
Terraform
113 lines
3.3 KiB
Terraform
variable "infra" {
|
|
type = object({
|
|
postgres = object({
|
|
image = string
|
|
admin_user = string
|
|
host = string
|
|
port = number
|
|
internal_host = string
|
|
internal_port = number
|
|
sslmode = string
|
|
})
|
|
pgadmin = object({
|
|
image = string
|
|
port = number
|
|
email = string
|
|
})
|
|
silo = object({
|
|
image = string
|
|
admin_user = string
|
|
host = string
|
|
port = number
|
|
console_port = number
|
|
internal_host = string
|
|
internal_port = number
|
|
state_bucket = string
|
|
backup_bucket = string
|
|
})
|
|
vault = object({
|
|
image = string
|
|
host = string
|
|
port = number
|
|
mount = string
|
|
database_mount = string
|
|
})
|
|
})
|
|
}
|
|
|
|
variable "buckets" {
|
|
type = map(object({
|
|
versioning = optional(bool, true)
|
|
noncurrent_days = optional(number, 30)
|
|
expire_days = optional(number)
|
|
}))
|
|
default = {}
|
|
|
|
validation {
|
|
condition = alltrue([
|
|
for name in keys(var.buckets) : can(regex("^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$", name))
|
|
])
|
|
error_message = "Имя бакета: 3–63 символа, строчные латинские буквы, цифры, точки и дефисы."
|
|
}
|
|
|
|
validation {
|
|
condition = contains(keys(var.buckets), var.infra.silo.backup_bucket)
|
|
error_message = "Бакет из infra.silo.backup_bucket должен быть описан в buckets."
|
|
}
|
|
|
|
validation {
|
|
condition = !contains(keys(var.buckets), var.infra.silo.state_bucket)
|
|
error_message = "Бакет из infra.silo.state_bucket создаётся отдельно, в buckets его описывать нельзя."
|
|
}
|
|
}
|
|
|
|
variable "databases" {
|
|
type = map(object({
|
|
pgvector = optional(bool, false)
|
|
}))
|
|
default = {}
|
|
|
|
validation {
|
|
condition = alltrue([
|
|
for name in keys(var.databases) : can(regex("^[a-z_][a-z0-9_]{0,55}$", name))
|
|
])
|
|
error_message = "Имя базы: до 56 символов, строчные латинские буквы, цифры и подчёркивания, не с цифры."
|
|
}
|
|
}
|
|
|
|
variable "services" {
|
|
type = map(object({
|
|
buckets = optional(map(string), {})
|
|
databases = optional(list(string), [])
|
|
}))
|
|
default = {}
|
|
|
|
validation {
|
|
condition = alltrue(flatten([
|
|
for svc in values(var.services) : [for bucket in keys(svc.buckets) : contains(keys(var.buckets), bucket)]
|
|
]))
|
|
error_message = "Сервис ссылается на бакет, которого нет в buckets."
|
|
}
|
|
|
|
validation {
|
|
condition = alltrue(flatten([
|
|
for svc in values(var.services) : [for access in values(svc.buckets) : contains(["rw", "ro"], access)]
|
|
]))
|
|
error_message = "Доступ к бакету: rw или ro."
|
|
}
|
|
|
|
validation {
|
|
condition = alltrue(flatten([
|
|
for svc in values(var.services) : [for db in svc.databases : contains(keys(var.databases), db)]
|
|
]))
|
|
error_message = "Сервис ссылается на базу, которой нет в databases."
|
|
}
|
|
|
|
validation {
|
|
condition = alltrue(flatten([
|
|
for name, svc in var.services : [for db in svc.databases : length("${name}-${db}") <= 63]
|
|
]))
|
|
error_message = "Имя роли <сервис>-<база> длиннее 63 символов."
|
|
}
|
|
}
|