Grafana 7.4.3 / var / lib / grafana не может быть записана в AWS ECS - EFS

Я пытаюсь разместить образ Grafana 7.4 в ECS Fargate, используя том EFS для постоянного хранения.

Используя Terraform, я создал требуемый ресурс и предоставил задаче доступ к тому EFS через точку доступа.

resource "aws_efs_access_point" "default" {
    file_system_id = aws_efs_file_system.default.id

    posix_user {
        gid = 0
        uid = 472
    }

    root_directory {
        path = "/opt/data"

        creation_info {
            owner_gid = 0
            owner_uid = 472
            permissions = "600"
        }
    }
}

Обратите внимание, что я установил разрешения владельца в соответствии с руководствами в https://grafana.com/docs/grafana/latest/installation/docker/#migrate-from-previous-docker-containers-versions (я пробовал оба идентификатора группы 0 и 1 поскольку документация кажется непоследовательной на gid).

Используя базовое изображение alpine вместо изображения grafana, я подтвердил, что каталог /var/lib/grafana существует в контейнере с правильными установленными uid и gids. Однако при попытке запустить изображение графаны я получаю сообщение об ошибке

GF_PATHS_DATA='/var/lib/grafana' is not writable.

Я запускаю задачу с терраформированным определением задачи.

resource "aws_ecs_task_definition" "default" {
    family = "${var.name}"
    container_definitions = "${data.template_file.container_definition.rendered}"
    memory = "${var.memory}"
    cpu = "${var.cpu}"
    requires_compatibilities = [
        "FARGATE"
    ]
    network_mode = "awsvpc"
    execution_role_arn = "arn:aws:iam::REDACTED_ID:role/ecsTaskExecutionRole"

    volume {
        name = "${var.name}-volume"

        efs_volume_configuration {
            file_system_id = aws_efs_file_system.default.id
            transit_encryption = "ENABLED"
            root_directory = "/opt/data"

            authorization_config {
                access_point_id = aws_efs_access_point.default.id
            }
        }
    }

    tags = {
        Product = "${var.name}"
    }
}

С определением контейнера

[
    {
        "portMappings": [
            {
                "hostPort": 80,
                "protocol": "tcp",
                "containerPort": 80
            }
        ],
        "mountPoints": [
            {
                "sourceVolume": "${volume_name}",
                "containerPath": "/var/lib/grafana",
                "readOnly": false
            }
        ],
        "cpu": 0,
        "secrets": [
            ...
        ],
        "environment": [],
        "image": "grafana/grafana:7.4.3",
        "name": "${name}",
        "user": "472:0"
    }
]

Для пользователя я пробовал графану, 742: 0, 742 и 742: 1 при попытке gid 1.

Я считаю, что terraform, группы безопасности, mount_targets и т. Д. Верны, так как я могу получить альпийский образ, чтобы:

ls -lash /var/lib
> drw------- 2 472 root 6.0K Mar 12 11:22 grafana

person James    schedule 12.03.2021    source источник


Ответы (1)


Я считаю, что у вас проблема, потому что AWS ECS https://github.com/aws/containers-roadmap/issues/938

В любом случае, подход файловой системы не кажется очень дружественным к облаку (особенно, если вы хотите масштабировать по горизонтали: проблемы с одновременной записью из нескольких задач, ограничения IOPs, ...). Просто подготовьте подходящую БД (например, Aurora RDS Mysql, кластер с несколькими A-Z, если вам нужна высокая доступность), и у вас будет удобное развертывание AWS без операций.

person Jan Garaj    schedule 12.03.2021
comment
Спасибо, я считаю, что вы правы в этом. Я не знал, что графана просто запускает sqlite, его документы не всегда так понятны. Нам не нужна высокая доступность или масштабирование, но в любом случае Aurora RDS казалась более чистым решением. - person James; 16.03.2021