AWS a annoncé des fonctionnalités étonnantes.
Introducing AWS Lambda Destinations https://aws.amazon.com/jp/blogs/compute/introducing-aws-lambda-destinations/
L'action suivante (service AWS) peut être spécifiée en fonction du résultat de l'exécution de Lambda. Si vous souhaitez contrôler le flux en fonction des conditions de réussite / échec, vous pouvez désormais le terminer avec Lambda uniquement sans avoir à utiliser Step Functions.
Essayez immédiatement.
Écrivez Python comme ça. (Utilisation de Python 3.7)
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def destination_sample_handler(event, context):
logger.info("destination sample lambda started.")
if event['Success'] == True:
return {
'statusCode': 200,
'body': event
}
else:
raise Exception('Success is False', event)
Lors de l'appel, la variable Success est définie dans event et le jugement est modifié selon que le contenu est True ou False.
Dans le blog AWS, je change la destination de l'appel de succès / échec entre SNS et Lambda, mais je coupe les coins ronds et crée les deux Lambda.
Lorsque vous accédez à la fonction Lambda, vous devriez trouver un élément appelé "Ajouter une destination" dans la balise "Cofiguration" de la partie "Designer".
C'est un modèle de réussite
Le contenu du modèle de réussite est comme ça. Il sort simplement vers Log.
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info("Success dest lambda started.")
logger.info(event)
return {
'statusCode': 200,
'message': 'Success in dest lambda',
'body': event
}
C'est le paramètre de destination de l'échec
Le contenu est le même que le modèle de réussite
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info("Failure dest lambda started.")
logger.info(event)
return {
'statusCode': 200,
'message': "Failure in dest lambda",
'body': event
}
L'exécution est effectuée à partir de la CLI.
$ aws lambda invoke --function-name destination-sample --invocation-type Event --payload '{ "Success": false }' response.json
{
"StatusCode": 202
}
Il semble que 202 soit renvoyé en tant que code d'état si l'exécution réussit.
Lorsque j'ai réussi, il y avait une sortie comme celle-ci dans CloudWatch Logs du côté du succès. CloudWatch Logs
[INFO] 2019-11-26T22:26:49.792Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx {'version': '1.0', 'timestamp': '2019-11-26T22:26:49.425Z', 'requestContext': {'requestId': '26fab6f9-a2b7-45f2-bce2-47c612cdb8b7', 'functionArn': 'arn:aws:lambda:us-east-1:000000000000:function:destination-sample:$LATEST', 'condition': 'Success', 'approximateInvokeCount': 1}, 'requestPayload': {'Success': True}, 'responseContext': {'statusCode': 200, 'executedVersion': '$LATEST'}, 'responsePayload': {'statusCode': 200, 'body': {'Success': True}}}
J'ai déconnecté le contenu de l'événement appelé, mais il ressemble à ce qui suit.
Quand j'ai édité un peu le code et mis l'élément Message en événement, le contenu de responsePayload a été ajouté.
if event['Success'] == True:
event['Message'] = "Successful finished."
return {
'statusCode': 200,
'body': event
}
[INFO] 2019-11-26T23:41:21.229Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx {'version': '1.0', 'timestamp': '2019-11-26T23:41:20.730Z', 'requestContext': {'requestId': 'ba73f7a2-77f4-4166-a95d-d43020e5cc32', 'functionArn': 'arn:aws:lambda:us-east-1:000000000000:function:destination-sample:$LATEST', 'condition': 'Success', 'approximateInvokeCount': 1}, 'requestPayload': {'Success': True}, 'responseContext': {'statusCode': 200, 'executedVersion': '$LATEST'}, 'responsePayload': {'statusCode': 200, 'body': {'Success': True, 'Message': 'Successful finished.'}}}
À propos, lorsque j'ai augmenté de un la Destination au moment du succès, le paramètre du côté En cas de succès a été écrasé. Il semble y avoir un service qui peut être appelé pour une condition.
Même si Ajouter une destination est exécuté, la destination de l'appel En cas de succès est uniquement écrasée.
Un journal similaire est apparu sur CloudWatch Logs du côté défaillant.
[INFO] 2019-11-26T22:30:46.594Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx {'version': '1.0', 'timestamp': '2019-11-26T22:30:46.203Z', 'requestContext': {'requestId': '6fc2d258-fafb-40a2-8d18-886df8510fa1', 'functionArn': 'arn:aws:lambda:us-east-1:000000000000:function:destination-sample:$LATEST', 'condition': 'RetriesExhausted', 'approximateInvokeCount': 3}, 'requestPayload': {'Success': False}, 'responseContext': {'statusCode': 200, 'executedVersion': '$LATEST', 'functionError': 'Unhandled'}, 'responsePayload': {'errorMessage': "('Success is False', {'Success': False})", 'errorType': 'Exception', 'stackTrace': [' File "/var/task/lambda_function.py", line 17, in destination_sample_handler\n raise Exception(\'Success is False\', event)\n']}}
Le contenu de l'exception est également propagé correctement.
Dans X-Ray, le processus s'est correctement ramifié à partir de Lambda. Comme vous pouvez l'imaginer, c'est incroyable. Vous pouvez presque tracer avec ça.
Je pourrais facilement dériver le processus en fonction du succès / échec. Cela suffit pour un petit contrôle de script.
Recommended Posts