Grafana 7.4.3 /var/lib/grafana 在 AWS ECS - EFS 中不可写

Grafana 7.4.3 /var/lib/grafana not writeable in AWS ECS - EFS

我正在尝试使用 EFS 卷在 ECS Fargate 中托管 Grafana 7.4 映像以进行持久存储。

我使用 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 中的指南设置了所有者权限(我已经尝试了组 ID 0 和 1,因为文档在 gid 上似乎不一致)。

使用基础 alpine 图像代替 grafana 图像,我已确认目录 /var/lib/grafana 存在于容器中,并设置了正确的 uid 和 gids。但是,在尝试 运行 grafana 图像时,我收到错误消息

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"
    }
]

对于“用户”,我在尝试 gid 1 时尝试了“grafana”、“742:0”、“742”和“742:1”。

我相信 terraform、安全组、mount_targets 等...都是正确的,因为我可以将 alpine 图像发送到:

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

我相信你有问题,因为 AWS ECS https://github.com/aws/containers-roadmap/issues/938

无论如何,文件系统方法似乎对云不是很友好(特别是如果你想水平扩展:来自多个任务的并发写入问题,IOP 限制,......)。只需提供适当的数据库(例如 Aurora RDS Mysql,如果您需要 HA,则可以使用多 A-Z 集群),您将拥有不错的无操作 AWS 部署。