首页 > 解决方案 > 从 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 控制器应该能够下载该文件。

标签: amazon-web-servicesamazon-s3c#-4.0aws-lambdapre-signed-url

解决方案


我不知道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

推荐阅读