AWS Lambda写入EFS触发OSError:只读文件系统问题求助
问题分析与解决
核心问题
报错显示尝试写入/home/sbx_user1051只读目录,说明SentenceTransformer未使用指定的EFS缓存路径,而是默认尝试写入Lambda的只读用户主目录;同时EFS访问点的POSIX用户与Lambda运行时用户不匹配,也会导致权限写入失败。
解决方案
1. 补充完整的HuggingFace缓存环境变量
仅设置TRANSFORMERS_CACHE不足以覆盖所有HuggingFace工具的缓存路径,需在Lambda环境变量中添加以下配置:
{ "TRANSFORMERS_CACHE": "/mnt/hf_models_cache", "HUGGINGFACE_HUB_CACHE": "/mnt/hf_models_cache", "SENTENCE_TRANSFORMERS_HOME": "/mnt/hf_models_cache" }
强制所有HuggingFace相关组件将模型、缓存文件写入EFS挂载路径。
2. 匹配EFS访问点与Lambda运行时的POSIX用户
Lambda ARM64架构下默认运行用户sbx_user1051对应的UID/GID为1000,当前EFS访问点配置的是1001,权限不匹配。修改EFS访问点配置:
def create_efs(self): self.vpc = aws_ec2.Vpc(self, "VPC") self.fs = aws_efs.FileSystem( self, "FileSystem", vpc=self.vpc ) self.access_point = self.fs.add_access_point( "MLAccessPoint", create_acl=aws_efs.Acl( owner_gid="1000", owner_uid="1000", permissions="750" ), path="/export/models", posix_user=aws_efs.PosixUser(gid="1000", uid="1000") )
将所有UID/GID参数改为1000,与Lambda运行用户一致。
3. 验证Docker镜像用户配置(可选)
若使用自定义Docker镜像,需确保镜像内用户的UID/GID与EFS配置一致,或在Dockerfile中显式指定用户:
RUN useradd -m -u 1000 lambda-user USER lambda-user
4. 确认EFS路径权限
确保EFS访问点对应的/export/models目录权限允许1000用户写入,可通过挂载EFS到EC2实例手动调整:
chown 1000:1000 /export/models chmod 750 /export/models
验证步骤
- 重新部署CDK栈,确保配置生效
- 触发Lambda函数,检查模型是否写入
/mnt/hf_models_cache路径 - 查看CloudWatch日志,确认无只读文件系统报错
内容的提问来源于stack exchange,提问作者Kislay Kunal Singh
相关产品推荐
相关产品推荐

