没有存储桶策略的s3预设URL不起作用

时间:2018-11-19 13:13:18

标签: amazon-web-services amazon-s3

这是我尝试过的。

Lambda代码:

import uuid

import boto3


def lambda_handler(event, context):
    # Get the service client.
    s3 = boto3.client('s3')

    # Generate a random S3 key name
    upload_key = uuid.uuid4().hex

    # Generate the presigned URL for put requests
    presigned_url = s3.generate_presigned_url(
        ClientMethod='put_object',
        Params={
            'Bucket': 'test',
            'Key': upload_key,
            'ContentType': 'image/png',
            'ACL': 'public-read'
        }
    )

    # Return the presigned URL
    return {
        "upload_url": presigned_url
    }

s3存储桶的CORS策略

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我尝试通过curl命令上传对象

curl -v -H "Content-Type:image/png" -H "public-read" --upload-file ~/Downloads/newlogo.png "presignedurl"

如果为存储桶提供了公共写访问权限,则我能够在s3中成功上传对象,否则,我将获得拒绝访问的403异常,我经历了大多数StackOverflow帖子后仍无法找出问题,请指导我非常感谢

我还计划将其用于网站,该网站使用预先签名的URL将媒体文件上传到s3存储桶。什么是对其进行身份验证的最佳方法?

我遇到的错误

<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>73881648C31D9316</RequestId><HostId>g4BuDVC7XZKLkAwpvztjqDC4GW9y5s9nk+vu1TsLQBl2XeXQOtOeFR+0hmJn0fjW5xkYeAE3pfA=</HostId></Error>

1 个答案:

答案 0 :(得分:1)

当您为s3 put对象(或任何其他api调用)创建预签名的url时,该签名请求将使用配置SDK的凭据(在本例中为lambda的角色)使用。授予您Lambda的IAM角色对此s3存储桶的写权限,您的上传将成功。