"Long" 运行 上传失败,出现 403 禁止使用预签名 URL

"Long" running uploads fail on 403 forbidden using presigned URLs

我在上传文件时遇到问题,这需要一些时间,使用预先签名的放置对象 url 和传输加速。有时有效,有时无效。

我使用 Java SDK 2.15.9 执行了以下测试以生成 url 和 curl 以上传。我还使用 transfer acceleration.

从瑞典上传到位于 us-east-2 区域的 s3 存储桶
file size url expire time transfer speed time to upload status
20mb 1min 100k/s x failed after 1min 23sec on 403 forbidden
42mb 10min 50k/s 13min success
42mb 10min 10k/s x failed after 12min on 403 forbidden
42mb 10min 25k/s 28min success

这是怎么回事?我的第一个理论是过期时间需要比上传时间长。然而,通读文档似乎在请求开始时验证了过期时间。启用传输加速时也是如此吗?即使一次上传需要 28 分钟,也可以使用 10 分钟的过期时间。

我需要设置更长的过期时间吗?

使用了以下 curl 命令:

curl -v -H "Content-Type: $contentType" --limit-rate $rateLimit --upload-file $file "$url"

要生成的代码 URL:

    private val presigner by lazy {
        S3Presigner.builder()
                .credentialsProvider(DefaultCredentialsProvider.create())
                .region(s3Region)
                .serviceConfiguration(S3Configuration.builder()
                        .accelerateModeEnabled(true)
                        .checksumValidationEnabled(false)
                        .build())
                .build()
    }

    override fun run() {
        val url = presigner.presignPutObject { builder ->
            builder.putObjectRequest {
                it.bucket(s3Bucket)
                it.key(UUID.randomUUID().toString())
                it.contentType(contentType)
            }.signatureDuration(Duration.ofSeconds(expire))
        }.url()
        println(url)
    }

收到 AWS 支持的回复,Cloudfront 在收到整个正文之前不会将请求发送到 S3。所以解决办法是增加上传的过期时间URL.