【发布时间】:2020-08-29 23:07:24
【问题描述】:
我正在尝试使用 lambda 函数向 S3 存储桶发起分段上传,并最终使用预签名 URL 将大文件分块上传到存储桶。我已经使用预签名的 URL 成功地将较小的文件上传到我的存储桶,但是当我尝试初始化分段上传时,我收到一个错误“任务在 3.00 秒后超时”。据我所知,查看文档和其他 SO 答案,我应该在这里拥有我需要的一切。我这里有什么遗漏吗,或者有没有办法从 Lambda 获取错误消息而不是超时?
这是我的 lambda 函数来启动上传
const AWS = require('aws-sdk') // lambda includes aws-sdk
const s3 = new AWS.S3({
accessKeyId: process.env.accessKey,
secretAccessKey: process.env.secretAccessKey
});
exports.startUpload = function(event,context,callback){
console.log('at start upload') // this outputs fine in logs
const s3Params = {
Bucket: 'bucket-name',
ContentType: event.type,
Key: event.name
}
console.log('here are params')
console.log(s3Params) // this outputs as I would expect in logs
s3.createMultipartUpload(s3Params, function(error,response){
if(error) callback(error)
console.log('here is response') // logs never get here
console.log(response)
callback(null, response)
})
这是我专门为上传文件创建的 IAM 用户的权限策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:ListBucketMultipartUploads",
"s3:AbortMultipartUpload",
"s3:PutObjectVersionAcl",
"s3:DeleteObject",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::bucket-name/*"
]
}
]
}
这是在 S3 存储桶本身上设置的 CORS 配置
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>30000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
【问题讨论】:
-
默认 Lambda 函数超时时间为 3 秒。您可以根据需要增加此值。
-
我尝试增加函数超时,它只是将错误更改为“任务在 X 秒后超时”这应该很容易在 3 秒内完成,据我所知,超时错误通常意味着我获得其中一项权限错误
-
几乎从不超时意味着您获得了错误的权限。也许使用用户名/密码登录服务,如果请求无效,它只会丢弃您的请求,但 S3/IAM 会以 AccessDenied 响应。在“应该可以在 3 秒内轻松完成”评论中,您的笔记本电脑(在 Lambda 之外)执行相同操作需要多长时间?您是否在 VPC 中运行 Lambda?
-
创建预签名 URL 不需要对 AWS 进行 API 调用;这是 SDK 中的本地计算。因此,它无法与您对 S3 服务的上传 API 调用相提并论。您的问题可能是您错误地设置了网络和/或安全组,并且您的 Lambda 函数没有到 S3 的网络路由。查看相关文档。
-
见stackoverflow.com/questions/51680930/…。最常见的错误是将 Lambda 部署到公共子网中,而实际上它应该部署到私有子网中。
标签: amazon-web-services amazon-s3 aws-lambda aws-sdk aws-sdk-js