【问题标题】:Initiating Multipart Upload to S3 with AWS Javascript SDK使用 AWS Javascript 开发工具包启动到 S3 的分段上传
【发布时间】: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


【解决方案1】:

好吧,我以为我在使用 AWS Javascript SDK 时遇到了问题,但这只是我的 Lambda 函数没有连接到互联网的问题,因为它是在没有公共子网的 VPC 中设置的。通过创建一个未连接到我自己的任何 VPC 的新 Lambda 函数来解决此问题,因为默认情况下 Lambda 函数是在具有 Internet 访问权限的 AWS 托管 VPC 中启动的。如果有人想查看在 JS 中启动 S3 分段上传的工作配置,请将其留在这里。非常感谢 Jarmod 的帮助

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2011-11-10
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多