前提・実現したいこと
Serverless Frameworkを使って、AWS S3に保存されているバイナリファイル(jpegやzipファイル)を返すWeb APIを構築したいです。
Web APIは、AWSのLambdaとAPIGatewayを使います。
Serverlesで、テキストベースのWeb APIの構築は問題なくできています。
しかし、バイナリファイルを扱うAPIとなると、記事が少なく、参照できるページが少ないため、ここで質問させて頂きました。
発生している問題・エラーメッセージ
ネットでいくつか調べて、serverless-apigw-binaryというnpmパッケージを用いて挑戦しましたが、対象のバイナリファイルをダウンロードすることができません。
(正確には、ファイルは生成されるが、開くと"サポートしていない形式です"と出ます)
バイナリファイルをダウンロードできれば、他のパッケージでも問題ありません。
何かご教示頂ければ幸いです。
足りない情報がありましたら、ご連絡ください。よろしくお願いします。
該当のソースコード(抜粋)
serverless.yml
yaml
1custom: 2 apigwBinary: 3 types: 4 - 'image/jpeg' 5 6plugins: 7 - serverless-apigw-binary 8 9functions: 10 getBinaryFile: 11 handler: getBinaryFile.handler 12 events: 13 - http: 14 path: binaryfile 15 method: get 16 cors: true 17 contentHandling: CONVERT_TO_BINARY
AWS Lambda(getBinaryFile.js)
node
1'use strict'; 2 3const AWS = require('aws-sdk'); 4const s3 = new AWS.S3(); 5 6module.exports.handler = async (event, context) => { 7 8 let params = { 9 Bucket: "対象のバケット名", 10 Key: "ダウンロード対象のkey名" 11 }; 12 13 let data = await s3.getObject(params).promise(); 14 //対象のデータが取得できていることは確認済み 15 16 let data_encoded = data.Body.toString('base64'); 17 18 let response = { 19 statusCode: 200, 20 headers: { 21 'Content-Type': "image/jpeg", 22 'Access-Control-Allow-Origin' : '*', 23 'Content-Disposition': 'attachment; filename="sample.jpg"', 24 }, 25 body: data_encoded, 26 isBase64Encoded: true 27 }; 28 29 return response; 30 31}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。