S3预签名的url在使用lambda函数生成时不起作用

2024-09-27 07:18:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我从这个Boto3 S3 Example中得到的以下代码在本地启动和通过调用API网关执行lambda函数时都能正常工作:

   s3_client = boto3.client('s3')
   response = s3_client.generate_presigned_post("mybucket",
                                                "myfile.jpg"
                                                ExpiresIn=3600)

在这两种情况下,它都会返回如下响应:

{
    "url": "https://mybucket.s3.amazonaws.com/",
    "fields": {
        "key": "myfile.jpg",
        "AWSAccessKeyId": "-omissis-",
        "policy": "eyJle...dfQ==",
        "signature": "ruboM...P3R4c="
    }
}

两者之间的唯一区别是远程字段(由lambda函数生成)还包括字段x-amz-security-token

...
        "x-amz-security-token": "IQoJb...ZAQ==",
...

当我尝试发布文件(使用上面链接的页面或postman中报告的html示例)时,当我使用本地生成的预签名url(whoutx-amz-security-token)时,一切都正常工作,但当我尝试远程生成的url时,一切都失败了

x-amz-security-token作为表单字段发送时,它返回以下错误消息:

403 Forbidden

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>InvalidAccessKeyId</Code>
    <Message>The AWS Access Key Id you provided does not exist in our records.</Message>
    <AWSAccessKeyId>-omissis-</AWSAccessKeyId>
    <RequestId>360...BE2</RequestId>
    <HostId>y04bl...DWhqY=</HostId>
</Error>

并将以下内容作为标题字段:

403 Forbidden

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>AccessDenied</Code>
    <Message>No AWSAccessKey was presented.</Message>
    <RequestId>A7592...6681</RequestId>
    <HostId>stc/+...eeUU=</HostId>
</Error>

当预签名的url包含x-amz-security-token时,我应该如何正确地发出POST请求


Tags: lambda函数clienttokenurlmessages3code

热门问题