如何在ES5环境的AWS Lambda中从S3下载PDF文件?
解决方案
优先方案:直接使用AWS原生S3 SDK(无需Amplify依赖)
Lambda环境默认内置AWS SDK v2,不需要额外安装包,直接用require语法调用,这是后端服务操作S3最高效的方式,比Amplify Storage更轻量:
const AWS = require('aws-sdk'); const s3 = new AWS.S3(); exports.handler = async (event) => { // 1. 从S3获取文件 const getParams = { Bucket: '你的S3桶名称', // 替换为实际桶名 Key: 'test.txt' // 目标文件的路径/名称 }; try { // 获取到的data.Body是Buffer类型,等价于后端场景的Blob const { Body: fileBuffer } = await s3.getObject(getParams).promise(); // 2. 修改文件(示例:文本文件追加内容;PDF需用pdf-lib等专用库处理) const modifiedContent = fileBuffer.toString('utf8') + '\n购买完成后追加的内容'; const modifiedBuffer = Buffer.from(modifiedContent, 'utf8'); // 3. 重新上传至S3 const putParams = { Bucket: '你的S3桶名称', Key: 'new-test.txt', // 新文件名 Body: modifiedBuffer, ContentType: 'text/plain' // PDF需设为application/pdf }; await s3.putObject(putParams).promise(); return { statusCode: 200, body: '文件处理完成' }; } catch (err) { console.error('处理失败:', err); return { statusCode: 500, body: JSON.stringify(err) }; } };
若坚持使用Amplify Storage(不推荐)
如果一定要用Amplify的封装,需要先安装依赖并调整配置:
- 在Lambda本地目录执行
npm install @aws-amplify/storage,将node_modules一起打包上传(或用Lambda层管理依赖) - 使用
require语法导入并配置:
const { Storage } = require('@aws-amplify/storage'); // 配置Amplify,Lambda通过IAM角色自动获取权限,无需硬编码密钥 Storage.configure({ AWSS3: { bucket: '你的S3桶名称', region: '你的AWS区域' } }); exports.handler = async (event) => { try { // 必须设置download: true才能获取文件内容,否则返回的是访问URL const file = await Storage.get('test.txt', { level: 'public', download: true }); const fileBuffer = file.Body; // 后续修改、上传步骤同上方示例 // ... return { statusCode: 200, body: '处理完成' }; } catch (err) { console.error(err); return { statusCode: 500, body: JSON.stringify(err) }; } };
关键注意事项
- 给Lambda的IAM角色添加S3的
GetObject和PutObject权限,否则会触发权限错误 - 处理PDF文件时,需额外安装
pdf-lib等专用库,打包后部署到Lambda - 优先选择原生S3 SDK,避免Amplify的额外依赖,提升Lambda启动速度和稳定性
内容的提问来源于stack exchange,提问作者Pythoner
相关产品推荐
相关产品推荐

