質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

2669閲覧

Serverless Frameworkを使ってS3 + AWS Lambda + API Gatewayからバイナリファイルを返すAPIを構築したい

d16sekine

総合スコア8

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/09/30 06:27

前提・実現したいこと

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

1年以上前なので、既に解決済みかもしれませんが、私も同じ問題にハマり、最終的には生成したバイナリファイルをS3にLambda内でアップロードし、Lambdaからは302を返して、API Gatewayで該当ファイルガアップされたURLを返すと言う形でこの問題を回避しました。

参考になれば。

投稿2020/01/22 18:10

ringoing888

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問