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

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