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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:07:29