Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Lambda Return Payload botocore.response.StreamingBody object prints but then empty in variable

I'm invoking a lambda function from another function and want to take a different action depending on the response, pretty standard stuff. However I get some unexpected behavior, it's probably something obvious, but it is eluding me. I've recreated my example in the simplest possible example any help would be much appreciated.

The lambda function

def lambda_handler(event, context):
    return 'Just a string'

The code to call the lambda function

    def invoke_lambda(payload):
        r = lambda_client.invoke(
            FunctionName='MyLambdaFunction',
            InvocationType='RequestResponse',
            Payload=bytes(payload)
        )

    p = r['Payload'].read()
    print p #Prints an empty string
    print(r['Payload'].read()) #Prints Just a string
    invoke_lambda(payload)
like image 264
j-u-s-t-i-n Avatar asked Apr 08 '17 13:04

j-u-s-t-i-n


2 Answers

The following code solves the problem. Apparently I need to set the streamingbody to a variable, then read it into another variable. I used this link for reference

def invoke_lambda(payload):
    r = lambda_client.invoke(
        FunctionName='MyLambdaFunction',
        InvocationType='RequestResponse',
        Payload=bytes(payload)
    )
    t = r['Payload']
    j = t.read()
    print j
like image 126
j-u-s-t-i-n Avatar answered Sep 28 '22 16:09

j-u-s-t-i-n


If you expect JSON as response, you can do the following:

import json

def invoke_lambda(payload):
    response = lambda_client.invoke(
        FunctionName='MyLambdaFunction',
        InvocationType='RequestResponse',
        Payload=bytes(payload)
    )  

    response_payload = json.loads(invoke_response['Payload'].read().decode("utf-8"))

    print ("response_payload: {}".format(response_payload))
like image 37
Ivan Hristov Avatar answered Sep 28 '22 16:09

Ivan Hristov