【发布时间】:2019-07-19 15:03:28
【问题描述】:
public S3PresignedURLServiceImpl() {
amazonS3Client = AmazonS3ClientBuilder
.standard()
.withCredentials(new DefaultAWSCredentialsProviderChain())
.withRegion(S3PresignedURLConstants.DEFAULT_REGION)
.build();
}
[在本地它正在工作,但是当 lambda 部署在控制台上时,
SignatureDoesNotMatch 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
try {
// Set the pre-signed URL to expire after specified time.
java.util.Date expiration = new java.util.Date();
long expTimeMillis = expiration.getTime();
if(data.getExpiryTime() > 0) {
expTimeMillis += 1000 * 60 * data.getExpiryTime();
} else {
expTimeMillis += 100 * 60 * 60 * 6;
}
expiration.setTime(expTimeMillis);
HttpMethod httpMethod = data.isUpload()?HttpMethod.PUT:HttpMethod.GET;
Logger.logInfo("Generating pre-signed URL.",REPORTER);
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(data.getBucketName(), data.getFilePath())
.withMethod(httpMethod)
.withExpiration(expiration);
if(!data.isUpload())
generatePresignedUrlRequest.withVersionId(data.getVersionId());
else generatePresignedUrlRequest.withContentType(data.getContentType());
url = amazonS3Client.generatePresignedUrl(generatePresignedUrlRequest);
responseData.setPreSignedUrl(url.toString());
}
catch(Exception e) {
throw new S3PresignedURLException(e.getMessage(), e);
}
【问题讨论】:
-
我们应该首先缩小问题范围:既然这段代码既可以上传又可以下载,那么哪一个不起作用?此外,您是说 Lambda 控制台中存在错误......但您显示的代码只是 generating URL - 实际上并未尝试使用它。什么时候出现这个错误?
-
我只上传presignedUrl。这里 lambda 附加到 api gateway 。我在我的角度应用程序中使用这个 presign url 将文件上传到 s3。我尝试使用签名 URL 上传它返回 403 错误代码消息“SignatureDoesNotMatch 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。”如果我运行我的 lambda 本地机器,它会返回 signedUrl 我可以使用这个本地生成的签名 url 上传文件。
标签: java amazon-web-services amazon-s3 aws-sdk pre-signed-url