我目前有一个AWS ECS服务,它通过Fargate运行一个容器,其中有一个django应用程序和一个postgres数据库。如果我更新此服务,我的容器是否会重新启动,以至于数据库被重置,或者内容会保留到容器被停止或替换?
我意识到这种设计不好,我打算将我的应用程序定向到RDS中托管的数据库。是否可以将postgres db从我的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"
}
字符串
1条答案
按热度按时间kmynzznz1#
如果我更新此服务,我的容器是否会重新启动到数据库重置的程度,或者内容会保留到容器停止或替换?
容器不会只是“重启”,它会被完全删除,并创建一个新的容器,可能运行在一个完全不同的底层主机服务器上。在你的容器定义中没有提供任何类型的持久性,所以存储在数据库中的所有内容都将丢失。
您可以创建一个EFS卷,并将其Map为数据库容器的数据卷,这将允许跨部署的持久性,但EFS太慢,无法在其上运行数据库服务器,因此您的应用性能将受到严重影响。
实际的解决方案是根本不在ECS Fargate上运行数据库。Fargate绝对不是运行持久数据库的AWS服务。您应该使用AWS RDS Postgres或AWS Aurora(兼容Postgres)作为数据库服务器。
我意识到这种设计不好,我打算将我的应用程序定向到RDS中托管的数据库。是否可以将postgres db从我的fargate/ECS容器中导出,以便我可以通过转换保存数据?
您需要以某种方式连接到数据库并运行
pgdump
以取出数据,并将该文件存储在容器外部的某个位置。您可能会使用ECS Exec进入DB容器并运行该命令。但之后可能很难将文件从容器中取出。您可能会向taskRole
添加S3权限,在ECS Exec
环境中,在容器内安装AWS CLI工具,然后将文件复制到S3存储桶。然后需要创建一个RDS数据库,然后使用
pgrestore
手动将转储文件加载到数据库中。