简体   繁体   中英

AWS Lambda function URL returns a different content-length value compared to API Gateway

I have a lambda that loads an S3 file and returns it as a Base64:

return {
    "isBase64Encoded": True,
    'statusCode': 200,
    'body': b64encode(...).decode('utf-8'),
    'headers': {
        'Content-Type': 'application/octet-stream',
    }
}

I created an API Gateway and when I call it I get:

<Response [200]>
Content-Type application/octet-stream
Content-Length 998356
apparent_encoding ascii

But calling the function URL returns:

<Response [200]>
Content-Type application/octet-stream
Content-Length 748765
apparent_encoding None

The correct content-length header value is the one API gateway is returning however the header is different when using the function URL even though they are both linked to the same Lambda function version & are invoking the same exact code.

What is the issue?

When isBase64Encoded is set to true , the Lambda function is reversing the encoding to obtain the original data. This is why you're getting a lower content-length value.

However, b64encode(...).decode('utf-8') encodes your body content & then decodes it back to non-base64-encoded content. You're not actually returning base64-encoded data but you're specifying that you are.

Set isBase64Encoded to false and you should receive the correct full amount of data - as to why it works with API Gateway, it probably does an internal check, realises that you're not actually returning base-64 encoded data and returns the data as is.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM