amazon-web-services - 从 api 返回到 aws 控制器的 S3 预签名 URL 不起作用
问题描述
我正在我的一个 mvc 控制器中创建 S3 预签名 URl,这将由 python lambda 使用。但低于错误
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>There were headers present in the request which were not signed</Message>
<HeadersNotSigned>x-amz-date</HeadersNotSigned>
<RequestId>D7815D6EDC8BB6D0</RequestId>
<HostId>jViPAaaoh+UQDQoMzB9QZXAFyIxgvw7sLr7+Otj4tJFukLkynf07B1Z81iYE8aJ4i+p0B+1Dmwc=</HostId>
</Error>
尝试允许对 S3 存储桶执行所有操作。
//This is how I am creating presigned URL
public string BuildPreSignedURL(string bucketName, string objectKey)
{
string urlString = string.Empty;
IAmazonS3 s3Client = new AmazonS3Client();
try
{
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest
{
BucketName = bucketName,
Key = objectKey,
Expires = DateTime.Now.AddMinutes(preSignedURLExpireTimeInMinutes),
};
urlString = s3Client.GetPreSignedURL(request);
}
catch (Exception ex)
{
throw;
}
return urlString;
}
//Below is now it is returned from controller
string preSignedURL = preSignedBuilder.BuildPreSignedURL(bucketName, entityS3Key);
return new RedirectResult(preSignedURL);
AWS lambda 调用我的 api 控制器应该能够下载该文件。
解决方案
我不知道C#
,但是Python
当我们生成预签名 URL 时,我们还需要设置“方法”。在下面的示例中,它使用get_object
.
s3_client = session.client('s3')
try:
response = s3_client.generate_presigned_url('get_object',
Params={'Bucket': bucket_name,
'Key': object_name},
ExpiresIn=expiration)
except ClientError as e:
logging.error(e)
return None
推荐阅读
- python - python中向量的值显示为nan值
- c# - 按特定属性比较两个列表
- windows - 使用 dll API 通过 hDC 绘制到 QPixmap 非常慢
- spring-boot - DTO 和实体映射
- python-3.x - 从 svs 幻灯片读取补丁的问题
- java - 有没有办法在Java列表中提取列表的类型参数?
- r - 如何调试 msm.check.state(nrow(qmatrix), state, cens$censor) 中的错误:状态向量包含不在 1、2、...、10 中的元素
- android - 如何在 Recyclerview 中对实时 Firestore 数据进行分组/分段
- reactjs - 更改成帧器运动动画中的 z 索引
- html - 带有 Angular 的 Kendo Grid 中的多选滚动问题