amazon-s3 - 如何从获取托管在 S3 上的网站的 s3.getObject 呈现 index.html?
问题描述
我有由 AWS API Gateway 调用的 Lambda 函数,在该 lambda 函数上,我需要在 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...}
解决方案
在使用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
});
};
推荐阅读
- python - 如何使 QScrollArea 正常工作?
- linux - 如何将 /kernel/sched/* 包含到 BPF 程序中?
- python - 如何从页面上的某个点开始打印 Jinja2 模板中的对象?
- python - 逻辑回归成本计算
- php - 如何从 PHP OpenSSL 库中使用 openssl_encrypt 函数获取唯一的加密字符串
- mapstruct - 无法从多个父对象传递值以通过 mapstruct 进行映射
- python - python图像刮刀,在bing上无法正常工作
- python-3.x - 使用 chat.id 向我的电报机器人订阅者发送批量消息
- python - 尽管安装了 tensorflow,当我尝试从 CMD 运行文件时,出现“ModuleNotFoundError: No module named 'tensorflow'”错误
- javascript - VueJS 根据条件将自定义指令绑定到循环组件