1

S3バケットからファイルを取得してクライアントに返すために、AWS APIゲートウェイをプロキシとして使用したいと考えています。私はラムダ関数を使用してS3と通信し、AWS API Gateway経由でクライアントにファイルを送信しています。私はこれを行うための最善の方法は、 "ラムダプロキシ統合"を使用することですので、要求全体が変更なしでラムダにパイプされるようにすることです。しかし、私がそれを行うと、私はラムダ関数からの応答のためにインテグレーションレスポンスをセットアップすることはできません。したがって、クライアントが取得するのはすべてJSONです。AWS APIゲートウェイとラムダ関数を使用して動的コンテンツタイプを返す

APIゲートウェイがJSONを取得してクライアントの適切な応答にリクエストを変換する方法があるようですが、そのようにする方法を理解できていないようです。 APIゲートウェイからの応答にコンテンツタイプを手動で設定することを指す例がたくさんありますが、コンテンツタイプのヘッダーをファイルタイプに合わせて設定する必要があります。

また、画像とバイナリ形式の場合、ラムダ関数はbase64でエンコードされた文字列を返し、プロパティisBase64Encodedtrueに設定されています。 「バイナリサポート」セクションに移動し、image/*のようなものをバイナリとして返されるコンテンツタイプとして指定すると、動作しません。バイナリサポートのコンテンツタイプを*/*(別名すべて)に設定するだけで、バイナリ以外のコンテンツタイプでは動作しません。

私は何が欠けていますか、なぜこれはとても難しいようですか?

答えて

0

APIゲートウェイは問題ありません。私のラムダ関数は適切なヘッダーを返さなかった。私はあなたが(すべて別名)*/*にバイナリをサポートするコンテンツタイプを設定し、あなたのラムダ関数はtrueにプロパティisBase64Encodedセットを返す持っている必要が見つかったバイナリ応答を処理するための

。 base64でエンコードされ、そのように示された応答はデコードされ、バイナリとして処理され、他の要求はそのまま返されます。

/** 
* This is a simple AWS Lambda function that will look for a given file on S3 and return it 
* passing along all of the headers of the S3 file. To make this available via a URL use 
* API Gateway with an AWS Lambda Proxy Integration. 
* 
* Set the S3_REGION and S3_BUCKET global parameters in AWS Lambda 
* Make sure the Lambda function is passed an object with `{ pathParameters : { proxy: 'path/to/file.jpg' } }` set 
*/ 

var AWS = require('aws-sdk'); 

exports.handler = function(event, context, callback) { 
    var region = process.env.S3_REGION; 
    var bucket = process.env.S3_BUCKET; 
    var key = decodeURI(event.pathParameters.proxy); 

    // Basic server response 
    /* 
    var response = { 
     statusCode: 200, 
     headers: { 
      'Content-Type': 'text/plain', 
     }, 
     body: "Hello world!", 
    }; 
    callback(null, response); 
    */ 

    // Fetch from S3 
    var s3 = new AWS.S3(Object.assign({ region: region })); 
    return s3.makeUnauthenticatedRequest(
     'getObject', 
     { Bucket: bucket, Key: key }, 
     function(err, data) { 
      if (err) { 
       return err; 
      } 

      var isBase64Encoded = false; 
      if (data.ContentType.indexOf('image/') > -1) { 
       isBase64Encoded = true; 
      } 

      var encoding = ''; 
      if (isBase64Encoded) { 
       encoding = 'base64' 
      } 
      var resp = { 
       statusCode: 200, 
       headers: { 
        'Content-Type': data.ContentType, 
       }, 
       body: new Buffer(data.Body).toString(encoding), 
       isBase64Encoded: isBase64Encoded 
      }; 

      callback(null, resp); 
     } 
    ); 
}; 

https://gist.github.com/kingkool68/26aa7a3641a3851dc70ce7f44f589350

経由:

は、ここで指定されたパスを受け取り、S3からファイルを読み込み、APIゲートウェイを経由して、それを返すラムダ関数のための簡単な要旨です

関連する問題