我目前有一个 AWS ECS 服务,它通过 Fargate 运行一个容器,其中有一个 django 应用程序和一个 postgres 数据库。如果我更新此服务,我的容器是否会重新启动到数据库重置的程度,或者内容会保留到容器停止或更换为止?
我知道这种设计不好,我打算将我的应用程序定向到 RDS 中托管的数据库。是否可以将 postgres 数据库从我的 Fargate/ECS 容器中移植出来,以便我可以通过转换保存数据?
这是用于创建服务的当前任务定义:
{
"family": "${SERVICE_NAME}",
"taskRoleArn": "arn:aws:iam::xxxxxxxxx:role/ecsMyAppBackend",
"executionRoleArn": "arn:aws:iam::xxxxxxxxx:role/ecsTaskExecutionRole",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "backend",
"image": "xxxxxxxxx.dkr.ecr.eu-west-1.amazonaws.com/MyApp-backend:${VERSION}",
"cpu": 256,
"memory": 512,
"memoryReservation": 512,
"portMappings": [
{
"containerPort": 8011,
"protocol": "tcp"
}
],
"essential": true,
"environment" : [
{
"name": "SENTRY_ENVIRONMENT",
"value" : "${ENVIRONMENT}"
},
{
"name": "DOMAIN",
"value": "${DOMAIN}"
},
{
"name" : "BASE_URL",
"value": "${BASE_URL}"
},
{
"name": "ENV",
"value": "${ENV}"
},
{
"name" : "DEBUG",
"value": "${DEBUG}"
},
{
"name": "POSTGRES_DB",
"value": "${POSTGRES_DB}"
},
{
"name": "POSTGRES_USER",
"value" : "${POSTGRES_USER}"
},
{
"name": "AWS_STORAGE_PUBLIC_BUCKET_NAME",
"value": "${AWS_STORAGE_PUBLIC_BUCKET_NAME}"
},
{
"name": "AWS_STORAGE_PRIVATE_BUCKET_NAME",
"value": "${AWS_STORAGE_PRIVATE_BUCKET_NAME}"
}
],
"secrets" : [
{
"name" :"POSTGRES_PASSWORD",
"valueFrom": "${POSTGRES_SECRETS_ARN}:password::"
},
{
"name": "POSTGRES_HOST",
"valueFrom": "${POSTGRES_SECRETS_ARN}:host::"
},
{
"name" : "AWS_SES_ACCESS_KEY_ID",
"valueFrom": "arn:aws:secretsmanager:eu-west-1:xxxxxxxxx:secret:ses-xxxxMG:AWS_SES_ACCESS_KEY_ID::"
},
{
"name" : "AWS_SES_SECRET_ACCESS_KEY",
"valueFrom": "arn:aws:secretsmanager:eu-west-1:xxxxxxxxx:secret:ses-xxxxMG:AWS_SES_SECRET_ACCESS_KEY::"
},
{
"name": "SENTRY_DSN",
"valueFrom" : "arn:aws:secretsmanager:eu-west-1:xxxxxxxxx:secret:myApp/sentry-xxxx7G:SENTRY_DSN::"
},
{
"name" : "DJANGO_SECRET_KEY",
"valueFrom" : "${SECRETS_ARN}:DJANGO_SECRET_KEY::"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/MyApp/backend-${ENVIRONMENT}",
"awslogs-region": "eu-west-1",
"awslogs-stream-prefix": "ecs"
}
}
}
],
"placementConstraints": [],
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512"
}
如果我更新此服务,我的容器是否会重新启动到数据库重置的程度,或者内容会保留到容器停止或更换为止吗?
容器不会只是“重新启动”,它将被完全删除,并且将创建一个可能在完全不同的底层主机服务器上运行的新容器。您的容器定义中没有任何内容提供任何形式的持久性,因此存储在数据库中的所有内容都将丢失。
您可以创建一个 EFS 卷并将其映射为数据库容器的数据卷,这将允许跨部署的持久性,但 EFS 太慢而无法在其上运行数据库服务器,因此您的应用程序性能将受到严重影响。
实际的解决方案是根本不在 ECS Fargate 上运行数据库。 Fargate 绝对不是运行持久数据库的 AWS 服务。您应该为数据库服务器使用 AWS RDS Postgres 或 AWS Aurora(兼容 Postgres)。