"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.
我在上传文件时遇到问题,这需要一些时间,使用预先签名的放置对象 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.