comment obtenir le retour de la réponse à partir d'AWS Lambda fonction
J'ai un simple lambda fonction qui retourne un dict réponse et une autre fonction lambda appelle cette fonction et affiche la réponse.
fonction lambda Un
def handler(event,context):
params = event['list']
return {"params" : params + ["abc"]}
fonction lambda B invoquant Un
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}
Pourquoi le statut de la réponse 202? Aussi, comment obtenir les données de réponse de invoke_response? Je ne pouvais pas trouver une documentation claire de comment le faire.
Vous devez vous connecter pour publier un commentaire.
Un
202
réponseAccepted
. C'est un succès, mais la réponse est vous dire que l'action que vous avez demandée a été lancé mais n'a pas encore achevé. La raison pour laquelle vous faites une202
est parce que vous avez appelé la fonction Lambda de manière asynchrone. VotreInvocationType
paramètre est réglé surEvent
. Si vous voulez faire un appel synchrone, ce changement deRequestResponse
.Une fois que vous faites cela, vous pouvez obtenir les données renvoyées comme ceci:
.read()
renvoie typebytes
donc, si vous vous attendiez à une chaîne, JSON, etc., vous devez.decode()
eux. par exemple,response['Payload'].read().decode()
json.dumps(obj)
retourne une chaîne de caractères entre guillemets, (si vous avez utilisé qu' pour lereturn
valeur de votrelambda_handler
), vous allez obtenir une chaîne de caractères si vous nejson.loads(response['Payload'].read().decode())' and would have to wrap another
json.charges()` autour de cela. Donc, ne pas explicitement les convertir en JSON dans votre fonction lambda.Event
type invocations, il n'y a pas de corps de la réponse: ouvrir aws documentationessayer:
data = invoke_response['Payload'].read()
lire() car c'est un StreamingBody objet
C'est dans la boto3 docs. Vous pouvez trouver plus de détails à ce sujet ici: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/resources.html#actions