amazon-web-services - 没有存储桶策略的 s3 预签名 url 不起作用

标签 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"

如果为存储桶提供了公共(public)写入访问权限,我就能够成功上传 s3 中的对象,如果没有,我会收到访问被拒绝 403 异常,我已经浏览了大部分 StackOverflow 帖子,无法找出问题所在,请指导非常感谢我的任何帮助

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

我遇到的错误

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

最佳答案

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

关于amazon-web-services - 没有存储桶策略的 s3 预签名 url 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53375424/

相关文章:

amazon-web-services - 如何根据 kubernetes 集群位置更改网站内容?

php - 替换已弃用的函数 mysql_connect

python-3.x - 无法从版本控制的 s3 存储桶中删除项目

amazon-web-services - 使用 terraform 创建数据库实例

amazon-web-services - 基于 SQS 队列大小的自动缩放

amazon-web-services - Aerospike 可以用作 S3 的替代品吗?

java - Amazon S3 上传文件并获取 URL

go - 执行 aws-lambda 函数时出现错误 "fork/exec/var/task/main: no such file or directory"

amazon-web-services - 单独使用 AWS S3 或 S3 和 Cloudfront 进行视频下载

javascript - 无法使用 DynamoDB 节点 SDK docClient 从 DynamoDB 表读取项目