postgresql 更新ECS容器与Postgres数据库,我的数据库会重置吗?

t3psigkw  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(136)

我目前有一个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"
}

字符串

kmynzznz

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手动将转储文件加载到数据库中。

相关问题