Ruby 3.3 AWS Lambda无法向/tmp目录写入大文件问题求助
解决Ruby 3.3 AWS Lambda写入大文件到/tmp失败的问题
问题根源
Ruby 3.3对临时目录的安全性做了严格升级,tmpdir.rb会拒绝使用**全局可写(world-writable)**的目录作为临时存储。而AWS Lambda的/tmp目录默认权限是777,当文件大小超过阈值(约10-40KB)时,open-uri会尝试创建临时文件缓存内容,触发Ruby的安全检查,抛出could not find a temporary directory错误。
解决方案
在代码中手动创建一个权限合规的子目录,并指定Ruby使用该目录:
require "json" require "open-uri" require "tmpdir" def lambda_handler(event:, context:) # 在/tmp下创建仅当前用户可访问的子目录(权限700) safe_tmp = File.join(Dir.tmpdir, "secure_temp") Dir.mkdir(safe_tmp, 0700) unless Dir.exist?(safe_tmp) # 让Ruby使用这个安全临时目录 ENV['TMPDIR'] = safe_tmp # 处理大文件不再报错 URI.open("远程大文件URL") URI.open("远程小文件URL") { statusCode: 200, body: JSON.generate('Hello from Lambda!') } end
无效尝试的原因
直接设置ENV['TMPDIR']='/tmp'无法解决问题,因为/tmp本身是全局可写权限,依然会被Ruby的安全机制拦截。必须使用权限为700的目录,确保只有当前Lambda进程能访问。
注意事项
- Lambda的临时存储(Ephemeral storage)设置无需调整(512MB完全满足需求)
- 该问题是Ruby 3.3的安全特性导致,与AWS环境变更无关
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

