Расширение принятого ответа, чтобы показать, как также устранить дублирование, вызванное определенными переменными в блоке template_file
vars (которые не изменяются и, следовательно, должны дублироваться между вызовами модуля).Это также не решение - просто встроить эти переменные или использовать значения по умолчанию, потому что они по-прежнему будут меняться между проектами, а не внутри служб одного и того же проекта.Мы можем использовать локальные переменные для установки значений по умолчанию и переопределения значений по умолчанию с помощью функции слияния:
main.tf
locals {
task_variables = {
image = "..."
# lots of other variables
command = "[\"nginx\", \"-g\", \"daemon off; error_log /dev/stdout info;\"]"
}
}
# first invocation of the module, overriding the command
module "sidekiq" {
source = "ecs_service"
...
task_variables = "${merge(
local.task_variables,
map(
"command", "[\"bash\", \"-c\", \"exec bundle exec sidekiq\"]",
)
)}"
}
# second invocation of the module, no overrides
module "web" {
source = "ecs_service"
task_variables = "${local.task_variables}"
}
Модуль ecs_service
variable "task_variables" {
type = "map"
}
data "template_file" "web_task" {
template = "${file("${path.module}/tasks/task_definition.json")}"
vars = "${var.task_variables}"
}
resource "aws_ecs_task_definition" "web" {
container_definitions = "${data.template_file.web_task.rendered}"
...
}
data "aws_ecs_task_definition" "web" {
task_definition = "${aws_ecs_task_definition.web.family}"
...
}
resource "aws_ecs_service" "web" {
task_definition = "${aws_ecs_task_definition.web.family}:${max("${aws_ecs_task_definition.web.revision}", "${data.aws_ecs_task_definition.web.revision}")}"
...
}