2016-04-22 90 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。 –