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

Amplify Gen2中Lambda函数的文件打包引用问题

Amplify Gen2 Lambda 引用本地文件报错的解决方法

问题场景

使用Amplify Gen2开发Lambda函数,在/functions/validateJsonAgainstSchema目录下创建了handler.ts、resource.ts,同时在该目录下设有schemas文件夹存放JSON Schema文件。但代码中通过schemaPath变量引用文件时,提示文件不存在,推测是缺少文件打包配置导致。

现有代码

handler.ts

import Ajv2020 from 'ajv/dist/2020.js';
import addFormats from 'ajv-formats';
import { readFileSync } from 'fs';
import path from 'path';
import { Handler } from 'aws-lambda';

export const handler: Handler = async (event, context) => {
  const { roadmapObject, schemaVersion } = event.arguments;

  try {
    const schemaPath = path.resolve(__dirname, 'schemas', schemaVersion);
    const response = readFileSync(schemaPath, 'utf-8');

    const ajv = new Ajv2020();
    addFormats(ajv);

    const validate = ajv.compile(JSON.parse(response));
    const valid = validate(JSON.parse(roadmapObject));

    if (!valid) {
      return {
        success: false,
        errors: validate.errors
      };
    }

    return {
      success: true,
    };
  } catch (err: { message: string } | any) {
    return {
      success: false,
      error: err.message,
    };
  }
};

resource.ts

import { defineFunction } from '@aws-amplify/backend';

export const validateJsonAgainstSchema = defineFunction({
  name: 'validateJsonAgainstSchema',
  entry: './handler.ts',
});

解决步骤

1. 配置打包时复制静态文件

Amplify Gen2默认仅打包入口文件和代码中显式import的依赖,通过fs读取的静态文件需要手动配置复制规则。修改resource.ts,添加bundling.copyFiles配置:

import { defineFunction } from '@aws-amplify/backend';

export const validateJsonAgainstSchema = defineFunction({
  name: 'validateJsonAgainstSchema',
  entry: './handler.ts',
  bundling: {
    copyFiles: [
      {
        from: './schemas/**/*', // 匹配schemas目录下所有文件及子目录
        to: './schemas/' // 复制到打包后的对应目录
      }
    ]
  }
});

2. 修正文件路径引用逻辑

确保路径包含正确的文件后缀(比如.json),避免因文件名不完整导致找不到文件:

// 修改handler.ts中的路径代码
const schemaPath = path.join(__dirname, 'schemas', `${schemaVersion}.json`);

3. 验证文件命名与权限

  • 确认schemas文件夹下的文件名与schemaVersion参数值完全匹配(Linux环境下区分大小写)
  • 确保本地文件存在且无读取权限问题

4. 重新部署函数

运行以下命令应用配置变更并部署:

npx ampx deploy

原理说明

Amplify Gen2使用esbuild作为打包工具,默认不会自动包含未被代码import的静态资源。通过copyFiles配置,可以指定将特定目录下的文件复制到最终的Lambda部署包中,确保函数运行时能读取到这些文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 09:12:42