【发布时间】:2021-10-12 16:47:15
【问题描述】:
我有一个使用 terraform、docker compose 的 django 应用程序下面的 settings.py 文件,我试图在 ecs 任务定义中获取存储在 aws secret manager 中的数据库的值
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
},
]
}
])
}
变量
variable "POSTGRES_PASSWORD" {
type = string
default = "somepassword"
}
上面的变量与创建 postgres rds 实例时使用的相同。
var.XXX 下面的配置似乎不起作用,因为任务日志返回 psycopg2.OperationalError: FATAL: password authentication failed for user "root"
这可能是因为它无法读取该值。
以上是使用 Terraform 和 ECS 从 AWS Secret Manager 中获取价值的正确方法吗?
【问题讨论】:
-
如果您展示了如何设置
var.POSTGRES_PASSWORD和其他环境变量,那么回答这个问题会更容易。理想情况下,您问题中的代码应该形成一个minimal reproducible example,允许其他人运行它并查看它在哪里出现与您遇到的相同错误。 -
@ydaetskcoR 我确实更新了那个变量它只是一个字符串
-
如果 DB 用户名
root正在进入容器,那么听起来您设置的值是正确的。您确定您使用的是正确的用户名/密码吗?数据库在哪里运行?是否在 RDS 上运行?
标签: python django postgresql amazon-web-services terraform