1

Ich möchte ein AWS API Gateway als Proxy zum Abrufen von Dateien aus einem S3-Bucket und zum Zurücksenden an den Client verwenden. Ich verwende eine Lambda-Funktion, um mit S3 zu sprechen und die Datei über das AWS API Gateway an den Client zu senden. Ich habe rad, dass der beste Weg, dies zu tun ist, eine "Lambda-Proxy-Integration" zu verwenden, so dass die gesamte Anfrage an Lambda ohne jede Änderung weitergeleitet wird. Aber wenn ich das mache, kann ich keine Integrationsantwort für die resultierende Antwort von meiner Lambda-Funktion einrichten. Der Client erhält also JSON.Dynamischen Inhaltstyp über AWS API Gateway und Lambda-Funktion zurückgeben

Es scheint, dass es eine Möglichkeit für das API-Gateway geben sollte, den JSON zu übernehmen und die Anfrage in die richtige Antwort für den Client umzuwandeln, aber ich kann nicht herausfinden, wie das passieren kann. Es gibt viele Beispiele, die darauf hinweisen, einen Inhaltstyp für die Antwort vom API-Gateway manuell festzulegen, aber ich muss den Inhaltstyp-Header auf den Dateityp einstellen.

Auch für Bilder und Binärformate gibt meine Lambda-Funktion eine Base64-codierte Zeichenfolge und die Eigenschaft isBase64Encoded auf true zurück. Wenn ich in den Abschnitt "Binary Support" gehe und etwas wie image/* als Inhaltstyp angibt, der als Binär zurückgegeben werden soll, funktioniert es nicht. Ich habe nur Erfolg, indem ich den Binary Support-Inhaltstyp auf */* (aka alles), die nicht für nicht-binäre Inhaltstypen funktioniert.

Was vermisse ich und warum scheint das so schwer?

Antwort

0

Stellt sich heraus, API Gateway ist nicht das Problem. Meine Lambda-Funktion gab keine richtigen Header zurück.

Für binäre Antworten Handhabung Ich fand Sie Binary Unterstützung Inhaltstyp */* (aka alles) festlegen müssen und dann haben Ihre Lambda-Funktion die Eigenschaft isBase64Encoded Satz true zurückzukehren. Antworten, die base64-codiert sind und als solche angezeigt werden, werden decodiert und als Binärdaten geliefert, während andere Anfragen unverändert zurückgegeben werden.

Hier ist ein einfaches Gist für eine Lambda-Funktion, die einen bestimmten Weg nimmt und liest die Datei aus dem S3 und gibt sie über die API Gateway:

/** 
* 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); 
     } 
    ); 
}; 

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

Verwandte Themen