A shell script that builds deployment packages for AWS Lambda functions using uv package manager. Supports both x86_64 and arm64 architectures.
From Terraform:
variable "lambda_architecture" {
type = string
default = "arm64"
}
variable "lambda_python_version" {
type = string
default = "3.12"
}
# https://registry.terraform.io/providers/-/null/latest/docs/resources/resource
# Only triggered when there is any change in pyproject.toml, uv.lock or src directory
resource "null_resource" "prepare_lambda_files" {
triggers = {
policy_sha1 = sha1(join(
"-",
[
sha1(file("build_lambda_package.sh")),
sha1(file("pyproject.toml")),
sha1(file("uv.lock")),
join("", [for f in fileset("src", "**") : filesha1("src/${f}")]),
]
))
}
provisioner "local-exec" {
command = <<EOT
bash ${path.module}/build_lambda_package.sh . src ${path.module} ${var.lambda_architecture} ${var.lambda_python_version}
EOT
}
}
# https://registry.terraform.io/providers/-/archive/latest/docs/data-sources/file
data "archive_file" "lambda_zip" {
depends_on = [null_resource.prepare_lambda_files]
type = "zip"
source_dir = "${path.module}/.terraform/lambda_build"
output_path = "${path.module}/.terraform/lambda.zip"
}
# https://registry.terraform.io/providers/-/aws/latest/docs/resources/lambda_function
# nosemgrep: aws-lambda-x-ray-tracing-not-active
resource "aws_lambda_function" "app" {
function_name = "demo"
handler = "app.handler"
runtime = "python${var.lambda_python_version}"
role = aws_iam_role.lambda_exec.arn
memory_size = 128
timeout = 5
architectures = [var.lambda_architecture]
filename = data.archive_file.lambda_zip.output_path
source_code_hash = data.archive_file.lambda_zip.output_base64sha256
}
Direct:
./build_lambda_package.sh <project_path> <code_path> <module_path> <lambda_arch> <python_version>project_path: Path to the project root containing dependenciescode_path: Path to Lambda function codemodule_path: Path to Terraform module directorylambda_arch: Target architecture (x86_64orarm64)python_version: Python version to build for
uvpackage manager- Bash shell
- Unix-like environment
- Builds platform-specific Lambda deployment packages
- Handles dependency management with
uv - Creates deployment-ready ZIP package
- Supports multiple Python versions
- Displays final package size
The script is designed to work with Terraform deployments and uses uv for modern Python dependency management.