Exécuter automatiquement une lambda de manière régulière

mxglt

Maxime Guilbert

Posted on May 1, 2023

Exécuter automatiquement une lambda de manière régulière

Avoir un traîtement qui s'exécute de manière régulière se révèle très souvent être important pour faire de nombreuses petites tâches répétitives. Du coup, aujourd'hui on va voir comment faire pour exécuter une lambda de manière régulière!


Vision globale

Image description

Comme vous pouvez le constater, c'est quelque chose de très simple, il ne suffit que d'EventBridge pour pouvoir exécuter ce dont on a besoin!

AWS EventBridge

Rapidement, on va faire un point sur ce qu'est AWS EventBridge.

AWS EventBridge est une service d'AWS qui permet de faciliter les architectures évènementielles. Il permet au travers de ses fonctionnalités de planifier l'exécution automatique de certaines tâches, ou d'en exécuter d'autre à chaque fois qu'un certain nombre de conditions sont réunies.


Mise en place

Lambda

Pour la lambda, on va utiliser le modèle "Hello World" en Python. Cet exemple est suffisant par rapport à nos besoins de test.

import logging
import os
import boto3

logger = logging.getLogger()

logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info(f'Hello World!')
    logger.info(f'## ENVIRONMENT VARIABLES: {os.environ}')
    logger.info(f'## EVENT: {event}')

    return {
        'statusCode': 200,
    }
Enter fullscreen mode Exit fullscreen mode

Son fichier Terraform est aussi très simple et ressemble à ça

data "archive_file" "lambda_zip" {
    type = "zip"
    source_file = "${path.module}/src/hello_world.py"
    output_file_mode = "0666"
    output_path = "${path.module}/bin/hello_world.py.zip"
}

resource "aws_lambda_function" "processing_lambda" {
    filename = data.archive_file.lambda_zip.output_path
    function_name = "hello_world"
    handler = "hello_world.lambda_handler"
    source_code_hash = data.archive_file.lambda_zip.output_base64sha256
    role = aws_iam_role.processing_lambda_role.arn
    runtime = "python3.9"
    timeout = 900
    memory_size = 10240
    tags = {
         "service": "cron_lambda"
    }
}

resource "aws_iam_role" "processing_lambda_role" {
    name = hello_world_role
    path = "/service-role/"
    permissions_boundary = // To define correctly!
    assume_role_policy = data.aws_iam_policy_document.assume-role-policy_document.json

    inline_policy {
        name = "test_policy"
        policy = data.aws_iam_policy_document.test_policy_document.json
    }
}

data "aws_iam_policy_document" "assume-role-policy_document" {
    statement {
        actions = ["sts:AssumeRole"]

        principals {
            type = "Service"
            identifiers = ["lambda.amazonaws.com"]
        }
    }
}

data "aws_iam_policy_document" "test_policy_document" {
    statement {
        actions = [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents",
            "logs:AssociateKmsKey"
        ]

        resources = ["*"]
    }
}
Enter fullscreen mode Exit fullscreen mode

Attention, la défintion du permissions_boundary pour le role IAM n'a pas été mis et c'est la seule chose qui manque pour que vous puissiez l'utiliser à 100%.

Donc là on a ce qu'il faut pour pouvoir déployer une lambda qui va effectuer juste écrire des logs. Maintenant on va pouvoir passer à la définition de son déclancheur!

EventBridge

La déclation de la partie EventBridge va se faire en 3 blocs :

  • aws_cloudwatch_event_rule : Qui va définir par quel biais on a lancer une exécution (Ici la définition d'un scheduler)
  • aws_cloudwatch_event_target : Qui va permettre de définir la cible de l'exécution évènementielle définie juste avant
  • aws_lambda_permission : Pour permettre à EventBridge pour pouvoir exécuter la lambda

Le bloc Terraform ressemble à ça

resource "aws_cloudwatch_event_rule" "scheduler" {
    name = "scheduler_lambda_cron"
    description = "Schedule for Lambda Function"
    schedule_expression = "cron(0/10 * ? * MON-FRI *)"
}

resource "aws_cloudwatch_event_target" "schedule_lambda" {
    rule = aws_cloudwatch_event_rule.scheduler.name
    target_id = "processing_lambda"
    arn = aws_lambda_function.processing_lambda.arn
}

resource "aws_lambda_permission" "allow_events_bridge_to_run_lambda" {
    statement_id = "AllowExecutionFromCloudWatch"
    action = "lambda:InvokeFunction"
    function_name = aws_lambda_function.processing_lambda.function_name
    principal = "events.amazonaws.com"
}
Enter fullscreen mode Exit fullscreen mode

Dans ce bloc il n'y a qu'une seule chose que vous aurez à toucher, c'est le champ schedule_expression.

En effet c'est ici que vous allez définir le cron qui va définir quand est-ce que votre lambda doit être exécutée.

Dans l'exemple que vous avez ici, la lambda sera exécutée toutes les 10 minutes du lundi au vendredi. Si jamais vous voulez avoir plus d'informations sur comment construire ce cron, je vous invite à aller sur cette documentation d'AWS qui fait le point sur la rédaction d'un cron.


Exécution

Maintenant que vous avez tous les fichiers terraform en main, vous pouvez à présent les éxécuter et profiter de ce traitement automatisé!


J'espère que ça vous aidera! 🍺


Vous voulez me supporter?

Buy Me A Coffee

💖 💪 🙅 🚩
mxglt
Maxime Guilbert

Posted on May 1, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related