You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CDK部署ECS+EFS的etcd服务失败:只读文件系统错误

解决ECS挂载EFS运行Bitnami Etcd时的只读文件系统错误

问题概述

使用AWS CDK部署挂载EFS的ECS Fargate服务,运行bitnami/etcd镜像,资源部署成功但服务启动失败,报错:

cannot access data directory: mkdir /bitnami/etcd/data: read-only file system

ECS任务以root身份运行,但仍无法写入挂载的EFS目录。

核心原因

Bitnami官方Etcd镜像默认以bitnami用户(UID 1001)启动进程,而非root。即使ECS任务以root身份运行,容器内的Etcd进程实际权限受限于该用户。EFS挂载到/bitnami/etcd后,目录默认权限为root:root,导致bitnami用户无法在其中创建data子目录。

解决方案

方案1:修改EFS挂载配置,适配Bitnami用户权限

在EFS卷配置中指定挂载时的用户UID/GID,让bitnami用户拥有写入权限:

// 修改Task Definition中的Volumes配置
const taskDefinition = new FargateTaskDefinition(this, `${id}-task`, {
  executionRole,
  volumes: [
    {
      name: volumeName,
      efsVolumeConfiguration: {
        fileSystemId: fileSystem.fileSystemId,
        // 启用IAM授权,配合Task Role权限
        authorizationConfig: {
          iam: "ENABLED"
        },
        // 指定挂载的根目录,可提前在EFS创建,或让EFS自动初始化
        rootDirectory: "/etcd-data",
        // 可选:启用传输加密
        transitEncryption: "ENABLED"
      },
    },
  ],
});

同时调整容器挂载点到Etcd的数据目录:

ct.addMountPoints({
  containerPath: '/bitnami/etcd/data', // 直接挂载到Etcd需要写入的目录
  readOnly: false,
  sourceVolume: volumeName,
});

方案2:允许Etcd以root用户运行

通过Bitnami镜像的环境变量ALLOW_ROOT=true,让Etcd进程以root身份运行,从而获得EFS挂载目录的写入权限:

// 修改容器的environment配置
environment: {
  ETCD_LISTEN_CLIENT_URLS: 'http://0.0.0.0:2379',
  ETCD_ADVERTISE_CLIENT_URLS: 'http://0.0.0.0:2379',
  ALLOW_NONE_AUTHENTICATION: 'yes',
  ETCD_ENABLE_V2: 'true',
  ALLOW_ROOT: 'yes', // 新增:允许root运行Etcd
  ETCD_DATA_DIR: '/bitnami/etcd/data' // 明确指定数据目录
},

方案3:使用EFS Access Point配置目录权限

创建EFS Access Point,设置目录的所有者为UID 1001(bitnami用户),确保容器内进程有权限写入:

// 创建EFS Access Point
const accessPoint = new AccessPoint(this, `${id}-efs-ap`, {
  fileSystem: fileSystem,
  path: "/etcd-data",
  posixUser: {
    uid: 1001,
    gid: 1001
  },
  createAcl: {
    ownerUid: 1001,
    ownerGid: 1001,
    permissions: "0755"
  }
});

// 在Task Definition的Volumes中引用Access Point
volumes: [
  {
    name: volumeName,
    efsVolumeConfiguration: {
      fileSystemId: fileSystem.fileSystemId,
      authorizationConfig: {
        accessPointId: accessPoint.accessPointId,
        iam: "ENABLED"
      },
    },
  },
],

验证权限配置

部署修改后的栈后,可通过ECS执行命令进入容器,检查挂载目录权限:

aws ecs execute-command --cluster <集群名称> --task <任务ID> --container <容器名称> --command "ls -ld /bitnami/etcd/data" --interactive

确认输出的权限包含写入权限(如drwxr-xr-x 2 1001 1001或drwxr-xr-x 2 root root)。

内容的提问来源于stack exchange,提问作者0xBradock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:50:54