Как использовать значения aws secret manager базы данных postgres в постановке задачи terraform ecs

У меня есть файл settings.py ниже приложения django с использованием terraform , docker compose и я пытаюсь получить значение базы данных, хранящееся в aws secret manager в определении задачи ecs

settings.py

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql_psycopg2",
        "NAME": os.environ.get("POSTGRES_DB"),
        "USER": os.environ.get("POSTGRES_USER"),
        "PASSWORD": os.environ.get("POSTGRES_PASSWORD"),
        "HOST": os.environ.get("POSTGRES_HOST"),
        "PORT": 5432,
    }
}

определение задачи

resource "aws_ecs_task_definition" "ecs_task_definition" {
  family                   = "ecs_container"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = 256                      
  memory                   = 512
  execution_role_arn       = data.aws_iam_role.fargate.arn
  task_role_arn            = data.aws_iam_role.fargate.arn
  container_definitions = jsonencode([
    {
      "name"         : "ecs_test_backend",
      "image"        : "${aws_ecr_repository.ecr_repository.repository_url}:latest",
      "cpu"          : 256,
      "memory"       : 512,
      "essential"    : true,
      "portMappings" : [
        {
          containerPort = 8000
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-region": "us-east-1",
          "awslogs-group": "/ecs/ecs_test_backend",
          "awslogs-stream-prefix": "ecs"
        }
      }
      "environment"   : [
        {
          "name": "POSTGRES_DB",
          "value": "${var.POSTGRES_NAME}" <=== HERE
        },
        {
          "name": "POSTGRES_PASSWORD",
          "value": "${var.POSTGRES_PASSWORD}"  <=== HERE
        },
        {
          "name": "POSTGRES_USERNAME",
          "value": "${var.POSTGRES_USERNAME}"  <=== HERE
        },
        {
          "name": "POSTGRES_PORT",
          "value": "${var.POSTGRES_PORT}"  <=== HERE
        },
        {
          "name": "POSTGRES_HOST",
          "value": "${var.POSTGRES_HOST}"  <=== HERE
        },
      ]
    }
  ])
}

Приведенная ниже конфигурация var.XXX, похоже, не работает, поскольку журналы заданий возвращают psycopg2.OperationalError: FATAL: password authentication failed for user "root"

Вероятно, потому что он не может прочитать значение.

Является ли вышеприведенный способ правильным для получения значения из AWS Secret Manager с помощью Terraform и ECS?

Вы должны использовать функцию обработки конфиденциальных данных в задачах ECS, документированную здесь.

Вы переместите переменные окружения из блока environment в блоке secrets, а вместо значения укажите ARN секрета. Тогда контейнер ECS будет считывать эти секреты при запуске вашего контейнера и устанавливать их в окружении контейнера.

Вернуться на верх