Согласно моему комментарию, я думаю, что что-то можно сделать, используя data template_file
с определением задачи ECS внутри файла шаблона. Пример файла шаблона задачи ECS:
[
{
"name": "${service_name}",
"image": "${service_image}",
"essential": true,
"portMappings": [
{
"containerPort": ${service_port}
}
],
"secrets": [
${service_secrets}
],
"dockerLabels": {
"traefik.port" : "${service_port}",
"traefik.enable" : "true",
"traefik.frontend.rule": "Host:${service_hosts}",
"traefik.frontend.passHostHeader": "true",
"traefik.frontend.headers.SSLRedirect": "true",
"traefik.frontend.headers.SSLProxyHeaders": "X-Forwarded-Proto: https"
},
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "${service_awslogs}",
"awslogs-region": "${cluster_region}",
"awslogs-stream-prefix": "ecs"
}
}
}
]
Каждая переменная, начинающаяся с ${service_*}
, будет заполнена следующим образом:
data "template_file" "app-task-definition" {
template = file("task-definitions/app.json.tpl")
vars = {
cluster_region = var.cluster_region
service_name = var.application.name
service_port = var.application.port
service_image = var.app_image
service_hosts = join(", ", var.app_traefik_hosts)
service_cluster = var.cluster_name
service_secrets = join(", ", module.app-secrets.rendered)
service_awslogs = var.aws_ssm_prefix
}
}
Я думаю, вы также можете определить местоположение для YML-файл, который вы хотите передать как часть определения задачи. И последнее, но не менее важное: затем вы должны использовать ресурс данных в качестве входных данных для определений контейнеров:
container_definitions = data.template_file.app-task-definition.rendered
Для передачи секретов определен настраиваемый модуль, который позже используется для передачи и хранения значений в SSM. :
variable "aws_ssm_parameter_list" {
type = list
}
variable "service_prefix" {
type = string
}
data "template_file" "service_secrets" {
count = length(var.aws_ssm_parameter_list)
template = <<EOF
{
"name": "$${secret_name}",
"valueFrom": "$${secret_path}"
}
EOF
vars = {
secret_name = var.aws_ssm_parameter_list[count.index].name
secret_path = "${var.service_prefix}/${var.aws_ssm_parameter_list[count.index].name}"
}
}
output "rendered" {
value = data.template_file.service_secrets.*.rendered
}