ifdef::env-github[]
:tip-caption: :bulb:
:note-caption: :information_source:
:important-caption: :heavy_exclamation_mark:
:caution-caption: :fire:
:warning-caption: :warning:
endif::[]
:toc: macro

= Delta Optimize Lambda

This Lambda function can be used with a periodic trigger to optimize a
configured link:https://delta.io[Delta Lake] table. Consult the `deployment.tf`
file for an example of how to provision the function in AWS.

toc::[]

== Building

Building and testing the Lambda can be done with cargo: `cargo test build`.

In order to deploy this in AWS Lambda, it must first be built with the `cargo
lambda` command line tool, e.g.:

[source,bash]
----
cargo lambda build --release --output-format zip
----

This will produce the file: `target/lambda/lambda-delta-optimize/bootstrap.zip`

== Infrastructure

The `deployment.tf` file contains the necessary Terraform to provision the
function, a DynamoDB table for locking, and IAM permissions. This Terraform
does *not* provision an S3 bucket to optimize.

After configuring the necessary authentication for Terraform, the following
steps can be used to provision:

[source,bash]
----
cargo lambda build --release --output-format zip
terraform init
terraform plan
terraform apply
----

[NOTE]
====
Terraform configures the Lambda to run with the smallest amount of memory allowed. For a sizable table, this may not be sufficient for larger tables.
====

=== Environment variables

The following environment variables must be set for the function to run properly

|===
| Name | Value | Notes

| `DATALAKE_LOCATION`
| `s3://my-bucket-name/databases/bronze/http`
| The `s3://` URL of the desired table to optimize.


| `AWS_S3_LOCKING_PROVIDER`
| `dynamodb`
| This instructs the `deltalake` crate to use DynamoDB for locking to provide consistent writes into s3.

| `OPTIMIZE_DS`
| `yesterday`
| Only apply optimizations to the `ds` partition (`YYYY-mm-dd`), the `yesterday` value will use the previous day UTC

|===

== Licensing

This repository is intentionally licensed under the link:https://www.gnu.org/licenses/agpl-3.0.en.html[AGPL 3.0]. If your organization is interested in re-licensing this function for re-use, contact me via email for commercial licensing terms: `rtyler@brokenco.de`

