[PYTHON] Essayez les destinations AWS Lambda

AWS a annoncé des fonctionnalités étonnantes.

Introducing AWS Lambda Destinations https://aws.amazon.com/jp/blogs/compute/introducing-aws-lambda-destinations/

スクリーンショット 2019-11-27 6.51.44.png

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.

Définir correctement le Lambda appelant

É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.

Destination choisie

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".

スクリーンショット 2019-11-29 7.10.51.png

C'est un modèle de réussite スクリーンショット 2019-11-27 7.16.10.png

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 スクリーンショット 2019-11-27 7.18.20.png

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
    }

Essayez de courir

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.

Succès

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.

スクリーンショット 2019-11-27 8.55.42.png

Même si Ajouter une destination est exécuté, la destination de l'appel En cas de succès est uniquement écrasée.

スクリーンショット 2019-11-27 8.40.59_deco.png

Échec

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.

Au fait, quel est l'affichage sur X-Ray?

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.

スクリーンショット 2019-11-27 8.51.34.png

Résumé

Je pourrais facilement dériver le processus en fonction du succès / échec. Cela suffit pour un petit contrôle de script.

Recommended Posts

Essayez les destinations AWS Lambda
Essayez de fournir des variables d'environnement AWS Lambda?
[AWS] Essayez de tracer API Gateway + Lambda avec X-Ray
Tweet d'AWS Lambda
[Python] Scraping dans AWS Lambda
L'implémentation la plus simple d'AWS Lambda
Essayez d'utiliser AWS SageMaker Studio
PyTorch avec AWS Lambda [importation Lambda]
Web scraping à l'aide d'AWS lambda
lambda
Récapitulatif si vous utilisez AWS Lambda (Python)
Prise en charge de la variable d'environnement AWS Lambda
[AWS] Créer une API avec API Gateway + Lambda
Ecrire une fonction AWS Lambda en Python
Exécutez Python selon la planification sur AWS Lambda
Tweet Récapitulatif WakaTime à l'aide d'AWS Lambda
Notifier HipChat avec AWS Lambda (Python)
Développement AWS Lambda Mes meilleures pratiques
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Environnement lorsque des bibliothèques natives sont incluses dans AWS Lambda
Publiez régulièrement sur Twitter en utilisant AWS lambda!
[AWS] Associez Lambda et S3 à boto3
[Python] Exécutez Headless Chrome sur AWS Lambda
Connectez-vous à s3 avec AWS Lambda Python
[AWS] Faites des choses de type SSI avec S3 / Lambda
Résumé de l'écriture d'AWS Lambda
Essayez d'attribuer ou de changer avec Python: lambda
Je viens de faire FizzBuzz avec AWS Lambda
Essayez d'implémenter un robot Cisco Spark avec AWS Lambda + Amazon API Gateway (Python)