使用 AWS Javascript SDK 启动到 S3 的分段上传
Initiating Multipart Upload to S3 with AWS Javascript SDK
我正在尝试使用 lambda 函数启动到 S3 存储桶的分段上传,并最终使用预签名 URL 将大文件分块上传到存储桶。我已经使用预签名 URL 成功地将较小的文件上传到我的存储桶,但是当我尝试初始化分段上传时,我收到错误 "Task timed out after 3.00 seconds"。据我所知,查看文档和其他 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>
好吧,我以为我在使用 AWS Javascript SDK 时遇到了问题,但这只是我的 Lambda 函数没有连接到互联网的问题,因为它是在 VPC 中设置的,没有 public 子网。通过创建一个未连接到我自己的任何 VPC 的新 Lambda 函数解决了此问题,因为默认情况下 Lambda 函数是在具有 Internet 访问权限的 AWS 托管 VPC 中启动的。如果有人想查看在 JS 中启动 S3 分段上传的工作配置,请将其留在这里。非常感谢 Jarmod 的帮助
我正在尝试使用 lambda 函数启动到 S3 存储桶的分段上传,并最终使用预签名 URL 将大文件分块上传到存储桶。我已经使用预签名 URL 成功地将较小的文件上传到我的存储桶,但是当我尝试初始化分段上传时,我收到错误 "Task timed out after 3.00 seconds"。据我所知,查看文档和其他 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>
好吧,我以为我在使用 AWS Javascript SDK 时遇到了问题,但这只是我的 Lambda 函数没有连接到互联网的问题,因为它是在 VPC 中设置的,没有 public 子网。通过创建一个未连接到我自己的任何 VPC 的新 Lambda 函数解决了此问题,因为默认情况下 Lambda 函数是在具有 Internet 访问权限的 AWS 托管 VPC 中启动的。如果有人想查看在 JS 中启动 S3 分段上传的工作配置,请将其留在这里。非常感谢 Jarmod 的帮助