追記 2020-01-09
const fs = require('fs')
const path = require('path')
const serverless = require('serverless-http')
const app = require('express')()
app.get('/file.pdf', (req, res, next) => {
res.setHeader('Content-Type', 'application/pdf')
fs.createReadStream(path.join(__dirname, 'file.pdf')).pipe(res)
})
const binaryMimeTypes = [
'application/pdf',
]
const proxy = serverless(app, { binary: binaryMimeTypes })
// ^ オプションで渡せる
export const handler = proxy
コードへの記述
serverless-http
は環境変数 BINARY_CONTENT_TYPES
を見ているので下記のように書けば動くと思います。
process.env.BINARY_CONTENT_TYPES = ['application/pdf'].join(',')
const fs = require('fs')
const path = require('path')
const serverless = require('serverless-http')
const app = require('express')()
app.get('/file.pdf', (req, res, next) => {
res.setHeader('Content-Type', 'application/pdf')
fs.createReadStream(path.join(__dirname, 'file.pdf')).pipe(res)
})
exports.handler = serverless(app)
AWS Gateway の設定の変更も必要
AWS Gateway の設定の変更も必要ですのでこちらの記事を参考にしてください。
AWS Gateway の設定を Swagger でやっている場合トップレベルに下記を追加します
x-amazon-apigateway-binary-media-types:
- '*/*'
serverless-http が内部でやってること
lambda はバイナリを返せません。
なので base64 エンコードして「エンコード済だよ」と AWS Gateway に伝えます。
こちらの記事が参考になります。