2016-04-22 82 views
12

我有一个简单的lambda函数返回字典响应,另一个lambda函数调用该函数并打印响应。如何从AWS Lambda函数返回响应

lambda函数甲

def handler(event,context): 
    params = event['list'] 
    return {"params" : params + ["abc"]} 

拉姆达函数B调用

a=[1,2,3] 
x = {"list" : a} 
invoke_response = lambda_client.invoke(FunctionName="monitor-workspaces-status", 
             InvocationType='Event', 
             Payload=json.dumps(x)) 
print (invoke_response) 

invoke_response

{u'Payload': <botocore.response.StreamingBody object at 0x7f47c58a1e90>, 'ResponseMetadata': {'HTTPStatusCode': 202, 'RequestId': '9a6a6820-0841-11e6-ba22-ad11a929daea'}, u'StatusCode': 202} 

为什么响应状态202?另外,如何从invoke_response获取响应数据?我找不到明确的文件如何做到这一点。

回答

21

A 202响应手段Accepted。这是一个成功的回应,但告诉你,你所要求的行动已经启动,但尚未完成。您得到202的原因是因为您异步调用了Lambda函数。您的InvocationType参数设置为Event。如果要进行同步呼叫,请将其更改为RequestResponse

一旦你这样做,你可以得到这样返回的数据:

data = invoke_response['Payload'].read() 
+1

让我很快乐!非常感谢。在文档中找不到这个地方 –

+2

'.read()'返回类型'bytes',所以如果你期待一个字符串,JSON等,你必须'.decode()'它们。例如''response''Payload']。read()。decode()' –

+2

由于'json.dumps(obj)'返回一个带引号的字符串,(**如果你使用**作为' lambda_handler'),你会得到一个字符串,如果你做'json.loads(response ['Payload'] .read()。decode())',并且必须包装另一个'json.loads()'。所以,不要在你的lambda函数中明确地转换为JSON。 –