Skip to content

Instantly share code, notes, and snippets.

@joedmck
Created June 24, 2024 20:32
Show Gist options
  • Save joedmck/c7834a307d3feac61957df0e2983a38f to your computer and use it in GitHub Desktop.
Save joedmck/c7834a307d3feac61957df0e2983a38f to your computer and use it in GitHub Desktop.
Python Lambda with Dependency Layer Terraform

Python Lambda with Dependency Layer Terraform

.
├── lambda.tf
└── function/
    ├── requirements.txt
    └── src/
        └── handler.py

Remember to .gitignore .dist/!

locals {
prefix = "prod"
lambda_runtime = "python3.12"
lambda_timeout = 30
}
# Placeholder for lambda execution role
data "aws_iam_role" "lambda_execution_role" {
name = "lambda-role"
}
# Placeholder for lambda cloudwatch log group
data "aws_iam_role" "lambda_log_group" {
name = "lambda-log-group"
}
resource "null_resource" "install_layer_dependencies" {
provisioner "local-exec" {
command = "mkdir -p .dist/ && pip install -r function/requirements.txt -t .dist/layer/python/lib/python3.9/site-packages"
}
triggers = {
trigger = filesha256("function/requirements.txt")
}
}
data "archive_file" "layer_zip" {
type = "zip"
source_dir = ".dist/layer"
output_path = ".dist/layer.zip"
depends_on = [
null_resource.install_layer_dependencies
]
}
resource "aws_lambda_layer_version" "lambda_layer" {
filename = ".dist/layer.zip"
source_code_hash = data.archive_file.layer_zip.output_base64sha256
layer_name = "${local.prefix}-dependency-layer"
compatible_runtimes = [local.lambda_runtime]
depends_on = [
data.archive_file.layer_zip
]
}
data "archive_file" "function_zip" {
type = "zip"
source_dir = "function/src"
output_path = ".dist/function.zip"
}
resource "aws_lambda_function" "lambda" {
function_name = local.prefix
filename = ".dist/function.zip"
handler = "handler.handler"
source_code_hash = data.archive_file.function_zip.output_base64sha256
runtime = local.lambda_runtime
timeout = local.lambda_timeout
role = data.aws_iam_role.lambda_execution_role.arn
logging_config {
log_group = data.aws_cloudwatch_log_group.lambda_log_group.name
log_format = "Text"
}
layers = [
aws_lambda_layer_version.lambda_layer.arn
]
depends_on = [
data.archive_file.function_zip,
aws_lambda_layer_version.lambda_layer
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment