EC2与ECS环境下容器挂载EFS后root用户无写入权限问题
问题根因
该问题是EFS Access Point的强制身份映射机制+POSIX目录权限不匹配共同导致的,和IAM权限配置无关,核心触发点有3个:
- EFS Access Point配置了
PosixUser: Uid=1001, Gid=1001时,所有通过该Access Point发起的NFS请求,无论容器内操作用户是什么身份(哪怕是uid=0的root),都会被EFS服务端强制将UID/GID映射为1001,你配置的elasticfilesystem:ClientRootAccess权限在这种场景下不会生效,无法绕过身份映射规则。 - 你配置的
RootDirectory.CreationInfo仅在Access Point指定的目录路径不存在时才会触发目录创建和权限设置,你直接将Path设为EFS根目录/,该目录在EFS创建时就已存在,默认属主为root:root、权限为755,因此你写的OwnerGid:1001、OwnerUid:1001、Permissions:0777配置完全没有生效。 - 映射后的1001用户对当前权限为755、属主为root的EFS根目录没有写入权限,因此即使用容器内root用户操作也会报Permission denied。
可行解决方案
根据你的使用场景选以下任意一种方案即可:
方案1:调整Access Point配置,适配root用户操作
如果你的容器需要用root身份读写EFS,修改EFSAccessPoint配置即可:
- 删除
PosixUser字段,关闭强制用户映射 - 不要直接使用EFS根目录作为Access Point根路径,指定一个新的子路径(比如
/amundsen-data),让EFS自动按照CreationInfo配置创建目录并设置正确权限
修改后的CFN片段参考:
EFSAccessPoint: Type: AWS::EFS::AccessPoint Properties: FileSystemId: !Ref EFSVolume RootDirectory: CreationInfo: OwnerGid: "0" OwnerUid: "0" Permissions: "0755" Path: "/amundsen-data"
更新栈之后,新启动的任务挂载EFS后,root用户可正常写入。
方案2:保留1001用户配置,修正现有目录权限
如果你需要用非root用户(uid=1001)运行容器进程,可以保留现有PosixUser配置,先修正EFS目录权限:
- 临时启动一台和EFS同VPC、同安全组的EC2实例,或者启动一个带特权权限的ECS任务,不要通过现有Access Point,直接用NFSv4协议挂载EFS文件系统
- 执行命令修改EFS根目录的属主和权限:
chown 1001:1001 /your-efs-mount-path chmod 775 /your-efs-mount-path
- 卸载EFS,删除临时资源,重启原有ECS任务即可正常写入。
注意:无法通过现有Access Point挂载后修改目录权限,因为映射后的1001用户本身没有目录的修改权限。
方案3:调整容器运行用户匹配权限
如果不想修改EFS目录权限,也可以在任务定义中配置容器的user参数为1001:1001,让容器进程直接以1001用户运行,但该方案依然需要先按照方案2的步骤给目录授予1001用户写入权限,否则依然无法写入。
配置误区说明
很多用户会误以为IAM权限中的elasticfilesystem:ClientRootAccess可以让任意场景下的root用户绕过POSIX权限检查,实际上该权限仅在不通过配置了非root PosixUser的Access Point访问EFS时生效,一旦Access Point配置了PosixUser,身份映射是强制生效的,IAM权限无法覆盖该规则。
内容的提问来源于stack exchange,提问作者Christian Dechery
相关产品推荐
相关产品推荐

