Я портирую старое существующее приложение Express на AWS Lambda. Приложение содержит только 1 конечную точку, и операция действительно проста:
- Получает файл docx через запрос POST
- Манипулирует содержимым файла
- Отправляет измененную копию файла docx отправителю.
Вот и все. Работает как отдельное приложение в VPS. Но он терпит неудачу при развертывании на лямбда-AWS, используя без сервера. Полученный файл поврежден.
Это упрощенная версия файла app.js
var express = require('serverless-express/express');
var formidable = require('formidable');
var fs = require('fs');
var JSZip = require('JSZip');
var Docxtemplater = require('docxtemplater');
var handler = require('serverless-express/handler');
// Instance express
var app = express();
app.post('/', function (req, res, next) {
var form = new formidable.IncomingForm();
// Callback to answer inconming POST request
form.parse(req, function (err, fields, files) {
// File sent
uploaded_path = files.file.path;
fs.readFile(uploaded_path, function (err, data) {
// Create zip file with the data. It fails here in AWS Lambda!
var zip = new JSZip(data);
// Pass the zip file to Docxtemplater to do stuff...
var doc = new Docxtemplater();
doc.loadZip(zip);
// More stuff here... whatever
}
}
}
module.exports.handler = handler(app);
А вот файл serverless.yml
service: myservice
plugins:
- serverless-apigw-binary
- serverless-offline
- serverless-express
custom:
apigwBinary:
types:
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
provider:
name: aws
runtime: nodejs8.10
stage: dev
region: eu-west-3
role: myrole
functions:
app:
handler: app.handler
events:
- http: GET /
- http: POST /
- http: 'ANY {proxy+}'
Приложение работает как автономное приложение, как уже говорилось. Файл, отправленный через POST, правильно прочитан и передан в библиотеку Docxtemplater. Но в AWS Lambda файл всегда поврежден. Не только с файлами docx. Любой отправленный файл определяется как поврежденный.
Это сообщение об ошибке при вызове нового JSZip (data)
End of data reached (data length = 403921, asked index = 70664704). Corrupted zip ?
Мое предположение: файл не отправляется как двоичный файл . Но я не знаю, как настроить сервер, чтобы заставить лямбду это делать.