s3.putObject(params).promise() 没有上传文件,但是成功执行了then()回调
s3.putObject(params).promise() does not upload file, but successfully executes then() callback
我尝试了很长时间将文件放入 S3 存储桶,之后我必须更新我的模型。
我有以下代码(请注意,我也尝试过注释行。它既不带注释也不能不带注释。)
观察到的问题:
第一个 .then()
块 (successCallBack()
) 中的所有内容都已成功执行,但我没有看到 s3.putObject()
.
的结果
有问题的存储桶是 public,没有访问限制。它曾经与 sls 离线选项一起使用,然后由于它在 AWS 中不起作用,我不得不进行大量更改并设法使 successCallback() 工作,从而使数据库成功运行。但是,文件上传还是不行。
一些问题:
在解决这个问题时,我正在思考/搜索的真正问题是,
lambda 应该 return 什么东西吗?我看过 AWS 文档,但它们有零散的代码片段。
把await
放在s3.putObject(params).promise()
前面没有用。我看到在具有 AWS Promise() 函数调用的事物前面使用和不使用 await 的示例。不确定哪个是正确的。
当您在一个 lambda 函数中链接异步函数时,正确的方法是什么?
更新:
var myJSON = {}
const createBook = async (event) => {
let bucketPath = "https://com.xxxx.yyyy.aa-bb-zzzzzz-1.amazonaws.com"
let fileKey = //file key
let path = bucketPath + "/" + fileKey;
myJSON = {
//JSON from headers
}
var s3 = new AWS.S3();
let buffer = Buffer.from(event.body, 'utf8');
var params = {Bucket: 'com.xxxx.yyyy', Key: fileKey, Body: buffer, ContentEncoding: 'utf8'};
let putObjPromise = s3.putObject(params).promise();
putObjPromise
.then(successCallBack())
.then(c => {
console.log('File upload Success!');
return {
statusCode: 200,
headers: { 'Content-Type': 'text/plain' },
body: "Success!!!"
}
})
.catch(err => {
let str = "File upload / Creation error:" + err;
console.log(str);
return {
statusCode: err.statusCode || 500,
headers: { 'Content-Type': 'text/plain' },
body: str
}
});
}
const successCallBack = async () => {
console.log("Inside success callback - " + JSON.stringify(myJSON)) ;
const { myModel } = await connectToDatabase()
console.log("After connectToDatabase")
const book = await myModel.create(myJSON)
console.log(msg);
}
终于,我成功了。我的代码已经在 sls 离线设置中运行。
AWS 端点有何不同?
我在控制台上观察到的事实是我的 lambda 在 VPC 下 设置为 运行。
当我选择No VPC时,它起作用了。我不知道这是否是最佳做法。 VPC 下的函数 运行ning 一定有一些安全优势。
我遇到了这个巨大的 explanation about VPC 但我找不到任何与 S3 相关的东西。
问题中发布的代码目前 运行 在 AWS 端点上没问题。
如果 lambda 在 VPC 中 运行 那么您将需要一个 VPC 端点来访问 vpc 外部的服务。 S3 将在 VPC 之外。如果安全是一个问题,那么创建 VPC 端点可能会以更好的方式解决该问题。此外,如果安全是一个问题,那么或许可以向 lambda 使用的角色添加一个策略(或使用默认的 AmazonS3FullAccess 策略),那么 S3 存储桶就不需要 public。
我尝试了很长时间将文件放入 S3 存储桶,之后我必须更新我的模型。
我有以下代码(请注意,我也尝试过注释行。它既不带注释也不能不带注释。)
观察到的问题:
第一个 .then()
块 (successCallBack()
) 中的所有内容都已成功执行,但我没有看到 s3.putObject()
.
有问题的存储桶是 public,没有访问限制。它曾经与 sls 离线选项一起使用,然后由于它在 AWS 中不起作用,我不得不进行大量更改并设法使 successCallback() 工作,从而使数据库成功运行。但是,文件上传还是不行。
一些问题:
在解决这个问题时,我正在思考/搜索的真正问题是,
lambda 应该 return 什么东西吗?我看过 AWS 文档,但它们有零散的代码片段。
把
await
放在s3.putObject(params).promise()
前面没有用。我看到在具有 AWS Promise() 函数调用的事物前面使用和不使用 await 的示例。不确定哪个是正确的。当您在一个 lambda 函数中链接异步函数时,正确的方法是什么?
更新:
var myJSON = {}
const createBook = async (event) => {
let bucketPath = "https://com.xxxx.yyyy.aa-bb-zzzzzz-1.amazonaws.com"
let fileKey = //file key
let path = bucketPath + "/" + fileKey;
myJSON = {
//JSON from headers
}
var s3 = new AWS.S3();
let buffer = Buffer.from(event.body, 'utf8');
var params = {Bucket: 'com.xxxx.yyyy', Key: fileKey, Body: buffer, ContentEncoding: 'utf8'};
let putObjPromise = s3.putObject(params).promise();
putObjPromise
.then(successCallBack())
.then(c => {
console.log('File upload Success!');
return {
statusCode: 200,
headers: { 'Content-Type': 'text/plain' },
body: "Success!!!"
}
})
.catch(err => {
let str = "File upload / Creation error:" + err;
console.log(str);
return {
statusCode: err.statusCode || 500,
headers: { 'Content-Type': 'text/plain' },
body: str
}
});
}
const successCallBack = async () => {
console.log("Inside success callback - " + JSON.stringify(myJSON)) ;
const { myModel } = await connectToDatabase()
console.log("After connectToDatabase")
const book = await myModel.create(myJSON)
console.log(msg);
}
终于,我成功了。我的代码已经在 sls 离线设置中运行。
AWS 端点有何不同?
我在控制台上观察到的事实是我的 lambda 在 VPC 下 设置为 运行。
当我选择No VPC时,它起作用了。我不知道这是否是最佳做法。 VPC 下的函数 运行ning 一定有一些安全优势。
我遇到了这个巨大的 explanation about VPC 但我找不到任何与 S3 相关的东西。
问题中发布的代码目前 运行 在 AWS 端点上没问题。
如果 lambda 在 VPC 中 运行 那么您将需要一个 VPC 端点来访问 vpc 外部的服务。 S3 将在 VPC 之外。如果安全是一个问题,那么创建 VPC 端点可能会以更好的方式解决该问题。此外,如果安全是一个问题,那么或许可以向 lambda 使用的角色添加一个策略(或使用默认的 AmazonS3FullAccess 策略),那么 S3 存储桶就不需要 public。