AWS Lambda Node.js 12.x中自定义字体水印失效问题求助
解决AWS Lambda中Sharp无法加载自定义Open Sans字体的问题
我之前也碰到过Lambda+Sharp组合下字体加载失效的坑,结合你的场景,给你几个精准的排查和解决方向:
1. 先确认部署包的内容完整性
Lambda的代码包解压后会放在/var/task目录,你得确保:
OpenSans-Regular.ttf确实打包进了代码包的fonts/子目录,部署时没被遗漏fonts.conf也和字体文件同属fonts/目录,没有放错位置
2. 修正fonts.conf配置(这是关键!)
Fontconfig需要可写的缓存目录,但/var/task是只读的,所以你的配置文件必须把缓存目录指向Lambda唯一可写的/tmp。正确的fonts.conf内容应该是:
<?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <!-- 指定字体所在目录 --> <dir>/var/task/fonts</dir> <!-- 设置可写的缓存目录 --> <cachedir>/tmp/fonts-cache</cachedir> <!-- 禁用系统字体目录,避免干扰自定义字体加载 --> <skip-system-fonts/> <config></config> </fontconfig>
3. 确保环境变量设置时机正确
在Lambda中设置环境变量有两种方式,都要注意时机:
- 控制台配置:在Lambda的「配置」-「环境变量」中添加
FONTCONFIG_PATH=/var/task/fonts - 代码中设置:一定要在
require('sharp')之前执行,否则Sharp加载时不会读取到这个配置:process.env.FONTCONFIG_PATH = '/var/task/fonts'; const sharp = require('sharp');
4. 验证字体名称与SVG中的font-family匹配
SVG里写的font-family:'Open Sans'要和字体的正式名称完全一致,不是文件名OpenSans-Regular.ttf。你可以在本地执行fc-list | grep "Open Sans"查看字体的官方名称,确保两者没有差异。
5. 确保Sharp是针对Lambda环境编译的
Sharp是原生模块,本地编译的版本在Lambda的Linux环境下大概率不兼容。安装时要指定目标平台:
npm install --arch=x64 --platform=linux sharp
完成后再打包部署到Lambda。
6. 临时调试:直接指定字体路径
如果前面的步骤都没生效,可以先在SVG中直接指定字体的绝对路径做测试,确认字体文件本身没问题:
<text x="50%" y="100%" style="font-family:'/var/task/fonts/OpenSans-Regular.ttf';font-weight:400;font-size:75px;fill:rgba(128,128,128,1);" text-anchor="middle">${event.watermarkName}</text>
如果这样能正常渲染,说明问题出在Fontconfig的配置上,回到前面的步骤重新排查即可。
按照这些步骤调整后,应该就能让Sharp在Lambda中正确加载Open Sans字体了。
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

