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 部署。
我正在尝试使用 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 部署。