Как отобразить индекс. html из s3.getObject, который извлек сайт, размещенный на S3? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть лямбда-функция, которая вызывается AWS API Gateway, в этой лямбда-функции мне нужно обслуживать сайт в корзине S3, чтобы я мог контролировать доступ и маршрутизацию на этом сайте.

следующий способ, который я использовал:

const AWS = require('aws-sdk');
//*/ get reference to S3 client 
var s3 = new AWS.S3();
exports.handler = (event, context, callback) => {
    var params = {
  "Bucket": "mybucket",
  "Key": "index.html" 
    };


    s3.getObject(params, function(err, data){
       if(err) {
           callback(err, null);
       } 
       else {
           let response = {
                "statusCode": 200,
                "headers":
                {
                  "Access-Control-Allow-Origin": "*", // to 
                //   "Content-Type": "text/html"
                },
                "body": JSON.stringify(data),
                "isBase64Encoded": false
            };
           callback(null, response);
        }
    });
};

Дайте следующий вывод, который не является тем, что нужно.

{"AcceptRanges":"bytes","LastModified":"2020-03-28T08:10:04.000Z","ContentLength":661,"ETag":"\"08ea404c1973c83c8731a80bf5852d05\"","ContentType":"text/html","Metadata":{},"Body":{"type":"Buffer","data":[60,33,68,79,67,84,89,80,69,32,104,116,109,108,62,13,10,60,104,116,109,108,32,108,97,110,103,61,34,101,110,34,62,13,10,60,104,101,97,100,62,13,10,32,32,60,116,105,116,108,101,62,66,111,111,1...}

1 Ответ

0 голосов
/ 28 марта 2020

При использовании getObject() из S3 API для документов содержимое вашего файла находится в свойстве Body как буфер, поскольку это асинхронный вызов. Выполнение кода продолжается, пока код S3 все еще работает. Вам нужно явно дождаться обещания звонка разрешить.

const AWS = require('aws-sdk');
var s3 = new AWS.S3();

exports.handler = (event, context, callback) => {
    var params = {
        "Bucket": "mybucket",
        "Key": "index.html" 
    };

    const data = await s3.getObject(params).promise();

    callback(null, {
        "statusCode": 200,
        "headers": {
            "Access-Control-Allow-Origin": "*",
        },
        "body": JSON.stringify(data),
        "isBase64Encoded": false
    });
};
...