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

Serverless部署AWS Lambda遇canvas模块缺失问题求助

解决AWS Lambda部署后找不到canvas模块的问题

问题根源

canvas是原生Node.js模块,依赖系统底层库(如libcairo、libjpeg等)。本地Mac环境安装的canvas是针对Darwin架构编译的,而AWS Lambda运行在Amazon Linux 2(x86_64架构),二进制文件不兼容,导致部署后出现MODULE_NOT_FOUND错误。

解决方案

方案1:在Linux兼容环境下安装依赖(推荐)

用Docker模拟Lambda的Amazon Linux 2环境安装依赖,确保生成的二进制文件兼容:

  • 拉取Lambda兼容的Docker镜像:
    docker pull amazonlinux:2
    
  • 运行容器并挂载项目目录:
    docker run -v $(pwd):/app -w /app amazonlinux:2 bash
    
  • 在容器内安装Node.js 16和依赖:
    yum install -y gcc-c++ make openssl-devel
    curl -sL https://rpm.nodesource.com/setup_16.x | bash -
    yum install -y nodejs
    npm install canvas --build-from-source
    
  • 退出容器后,重新部署:
    serverless deploy
    

方案2:修正Serverless配置,让esbuild正确处理原生模块

当前serverless.yml存在缩进错误,修正后添加原生模块支持配置:

service: report-infra-costs

provider:
  name: aws
  runtime: nodejs16.x
  memorySize: 128
  stage: ${opt:stage, env:STAGE, 'prd'}
  timeout: 500
  region: us-east-1
  versionFunctions: false

  iamRoleStatements:
  - Effect: Allow
    Action:
      - cloudformation:DescribeStacks
      - ce:GetCostAndUsage
      - ce:DescribeAccount
      - ce:GetDimensionValues
      - organizations:DescribeAccount
    Resource: "*"

functions: 
  sendInfraCosts:
    handler: index.sendReportInfraCosts
    events:
      - schedule: cron(0 8 ? * MON *)

custom: 
  esbuild:
    bundle: true
    minify: true
    exclude: ['aws-sdk']
    platform: node
    target: node16
    external: [] # 确保canvas不被排除在打包外

plugins:
  - serverless-esbuild
  - serverless-offline

注:修复了functions和esbuild节点的缩进错误,确保配置生效。

方案3:正确构建Canvas Layer

如果之前尝试Layer失败,可能是构建方式错误,按以下步骤操作:

  1. 创建Layer目录结构:
    canvas-layer/
      nodejs/
        package.json
        node_modules/
    
  2. 在canvas-layer/nodejs目录下,用Docker安装依赖(同方案1的容器操作):
    npm install canvas --build-from-source
    
  3. 在serverless.yml中添加Layer配置:
    layers:
      canvasLayer:
        path: canvas-layer
        compatibleRuntimes:
          - nodejs16.x
        description: Canvas module for Lambda
    
    functions: 
      sendInfraCosts:
        handler: index.sendReportInfraCosts
        events:
          - schedule: cron(0 8 ? * MON *)
        layers:
          - {Ref: CanvasLayerLambdaLayer}
    
  4. 重新部署。

方案4:调整CodeBuild构建步骤

如果用CodeBuild部署,需在Linux环境下安装系统依赖并编译canvas:
修改buildspec.yml:

version: 0.2

phases:
  install:
    runtime-versions:
      nodejs: 16.x
    commands:
      - yum install -y gcc-c++ make cairo-devel jpeg-devel pango-devel giflib-devel # 安装canvas依赖的系统库
  pre_build:
    commands:
      - npm install -g serverless
      - npm install canvas --build-from-source
      - npm install
  build:
    commands:
      - serverless deploy --stage ${STAGE} --verbose

验证步骤

部署完成后,触发Lambda函数测试,检查是否仍存在Cannot find module 'canvas'错误。若问题持续,排查:

  • node_modules/canvas目录是否存在Linux兼容的二进制文件
  • Lambda执行角色是否有权限访问Layer(若使用Layer)
  • esbuild配置是否未排除canvas模块

内容的提问来源于stack exchange,提问作者Carvalho_vinii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:22:48