Experiment: devops9 avril 2026

Terraform - AWS Lambda

Création d'une fonction Lambda Python sur AWS avec Terraform

Terraform - AWS Lambda

Terraform - AWS Lambda

Cette expérimentation consiste à mettre en place une fonction Lambda sur AWS avec Terraform.

L'infrastructure est composée de :

  • Une fonction Lambda
  • Un lien URL pour accéder à la fonction Lambda
  • Un budget pour surveiller les coûts de la Lambda

Objectif

L'objectif est de comprendre les fonctions Lambda et leur intérêt dans une architecture serverless.

Ainsi que de mettre en place un budget pour surveiller les coûts de la Lambda.

Technique

Lambda

Je vais détailler dans ce post les étapes mises en place pour créer une fonction Lambda sur AWS avec Terraform.

Budget

Commençons par le budget, j'ai choisi de mettre en place un budget de 1$ par mois pour surveiller les coûts de la Lambda. Même si l'utilisation de la Lambda est gratuite, il est toujours intéressant de mettre en place un budget pour surveiller les coûts.

D'autant plus que la version que j'ai mise en place est une version gratuite non restreinte d'accès : aucun VPC n'a été mis en place ni aucun groupe de sécurité.

N'importe qui peut accéder à la Lambda via l'URL. Je précise que l'objectif était pédagogique et l'instance a été détruite instantanément.

Les alertes sont envoyées par e-mail à l'adresse configurée dans le code. J'ai fixé à 50% la première alerte et une prévision de 100% pour la seconde alerte.

Voici un extrait du code Terraform qui m'a permis de créer un budget :

resource "aws_budgets_budget" "ec2_budget" {
  name         = "budget-lambda-alerte"
  budget_type  = "COST"
  limit_amount = "1"
  limit_unit   = "USD"
  time_unit    = "MONTHLY"

  # Alerte 1 : 50% du budget réel consommé
  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 50
    threshold_type             = "PERCENTAGE"
    notification_type          = "ACTUAL"
    subscriber_email_addresses = ["contact@kernellab.fr"]
  }

  # Alerte 2 : Prévision de dépassement de 100%
  notification {
    comparison_operator        = "GREATER_THAN"
    threshold                  = 100
    threshold_type             = "PERCENTAGE"
    notification_type          = "FORECASTED"
    subscriber_email_addresses = ["contact@kernellab.fr"]
  }
}

Fonction Python

Pour pouvoir envoyer le code Python sur AWS, il faut le compresser dans un fichier zip.

Pour ce faire, j'ai mis une ressource en place qui va compresser le code Python qui se situe à la racine du repository dans un fichier zip.

Voici un extrait du code Terraform qui m'a permis de créer un fichier zip :

data "archive_file" "lambda" {
  type        = "zip"
  source_file = "${path.module}/../main.py"
  output_path = "${path.module}/../function.zip"
}

Logs et metrics

Pour pouvoir surveiller les logs et les métriques de la Lambda, j'ai mis une ressource en place qui va créer un log group et un dashboard.

Voici un extrait du code Terraform qui m'a permis de créer un log group sur CloudWatch :

resource "aws_cloudwatch_log_group" "example" {
  name              = "/aws/lambda/lambda_function_python"
  retention_in_days = 14

  tags = {
    Environment = "production"
    Application = "example"
  }

}

Création de la lambda

Cet extrait de code permet de créer la fonction Lambda sur AWS. On peut remarquer l'utilisation de la variable filename qui est le chemin du fichier zip créé précédemment. On utilise également la variable function_name qui est le nom de la fonction Lambda, ainsi que le role IAM qui sera utilisé pour son exécution. Le handler définit le point d'entrée du code et code_sha256 assure l'intégrité du fichier zip.

Voici un exemple du code:

resource "aws_lambda_function" "example" {
  filename      = data.archive_file.lambda.output_path
  function_name = "example_lambda_function"
  role          = aws_iam_role.example.arn
  handler       = "main.lambda_handler"
  code_sha256   = data.archive_file.lambda.output_base64sha256

  runtime = "python3.10"

  environment {
    variables = {
      ENVIRONMENT = "production"
      LOG_LEVEL   = "info"
    }
  }

  tags = {
    Environment = "production"
    Application = "example"
  }

  logging_config {
    log_format            = "JSON"
    application_log_level = "INFO"
    system_log_level      = "WARN"
  }

  depends_on = [aws_cloudwatch_log_group.example]
}

URL d'accès à la Lambda

Pour pouvoir déclencher la fonction, j'ai décidé de l'utiliser via une URL. J'ai donc mis en place une ressource qui va créer une URL d'accès public.

On peut remarquer l'utilisation de la variable function_name et du type d'autorisation (authorization_type). On configure également les paramètres cors pour l'accès.

Le CORS est volontairement configuré sur "*" pour permettre l'accès à n'importe qui. Dans un contexte de production, il faudrait mettre en place une authentification et restreindre les origines.

L'output permet également de récupérer l'URL directement dans le terminal après la construction.

Voici un exemple du code:

resource "aws_lambda_function_url" "example" {
  function_name      = aws_lambda_function.example.function_name
  authorization_type = "NONE"

  cors {
    allow_credentials = true
    allow_origins     = ["*"]
    allow_methods     = ["GET"]
    allow_headers     = ["date", "keep-alive"]
    expose_headers    = ["keep-alive", "date"]
    max_age           = 86400
  }
}

output "lambda_url" {
  value = aws_lambda_function_url.example.function_url
}

Conclusion

Cette expérimentation m'a permis de comprendre les fonctions Lambda et leur intérêt dans une architecture serverless, tout en mettant en place un monitoring des coûts via un budget AWS.

Fin d'expérimentationKernelLab / 2026