From b64057c702cec496ca4ac9455b769282b7ce6377 Mon Sep 17 00:00:00 2001
From: Anton Babenko <anton@antonbabenko.com>
Date: Fri, 6 Sep 2024 17:31:45 -0700
Subject: [PATCH] Added more runtime examples for Rust, Go, Java

---
 .pre-commit-config.yaml                       |    4 +-
 README.md                                     |    9 +-
 examples/alias/README.md                      |    4 +-
 examples/async/README.md                      |    4 +-
 examples/build-package/README.md              |    6 +-
 examples/code-signing/README.md               |    4 +-
 examples/complete/README.md                   |    4 +-
 examples/container-image/README.md            |    4 +-
 examples/deploy/README.md                     |    4 +-
 examples/event-source-mapping/README.md       |   63 +
 examples/fixtures/runtimes/go/.gitignore      |    2 +
 examples/fixtures/runtimes/go/go.mod          |    5 +
 examples/fixtures/runtimes/go/main.go         |   23 +
 examples/fixtures/runtimes/java21/.gitignore  |    2 +
 .../fixtures/runtimes/java21/build.gradle     |   40 +
 .../java21/src/main/java/example/Handler.java |   19 +
 examples/fixtures/runtimes/rust/.gitignore    |    2 +
 .../{rust-app1 => runtimes/rust}/Cargo.toml   |    0
 .../{rust-app1 => runtimes/rust}/src/main.rs  |    2 +-
 examples/fixtures/rust-app1/.gitignore        |    1 -
 examples/fixtures/rust-app1/Cargo.lock        | 1017 -----------------
 examples/multiple-regions/README.md           |    4 +-
 examples/runtimes/README.md                   |   68 ++
 examples/runtimes/checks.tf                   |   37 +
 examples/runtimes/java_eq_fun.tf              |   31 +
 examples/runtimes/main.tf                     |   98 ++
 examples/runtimes/outputs.tf                  |   24 +
 examples/runtimes/variables.tf                |    0
 examples/runtimes/versions.tf                 |   18 +
 examples/simple-cicd/README.md                |    4 +-
 examples/simple/README.md                     |    6 +-
 examples/simple/main.tf                       |  613 +++++-----
 examples/triggers/README.md                   |    4 +-
 examples/with-efs/README.md                   |    4 +-
 examples/with-vpc-s3-endpoint/README.md       |    4 +-
 examples/with-vpc/README.md                   |    4 +-
 modules/alias/README.md                       |    4 +-
 modules/deploy/README.md                      |    4 +-
 modules/docker-build/README.md                |    4 +-
 wrappers/README.md                            |   39 +
 wrappers/alias/README.md                      |   36 +
 wrappers/deploy/README.md                     |   38 +
 wrappers/docker-build/README.md               |   38 +
 43 files changed, 921 insertions(+), 1380 deletions(-)
 create mode 100644 examples/fixtures/runtimes/go/.gitignore
 create mode 100644 examples/fixtures/runtimes/go/go.mod
 create mode 100644 examples/fixtures/runtimes/go/main.go
 create mode 100644 examples/fixtures/runtimes/java21/.gitignore
 create mode 100644 examples/fixtures/runtimes/java21/build.gradle
 create mode 100644 examples/fixtures/runtimes/java21/src/main/java/example/Handler.java
 create mode 100644 examples/fixtures/runtimes/rust/.gitignore
 rename examples/fixtures/{rust-app1 => runtimes/rust}/Cargo.toml (100%)
 rename examples/fixtures/{rust-app1 => runtimes/rust}/src/main.rs (96%)
 delete mode 100644 examples/fixtures/rust-app1/.gitignore
 delete mode 100644 examples/fixtures/rust-app1/Cargo.lock
 create mode 100644 examples/runtimes/README.md
 create mode 100644 examples/runtimes/checks.tf
 create mode 100644 examples/runtimes/java_eq_fun.tf
 create mode 100644 examples/runtimes/main.tf
 create mode 100644 examples/runtimes/outputs.tf
 create mode 100644 examples/runtimes/variables.tf
 create mode 100644 examples/runtimes/versions.tf

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 3ae4b8ba..f28966e0 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,6 +1,6 @@
 repos:
   - repo: https://github.com/antonbabenko/pre-commit-terraform
-    rev: v1.92.2
+    rev: v1.94.1
     hooks:
       - id: terraform_fmt
       - id: terraform_wrapper_module_for_each
@@ -29,3 +29,5 @@ repos:
       - id: check-merge-conflict
       - id: end-of-file-fixer
       - id: trailing-whitespace
+      - id: mixed-line-ending
+        args: [--fix=lf]
diff --git a/README.md b/README.md
index dbbf0fb1..8661d7ee 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ This Terraform module is the part of [serverless.tf framework](https://github.co
 ## Features
 
 - Build dependencies for your Lambda Function and Layer.
-- Support builds locally and in Docker (with or without SSH agent support for private builds).
+- Support builds locally and in Docker (with or without SSH agent support for private builds) for any runtime and architecture supported by AWS Lambda.
 - Create deployment package or deploy existing (previously built package) from local, from S3, from URL, or from AWS ECR repository.
 - Store deployment packages locally or in the S3 bucket.
 - Support almost all features of Lambda resources (function, layer, alias, etc.)
@@ -384,7 +384,7 @@ When `source_path` is set to a list of directories the content of each will be t
 
 ### Combine various options for extreme flexibility
 
-This is the most complete way of creating a deployment package from multiple sources with multiple dependencies. This example is showing some of the available options (see [examples/build-package](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/build-package) for more):
+This is the most complete way of creating a deployment package from multiple sources with multiple dependencies. This example is showing some of the available options (see [examples/build-package](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/build-package) and [examples/runtimes](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/runtimes) for more):
 
 ```hcl
 source_path = [
@@ -643,6 +643,7 @@ Q4: What does this error mean - `"We currently do not support adding policies fo
 - [Complete](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/complete) - Create Lambda resources in various combinations with all supported features.
 - [Container Image](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/container-image) - Create a Docker image with a platform specified in the Dockerfile (using [docker provider](https://registry.terraform.io/providers/kreuzwerker/docker)), push it to AWS ECR, and create Lambda function from it.
 - [Build and Package](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/build-package) - Build and create deployment packages in various ways.
+- [Runtimes](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/build-package) - Build and create deployment packages for various runtimes (such as Rust, Go, Java).
 - [Alias](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/alias) - Create static and dynamic aliases in various ways.
 - [Deploy](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/deploy) - Complete end-to-end build/update/deploy process using AWS CodeDeploy.
 - [Async Invocations](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/async) - Create Lambda Function with async event configuration (with SQS, SNS, and EventBridge integration).
@@ -660,7 +661,7 @@ Q4: What does this error mean - `"We currently do not support adding policies fo
 - [1Mill/serverless-tf-examples](https://github.com/1Mill/serverless-tf-examples/tree/main/src)
 
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -904,7 +905,7 @@ No modules.
 | <a name="output_lambda_role_unique_id"></a> [lambda\_role\_unique\_id](#output\_lambda\_role\_unique\_id) | The unique id of the IAM role created for the Lambda Function |
 | <a name="output_local_filename"></a> [local\_filename](#output\_local\_filename) | The filename of zip archive deployed (if deployment was from local) |
 | <a name="output_s3_object"></a> [s3\_object](#output\_s3\_object) | The map with S3 object data of zip archive deployed (if deployment was from S3) |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
 
 ## Development
 
diff --git a/examples/alias/README.md b/examples/alias/README.md
index 6326614c..bc734f66 100644
--- a/examples/alias/README.md
+++ b/examples/alias/README.md
@@ -14,7 +14,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -83,4 +83,4 @@ No inputs.
 | <a name="output_lambda_role_name"></a> [lambda\_role\_name](#output\_lambda\_role\_name) | The name of the IAM role created for the Lambda Function |
 | <a name="output_local_filename"></a> [local\_filename](#output\_local\_filename) | The filename of zip archive deployed (if deployment was from local) |
 | <a name="output_s3_object"></a> [s3\_object](#output\_s3\_object) | The map with S3 object data of zip archive deployed (if deployment was from S3) |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/async/README.md b/examples/async/README.md
index 40c6fbb9..5223af96 100644
--- a/examples/async/README.md
+++ b/examples/async/README.md
@@ -14,7 +14,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -72,4 +72,4 @@ No inputs.
 | <a name="output_lambda_role_name"></a> [lambda\_role\_name](#output\_lambda\_role\_name) | The name of the IAM role created for the Lambda Function |
 | <a name="output_local_filename"></a> [local\_filename](#output\_local\_filename) | The filename of zip archive deployed (if deployment was from local) |
 | <a name="output_s3_object"></a> [s3\_object](#output\_s3\_object) | The map with S3 object data of zip archive deployed (if deployment was from S3) |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/build-package/README.md b/examples/build-package/README.md
index e77c0c59..f4856320 100644
--- a/examples/build-package/README.md
+++ b/examples/build-package/README.md
@@ -2,6 +2,8 @@
 
 Configuration in this directory creates deployment packages in a variety of combinations.
 
+Look into [Runtimes Examples](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/runtimes) for more ways to build and deploy AWS Lambda Functions using supported runtimes (Rust, Go, Java).
+
 ## Usage
 
 To run this example you need to execute:
@@ -14,7 +16,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -69,4 +71,4 @@ No inputs.
 ## Outputs
 
 No outputs.
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/code-signing/README.md b/examples/code-signing/README.md
index feaa1b38..e1a5a692 100644
--- a/examples/code-signing/README.md
+++ b/examples/code-signing/README.md
@@ -14,7 +14,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -59,4 +59,4 @@ No inputs.
 | <a name="output_lambda_function_invoke_arn"></a> [lambda\_function\_invoke\_arn](#output\_lambda\_function\_invoke\_arn) | The Invoke ARN of the Lambda Function |
 | <a name="output_lambda_function_signing_job_arn"></a> [lambda\_function\_signing\_job\_arn](#output\_lambda\_function\_signing\_job\_arn) | ARN of the signing job |
 | <a name="output_lambda_function_signing_profile_version_arn"></a> [lambda\_function\_signing\_profile\_version\_arn](#output\_lambda\_function\_signing\_profile\_version\_arn) | ARN of the signing profile version |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/complete/README.md b/examples/complete/README.md
index 92c3256b..eba6ef49 100644
--- a/examples/complete/README.md
+++ b/examples/complete/README.md
@@ -15,7 +15,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -92,4 +92,4 @@ No inputs.
 | <a name="output_lambda_role_name"></a> [lambda\_role\_name](#output\_lambda\_role\_name) | The name of the IAM role created for the Lambda Function |
 | <a name="output_local_filename"></a> [local\_filename](#output\_local\_filename) | The filename of zip archive deployed (if deployment was from local) |
 | <a name="output_s3_object"></a> [s3\_object](#output\_s3\_object) | The map with S3 object data of zip archive deployed (if deployment was from S3) |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/container-image/README.md b/examples/container-image/README.md
index 4ee6505a..4053da3a 100644
--- a/examples/container-image/README.md
+++ b/examples/container-image/README.md
@@ -14,7 +14,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -79,4 +79,4 @@ No inputs.
 | <a name="output_lambda_layer_version"></a> [lambda\_layer\_version](#output\_lambda\_layer\_version) | The Lambda Layer version |
 | <a name="output_lambda_role_arn"></a> [lambda\_role\_arn](#output\_lambda\_role\_arn) | The ARN of the IAM role created for the Lambda Function |
 | <a name="output_lambda_role_name"></a> [lambda\_role\_name](#output\_lambda\_role\_name) | The name of the IAM role created for the Lambda Function |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/deploy/README.md b/examples/deploy/README.md
index b900c919..198f5cf4 100644
--- a/examples/deploy/README.md
+++ b/examples/deploy/README.md
@@ -14,7 +14,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -63,4 +63,4 @@ No inputs.
 | <a name="output_codedeploy_iam_role_name"></a> [codedeploy\_iam\_role\_name](#output\_codedeploy\_iam\_role\_name) | Name of IAM role used by CodeDeploy |
 | <a name="output_deploy_script"></a> [deploy\_script](#output\_deploy\_script) | Path to a deployment script |
 | <a name="output_script"></a> [script](#output\_script) | Deployment script |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/event-source-mapping/README.md b/examples/event-source-mapping/README.md
index 0f34132e..fcf53677 100644
--- a/examples/event-source-mapping/README.md
+++ b/examples/event-source-mapping/README.md
@@ -13,3 +13,66 @@ $ terraform apply
 ```
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
+
+<!-- BEGIN_TF_DOCS -->
+## Requirements
+
+| Name | Version |
+|------|---------|
+| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
+| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.32 |
+| <a name="requirement_random"></a> [random](#requirement\_random) | >= 2.0 |
+
+## Providers
+
+| Name | Version |
+|------|---------|
+| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 5.32 |
+| <a name="provider_random"></a> [random](#provider\_random) | >= 2.0 |
+
+## Modules
+
+| Name | Source | Version |
+|------|--------|---------|
+| <a name="module_lambda_function"></a> [lambda\_function](#module\_lambda\_function) | ../../ | n/a |
+| <a name="module_vpc"></a> [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 5.0 |
+
+## Resources
+
+| Name | Type |
+|------|------|
+| [aws_dynamodb_table.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/dynamodb_table) | resource |
+| [aws_kinesis_stream.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kinesis_stream) | resource |
+| [aws_mq_broker.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/mq_broker) | resource |
+| [aws_secretsmanager_secret.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret) | resource |
+| [aws_secretsmanager_secret_version.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret_version) | resource |
+| [aws_sqs_queue.failure](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sqs_queue) | resource |
+| [aws_sqs_queue.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sqs_queue) | resource |
+| [random_password.this](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password) | resource |
+| [random_pet.this](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/pet) | resource |
+| [aws_availability_zones.available](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/availability_zones) | data source |
+| [aws_organizations_organization.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/organizations_organization) | data source |
+
+## Inputs
+
+No inputs.
+
+## Outputs
+
+| Name | Description |
+|------|-------------|
+| <a name="output_lambda_event_source_mapping_function_arn"></a> [lambda\_event\_source\_mapping\_function\_arn](#output\_lambda\_event\_source\_mapping\_function\_arn) | The the ARN of the Lambda function the event source mapping is sending events to |
+| <a name="output_lambda_event_source_mapping_state"></a> [lambda\_event\_source\_mapping\_state](#output\_lambda\_event\_source\_mapping\_state) | The state of the event source mapping |
+| <a name="output_lambda_event_source_mapping_state_transition_reason"></a> [lambda\_event\_source\_mapping\_state\_transition\_reason](#output\_lambda\_event\_source\_mapping\_state\_transition\_reason) | The reason the event source mapping is in its current state |
+| <a name="output_lambda_event_source_mapping_uuid"></a> [lambda\_event\_source\_mapping\_uuid](#output\_lambda\_event\_source\_mapping\_uuid) | The UUID of the created event source mapping |
+| <a name="output_lambda_function_arn"></a> [lambda\_function\_arn](#output\_lambda\_function\_arn) | The ARN of the Lambda Function |
+| <a name="output_lambda_function_arn_static"></a> [lambda\_function\_arn\_static](#output\_lambda\_function\_arn\_static) | The static ARN of the Lambda Function. Use this to avoid cycle errors between resources (e.g., Step Functions) |
+| <a name="output_lambda_function_invoke_arn"></a> [lambda\_function\_invoke\_arn](#output\_lambda\_function\_invoke\_arn) | The Invoke ARN of the Lambda Function |
+| <a name="output_lambda_function_kms_key_arn"></a> [lambda\_function\_kms\_key\_arn](#output\_lambda\_function\_kms\_key\_arn) | The ARN for the KMS encryption key of Lambda Function |
+| <a name="output_lambda_function_last_modified"></a> [lambda\_function\_last\_modified](#output\_lambda\_function\_last\_modified) | The date Lambda Function resource was last modified |
+| <a name="output_lambda_function_name"></a> [lambda\_function\_name](#output\_lambda\_function\_name) | The name of the Lambda Function |
+| <a name="output_lambda_function_qualified_arn"></a> [lambda\_function\_qualified\_arn](#output\_lambda\_function\_qualified\_arn) | The ARN identifying your Lambda Function Version |
+| <a name="output_lambda_function_source_code_hash"></a> [lambda\_function\_source\_code\_hash](#output\_lambda\_function\_source\_code\_hash) | Base64-encoded representation of raw SHA-256 sum of the zip file |
+| <a name="output_lambda_function_source_code_size"></a> [lambda\_function\_source\_code\_size](#output\_lambda\_function\_source\_code\_size) | The size in bytes of the function .zip file |
+| <a name="output_lambda_function_version"></a> [lambda\_function\_version](#output\_lambda\_function\_version) | Latest published version of Lambda Function |
+<!-- END_TF_DOCS -->
diff --git a/examples/fixtures/runtimes/go/.gitignore b/examples/fixtures/runtimes/go/.gitignore
new file mode 100644
index 00000000..2da3a426
--- /dev/null
+++ b/examples/fixtures/runtimes/go/.gitignore
@@ -0,0 +1,2 @@
+go.sum
+bootstrap
diff --git a/examples/fixtures/runtimes/go/go.mod b/examples/fixtures/runtimes/go/go.mod
new file mode 100644
index 00000000..c572c2e4
--- /dev/null
+++ b/examples/fixtures/runtimes/go/go.mod
@@ -0,0 +1,5 @@
+module main
+
+go 1.22.6
+
+require github.com/aws/aws-lambda-go v1.47.0 // indirect
diff --git a/examples/fixtures/runtimes/go/main.go b/examples/fixtures/runtimes/go/main.go
new file mode 100644
index 00000000..6a5defa1
--- /dev/null
+++ b/examples/fixtures/runtimes/go/main.go
@@ -0,0 +1,23 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"github.com/aws/aws-lambda-go/lambda"
+)
+
+type MyEvent struct {
+	Name string `json:"name"`
+}
+
+func HandleRequest(ctx context.Context, event *MyEvent) (*string, error) {
+	if event == nil {
+		return nil, fmt.Errorf("received nil event")
+	}
+	message := fmt.Sprintf("Hello %s! serverless.tf was here!", event.Name)
+	return &message, nil
+}
+
+func main() {
+	lambda.Start(HandleRequest)
+}
diff --git a/examples/fixtures/runtimes/java21/.gitignore b/examples/fixtures/runtimes/java21/.gitignore
new file mode 100644
index 00000000..67bcc2f7
--- /dev/null
+++ b/examples/fixtures/runtimes/java21/.gitignore
@@ -0,0 +1,2 @@
+.gradle/
+build/
diff --git a/examples/fixtures/runtimes/java21/build.gradle b/examples/fixtures/runtimes/java21/build.gradle
new file mode 100644
index 00000000..53f6f6ee
--- /dev/null
+++ b/examples/fixtures/runtimes/java21/build.gradle
@@ -0,0 +1,40 @@
+plugins {
+    id 'java'
+}
+
+repositories {
+    mavenCentral()
+}
+
+dependencies {
+    implementation 'com.amazonaws:aws-lambda-java-core:1.2.1'
+    implementation 'org.slf4j:slf4j-nop:2.0.6'
+    implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.0'
+    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
+    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
+}
+
+test {
+    useJUnitPlatform()
+}
+
+// Using terraform-aws-lambda module, there is no need to make Zip archive by Gradle. Terraform AWS module will make it for you.
+// task buildZip(type: Zip) {
+//     from compileJava
+//     from processResources
+//     into('lib') {
+//         from configurations.runtimeClasspath
+//     }
+// }
+
+task copyFiles(type: Copy) {
+    into("$buildDir/output")
+
+    from sourceSets.main.output
+
+    into('lib') {
+        from configurations.runtimeClasspath
+    }
+}
+
+build.dependsOn copyFiles
diff --git a/examples/fixtures/runtimes/java21/src/main/java/example/Handler.java b/examples/fixtures/runtimes/java21/src/main/java/example/Handler.java
new file mode 100644
index 00000000..08b14d81
--- /dev/null
+++ b/examples/fixtures/runtimes/java21/src/main/java/example/Handler.java
@@ -0,0 +1,19 @@
+package example;
+
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.LambdaLogger;
+import com.amazonaws.services.lambda.runtime.RequestHandler;
+
+import java.util.Map;
+
+// Handler value: example.Handler
+public class Handler implements RequestHandler<Map<String,String>, String>{
+
+  @Override
+  public String handleRequest(Map<String,String> event, Context context)
+  {
+    LambdaLogger logger = context.getLogger();
+    logger.log("EVENT TYPE: " + event.getClass());
+    return "Hello from serverless.tf!!!";
+  }
+}
diff --git a/examples/fixtures/runtimes/rust/.gitignore b/examples/fixtures/runtimes/rust/.gitignore
new file mode 100644
index 00000000..96ef6c0b
--- /dev/null
+++ b/examples/fixtures/runtimes/rust/.gitignore
@@ -0,0 +1,2 @@
+/target
+Cargo.lock
diff --git a/examples/fixtures/rust-app1/Cargo.toml b/examples/fixtures/runtimes/rust/Cargo.toml
similarity index 100%
rename from examples/fixtures/rust-app1/Cargo.toml
rename to examples/fixtures/runtimes/rust/Cargo.toml
diff --git a/examples/fixtures/rust-app1/src/main.rs b/examples/fixtures/runtimes/rust/src/main.rs
similarity index 96%
rename from examples/fixtures/rust-app1/src/main.rs
rename to examples/fixtures/runtimes/rust/src/main.rs
index 766f0a18..4432a31c 100644
--- a/examples/fixtures/rust-app1/src/main.rs
+++ b/examples/fixtures/runtimes/rust/src/main.rs
@@ -10,7 +10,7 @@ async fn function_handler(event: Request) -> Result<Response<Body>, Error> {
         .query_string_parameters_ref()
         .and_then(|params| params.first("name"))
         .unwrap_or("world");
-    let message = format!("Hello {who}, this is an AWS Lambda HTTP request");
+    let message = format!("Hello {who}, this is an AWS Lambda HTTP request. serverless.tf was here!");
 
     // Return something that implements IntoResponse.
     // It will be serialized to the right response event automatically by the runtime
diff --git a/examples/fixtures/rust-app1/.gitignore b/examples/fixtures/rust-app1/.gitignore
deleted file mode 100644
index ea8c4bf7..00000000
--- a/examples/fixtures/rust-app1/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target
diff --git a/examples/fixtures/rust-app1/Cargo.lock b/examples/fixtures/rust-app1/Cargo.lock
deleted file mode 100644
index 275caa9c..00000000
--- a/examples/fixtures/rust-app1/Cargo.lock
+++ /dev/null
@@ -1,1017 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "addr2line"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
-dependencies = [
- "gimli",
-]
-
-[[package]]
-name = "adler"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
-[[package]]
-name = "aho-corasick"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "async-stream"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
-dependencies = [
- "async-stream-impl",
- "futures-core",
- "pin-project-lite",
-]
-
-[[package]]
-name = "async-stream-impl"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
-
-[[package]]
-name = "aws_lambda_events"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7319a086b79c3ff026a33a61e80f04fd3885fbb73237981ea080d21944e1cb1c"
-dependencies = [
- "base64",
- "bytes",
- "http",
- "http-body",
- "http-serde",
- "query_map",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "backtrace"
-version = "0.3.73"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
-dependencies = [
- "addr2line",
- "cc",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
-]
-
-[[package]]
-name = "base64"
-version = "0.22.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
-
-[[package]]
-name = "bytes"
-version = "1.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "cc"
-version = "1.1.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6"
-dependencies = [
- "shlex",
-]
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "encoding_rs"
-version = "0.8.34"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "form_urlencoded"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
-dependencies = [
- "percent-encoding",
-]
-
-[[package]]
-name = "futures"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
- "futures-sink",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
-dependencies = [
- "futures-core",
- "futures-sink",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
-
-[[package]]
-name = "futures-executor"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
-dependencies = [
- "futures-core",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-io"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
-
-[[package]]
-name = "futures-macro"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "futures-sink"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
-
-[[package]]
-name = "futures-task"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
-
-[[package]]
-name = "futures-util"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-macro",
- "futures-sink",
- "futures-task",
- "memchr",
- "pin-project-lite",
- "pin-utils",
- "slab",
-]
-
-[[package]]
-name = "gimli"
-version = "0.29.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
-
-[[package]]
-name = "hermit-abi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
-
-[[package]]
-name = "http"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
-dependencies = [
- "bytes",
- "fnv",
- "itoa",
-]
-
-[[package]]
-name = "http-body"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
-dependencies = [
- "bytes",
- "http",
-]
-
-[[package]]
-name = "http-body-util"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
-dependencies = [
- "bytes",
- "futures-util",
- "http",
- "http-body",
- "pin-project-lite",
-]
-
-[[package]]
-name = "http-serde"
-version = "2.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f056c8559e3757392c8d091e796416e4649d8e49e88b8d76df6c002f05027fd"
-dependencies = [
- "http",
- "serde",
-]
-
-[[package]]
-name = "httparse"
-version = "1.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
-
-[[package]]
-name = "hyper"
-version = "1.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05"
-dependencies = [
- "bytes",
- "futures-channel",
- "futures-util",
- "http",
- "http-body",
- "httparse",
- "itoa",
- "pin-project-lite",
- "smallvec",
- "tokio",
- "want",
-]
-
-[[package]]
-name = "hyper-util"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9"
-dependencies = [
- "bytes",
- "futures-channel",
- "futures-util",
- "http",
- "http-body",
- "hyper",
- "pin-project-lite",
- "socket2",
- "tokio",
- "tower",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "idna"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
-
-[[package]]
-name = "lambda_http"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67fe279be7f89f5f72c97c3a96f45c43db8edab1007320ecc6a5741273b4d6db"
-dependencies = [
- "aws_lambda_events",
- "base64",
- "bytes",
- "encoding_rs",
- "futures",
- "futures-util",
- "http",
- "http-body",
- "http-body-util",
- "hyper",
- "lambda_runtime",
- "mime",
- "percent-encoding",
- "pin-project-lite",
- "serde",
- "serde_json",
- "serde_urlencoded",
- "tokio-stream",
- "url",
-]
-
-[[package]]
-name = "lambda_runtime"
-version = "0.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed49669d6430292aead991e19bf13153135a884f916e68f32997c951af637ebe"
-dependencies = [
- "async-stream",
- "base64",
- "bytes",
- "futures",
- "http",
- "http-body",
- "http-body-util",
- "http-serde",
- "hyper",
- "hyper-util",
- "lambda_runtime_api_client",
- "pin-project",
- "serde",
- "serde_json",
- "serde_path_to_error",
- "tokio",
- "tokio-stream",
- "tower",
- "tower-layer",
- "tracing",
-]
-
-[[package]]
-name = "lambda_runtime_api_client"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c90a10f094475a34a04da2be11686c4dcfe214d93413162db9ffdff3d3af293a"
-dependencies = [
- "bytes",
- "futures-channel",
- "futures-util",
- "http",
- "http-body",
- "http-body-util",
- "hyper",
- "hyper-util",
- "tokio",
- "tower",
- "tower-service",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
-
-[[package]]
-name = "libc"
-version = "0.2.158"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
-
-[[package]]
-name = "log"
-version = "0.4.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
-
-[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata 0.1.10",
-]
-
-[[package]]
-name = "memchr"
-version = "2.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
-
-[[package]]
-name = "mime"
-version = "0.3.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "mio"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
-dependencies = [
- "hermit-abi",
- "libc",
- "wasi",
- "windows-sys",
-]
-
-[[package]]
-name = "object"
-version = "0.36.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
-
-[[package]]
-name = "pin-project"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
-dependencies = [
- "pin-project-internal",
-]
-
-[[package]]
-name = "pin-project-internal"
-version = "1.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.86"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "query_map"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5eab6b8b1074ef3359a863758dae650c7c0c6027927a085b7af911c8e0bf3a15"
-dependencies = [
- "form_urlencoded",
- "serde",
- "serde_derive",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "regex"
-version = "1.10.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata 0.4.7",
- "regex-syntax 0.8.4",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-dependencies = [
- "regex-syntax 0.6.29",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax 0.8.4",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
-
-[[package]]
-name = "rust-app1"
-version = "0.1.0"
-dependencies = [
- "lambda_http",
- "tokio",
-]
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
-
-[[package]]
-name = "ryu"
-version = "1.0.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
-
-[[package]]
-name = "serde"
-version = "1.0.209"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.209"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.127"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad"
-dependencies = [
- "itoa",
- "memchr",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "serde_path_to_error"
-version = "0.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6"
-dependencies = [
- "itoa",
- "serde",
-]
-
-[[package]]
-name = "serde_urlencoded"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
-dependencies = [
- "form_urlencoded",
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "sharded-slab"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
-[[package]]
-name = "slab"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
-
-[[package]]
-name = "socket2"
-version = "0.5.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
-dependencies = [
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.76"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "thread_local"
-version = "1.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
-dependencies = [
- "cfg-if",
- "once_cell",
-]
-
-[[package]]
-name = "tinyvec"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
-[[package]]
-name = "tokio"
-version = "1.39.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5"
-dependencies = [
- "backtrace",
- "bytes",
- "libc",
- "mio",
- "pin-project-lite",
- "socket2",
- "tokio-macros",
- "windows-sys",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tokio-stream"
-version = "0.1.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
-dependencies = [
- "futures-core",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tower"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
-dependencies = [
- "futures-core",
- "futures-util",
- "pin-project",
- "pin-project-lite",
- "tokio",
- "tower-layer",
- "tower-service",
- "tracing",
-]
-
-[[package]]
-name = "tower-layer"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
-
-[[package]]
-name = "tower-service"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
-
-[[package]]
-name = "tracing"
-version = "0.1.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
-dependencies = [
- "log",
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
-dependencies = [
- "once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-serde"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1"
-dependencies = [
- "serde",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
-dependencies = [
- "matchers",
- "once_cell",
- "regex",
- "serde",
- "serde_json",
- "sharded-slab",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-serde",
-]
-
-[[package]]
-name = "try-lock"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
-dependencies = [
- "tinyvec",
-]
-
-[[package]]
-name = "url"
-version = "2.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
-dependencies = [
- "form_urlencoded",
- "idna",
- "percent-encoding",
-]
-
-[[package]]
-name = "valuable"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
-
-[[package]]
-name = "want"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
-dependencies = [
- "try-lock",
-]
-
-[[package]]
-name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-
-[[package]]
-name = "windows-sys"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_gnullvm",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
-
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
diff --git a/examples/multiple-regions/README.md b/examples/multiple-regions/README.md
index af982fc8..52da31c0 100644
--- a/examples/multiple-regions/README.md
+++ b/examples/multiple-regions/README.md
@@ -15,7 +15,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -75,4 +75,4 @@ No inputs.
 | <a name="output_lambda_role_name"></a> [lambda\_role\_name](#output\_lambda\_role\_name) | The name of the IAM role created for the Lambda Function |
 | <a name="output_local_filename"></a> [local\_filename](#output\_local\_filename) | The filename of zip archive deployed (if deployment was from local) |
 | <a name="output_s3_object"></a> [s3\_object](#output\_s3\_object) | The map with S3 object data of zip archive deployed (if deployment was from S3) |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/runtimes/README.md b/examples/runtimes/README.md
new file mode 100644
index 00000000..60c06c44
--- /dev/null
+++ b/examples/runtimes/README.md
@@ -0,0 +1,68 @@
+# Runtimes Examples
+
+Configuration in this directory creates deployment packages for [various runtimes and programming languages (Rust, Go, Java)](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html).
+
+Each runtime is executable by calling created Lambda Functions at the end.
+
+Look into [Build Package Examples](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/build-package) for more ways to build package (regardless of the runtime).
+
+## Usage
+
+To run this example you need to execute:
+
+```bash
+$ terraform init
+$ terraform plan
+$ terraform apply
+```
+
+Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
+
+<!-- BEGIN_TF_DOCS -->
+## Requirements
+
+| Name | Version |
+|------|---------|
+| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
+| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.63 |
+| <a name="requirement_http"></a> [http](#requirement\_http) | >= 3.0 |
+| <a name="requirement_random"></a> [random](#requirement\_random) | >= 3.0 |
+
+## Providers
+
+| Name | Version |
+|------|---------|
+| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 4.63 |
+| <a name="provider_http"></a> [http](#provider\_http) | >= 3.0 |
+| <a name="provider_random"></a> [random](#provider\_random) | >= 3.0 |
+
+## Modules
+
+| Name | Source | Version |
+|------|--------|---------|
+| <a name="module_go_lambda_function"></a> [go\_lambda\_function](#module\_go\_lambda\_function) | ../../ | n/a |
+| <a name="module_java21_lambda_function"></a> [java21\_lambda\_function](#module\_java21\_lambda\_function) | ../../ | n/a |
+| <a name="module_rust_lambda_function"></a> [rust\_lambda\_function](#module\_rust\_lambda\_function) | ../../ | n/a |
+
+## Resources
+
+| Name | Type |
+|------|------|
+| [random_pet.this](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/pet) | resource |
+| [aws_lambda_invocation.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/lambda_invocation) | data source |
+| [http_http.this](https://registry.terraform.io/providers/hashicorp/http/latest/docs/data-sources/http) | data source |
+
+## Inputs
+
+No inputs.
+
+## Outputs
+
+| Name | Description |
+|------|-------------|
+| <a name="output_go_lambda_function_url"></a> [go\_lambda\_function\_url](#output\_go\_lambda\_function\_url) | The URL of the Lambda Function in Go |
+| <a name="output_java21_lambda_function_arn"></a> [java21\_lambda\_function\_arn](#output\_java21\_lambda\_function\_arn) | The ARN of the Lambda Function in Java 21 |
+| <a name="output_lambda_function_result"></a> [lambda\_function\_result](#output\_lambda\_function\_result) | The results of the Lambda Function calls |
+| <a name="output_lambda_function_status_codes"></a> [lambda\_function\_status\_codes](#output\_lambda\_function\_status\_codes) | The status codes of the Lambda Function calls |
+| <a name="output_rust_lambda_function_url"></a> [rust\_lambda\_function\_url](#output\_rust\_lambda\_function\_url) | The URL of the Lambda Function in Rust |
+<!-- END_TF_DOCS -->
diff --git a/examples/runtimes/checks.tf b/examples/runtimes/checks.tf
new file mode 100644
index 00000000..cbf0f2b8
--- /dev/null
+++ b/examples/runtimes/checks.tf
@@ -0,0 +1,37 @@
+locals {
+  successful_response_keyword = "serverless.tf"
+}
+
+data "http" "this" {
+  for_each = {
+    rust = module.rust_lambda_function.lambda_function_url,
+    go   = module.go_lambda_function.lambda_function_url,
+  }
+
+  url = each.value
+
+  lifecycle {
+    postcondition {
+      condition     = length(regexall(local.successful_response_keyword, self.response_body)) > 0
+      error_message = "${each.key}: ${local.successful_response_keyword} should be in the response."
+    }
+  }
+}
+
+# I don't know how to make Java21 example to work with Lambda Function URL, so using Lambda Function invocation instead
+data "aws_lambda_invocation" "this" {
+  for_each = {
+    java21 = module.java21_lambda_function.lambda_function_name,
+  }
+
+  function_name = each.value
+
+  input = jsonencode({})
+
+  lifecycle {
+    postcondition {
+      condition     = length(regexall(local.successful_response_keyword, jsondecode(self.result))) > 0
+      error_message = "${each.key}: ${local.successful_response_keyword} should be in the response."
+    }
+  }
+}
diff --git a/examples/runtimes/java_eq_fun.tf b/examples/runtimes/java_eq_fun.tf
new file mode 100644
index 00000000..b4c995a1
--- /dev/null
+++ b/examples/runtimes/java_eq_fun.tf
@@ -0,0 +1,31 @@
+# Build the zip archive whenever the filename changes.
+# locals {
+#   java21_working_dir   = "${path.module}/runtimes/java21"
+#   java21_build_command = "gradle build -i"
+
+#   source_path   = local.java21_working_dir
+#   path_include  = ["**"]
+#   path_exclude  = ["**/.gradle/**", "**/build/**"]
+#   files_include = setunion([for f in local.path_include : fileset(local.source_path, f)]...)
+#   files_exclude = setunion([for f in local.path_exclude : fileset(local.source_path, f)]...)
+#   files         = sort(setsubtract(local.files_include, local.files_exclude))
+
+#   dir_sha = sha1(join("", [for f in local.files : filesha1("${local.source_path}/${f}")]))
+# }
+
+# resource "null_resource" "java21_build" {
+#   triggers = {
+#     # todo: Add tracking for content changes
+#     dir_sha = local.dir_sha
+#     command = local.java21_build_command
+#   }
+
+#   provisioner "local-exec" {
+#     working_dir = local.java21_working_dir
+#     command     = local.java21_build_command
+#   }
+# }
+
+# create_package         = false
+# local_existing_package = "${local.java21_working_dir}/build/distributions/java21.zip"
+# depends_on = [null_resource.java21_build]
diff --git a/examples/runtimes/main.tf b/examples/runtimes/main.tf
new file mode 100644
index 00000000..5529a90c
--- /dev/null
+++ b/examples/runtimes/main.tf
@@ -0,0 +1,98 @@
+provider "aws" {
+  region = "eu-west-1"
+}
+
+module "rust_lambda_function" {
+  source = "../../"
+
+  function_name = "${random_pet.this.id}-rust"
+
+  attach_cloudwatch_logs_policy     = false
+  cloudwatch_logs_retention_in_days = 1
+
+  create_lambda_function_url = true
+
+  handler       = "bootstrap"
+  runtime       = "provided.al2023"
+  architectures = ["arm64"] # x86_64 (empty); arm64 (cargo lambda build --arm64)
+
+  trigger_on_package_timestamp = false
+
+  source_path = [
+    {
+      path = "${path.module}/../fixtures/runtimes/rust"
+      commands = [
+        # https://www.cargo-lambda.info/
+        "cargo lambda build --release --arm64",
+        "cd target/lambda/rust-app1",
+        ":zip",
+      ]
+      patterns = [
+        "!.*",
+        "bootstrap",
+      ]
+    }
+  ]
+}
+
+module "go_lambda_function" {
+  source = "../../"
+
+  function_name = "${random_pet.this.id}-go"
+
+  attach_cloudwatch_logs_policy     = false
+  cloudwatch_logs_retention_in_days = 1
+
+  create_lambda_function_url = true
+
+  handler       = "bootstrap"
+  runtime       = "provided.al2023"
+  architectures = ["arm64"] # x86_64 (GOARCH=amd64); arm64 (GOARCH=arm64)
+
+  trigger_on_package_timestamp = false
+
+  source_path = [
+    {
+      path = "${path.module}/../fixtures/runtimes/go"
+      commands = [
+        "GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o bootstrap main.go",
+        ":zip",
+      ]
+      patterns = [
+        "!.*",
+        "bootstrap",
+      ]
+    }
+  ]
+}
+
+module "java21_lambda_function" {
+  source = "../../"
+
+  function_name = "${random_pet.this.id}-java21"
+
+  attach_cloudwatch_logs_policy     = false
+  cloudwatch_logs_retention_in_days = 1
+
+  handler       = "example.Handler"
+  runtime       = "java21"
+  architectures = ["arm64"] # x86_64 (GOARCH=amd64); arm64 (GOARCH=arm64)
+  timeout       = 30
+
+  trigger_on_package_timestamp = false
+
+  source_path = [
+    {
+      path = "${path.module}/../fixtures/runtimes/java21"
+      commands = [
+        "gradle build -i",
+        "cd build/output",
+        ":zip",
+      ]
+    }
+  ]
+}
+
+resource "random_pet" "this" {
+  length = 2
+}
diff --git a/examples/runtimes/outputs.tf b/examples/runtimes/outputs.tf
new file mode 100644
index 00000000..9c12c1d6
--- /dev/null
+++ b/examples/runtimes/outputs.tf
@@ -0,0 +1,24 @@
+output "rust_lambda_function_url" {
+  description = "The URL of the Lambda Function in Rust"
+  value       = module.rust_lambda_function.lambda_function_url
+}
+
+output "go_lambda_function_url" {
+  description = "The URL of the Lambda Function in Go"
+  value       = module.go_lambda_function.lambda_function_url
+}
+
+output "java21_lambda_function_arn" {
+  description = "The ARN of the Lambda Function in Java 21"
+  value       = module.java21_lambda_function.lambda_function_arn
+}
+
+output "lambda_function_result" {
+  description = "The results of the Lambda Function calls"
+  value       = { for k, v in data.aws_lambda_invocation.this : k => jsondecode(v.result) }
+}
+
+output "lambda_function_status_codes" {
+  description = "The status codes of the Lambda Function calls"
+  value       = { for k, v in data.http.this : k => v.status_code }
+}
diff --git a/examples/runtimes/variables.tf b/examples/runtimes/variables.tf
new file mode 100644
index 00000000..e69de29b
diff --git a/examples/runtimes/versions.tf b/examples/runtimes/versions.tf
new file mode 100644
index 00000000..e34e96ec
--- /dev/null
+++ b/examples/runtimes/versions.tf
@@ -0,0 +1,18 @@
+terraform {
+  required_version = ">= 1.0"
+
+  required_providers {
+    aws = {
+      source  = "hashicorp/aws"
+      version = ">= 4.63"
+    }
+    random = {
+      source  = "hashicorp/random"
+      version = ">= 3.0"
+    }
+    http = {
+      source  = "hashicorp/http"
+      version = ">= 3.0"
+    }
+  }
+}
diff --git a/examples/simple-cicd/README.md b/examples/simple-cicd/README.md
index 93d1e4c5..c9ba9046 100644
--- a/examples/simple-cicd/README.md
+++ b/examples/simple-cicd/README.md
@@ -16,7 +16,7 @@ To run this example you need to execute:
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -50,4 +50,4 @@ No inputs.
 ## Outputs
 
 No outputs.
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/simple/README.md b/examples/simple/README.md
index a8e129ab..efe37923 100644
--- a/examples/simple/README.md
+++ b/examples/simple/README.md
@@ -14,7 +14,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -33,7 +33,7 @@ Note that this example may create resources which cost money. Run `terraform des
 
 | Name | Source | Version |
 |------|--------|---------|
-| <a name="module_rust_lambda_function"></a> [rust\_lambda\_function](#module\_rust\_lambda\_function) | ../../ | n/a |
+| <a name="module_lambda_function"></a> [lambda\_function](#module\_lambda\_function) | ../../ | n/a |
 
 ## Resources
 
@@ -48,4 +48,4 @@ No inputs.
 ## Outputs
 
 No outputs.
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/simple/main.tf b/examples/simple/main.tf
index c95de3f7..20c51910 100644
--- a/examples/simple/main.tf
+++ b/examples/simple/main.tf
@@ -29,333 +29,304 @@ resource "random_pet" "this" {
 #  name = "/aws/lambda/us-east-1.${random_pet.this.id}-lambda-simple"
 #}
 
-module "rust_lambda_function" {
+module "lambda_function" {
   source = "../../"
 
-  # create_function = false
-
   publish = true
 
-  function_name = "${random_pet.this.id}-rust-lambda-simple"
-  handler       = "bootstrap"
-  runtime       = "provided.al2023"
-  architectures = ["arm64"]
-
-  create_lambda_function_url = true
+  function_name = "${random_pet.this.id}-lambda-simple"
+  handler       = "index.lambda_handler"
+  runtime       = "python3.12"
+
+  # role_maximum_session_duration = 7200
+
+  #  attach_cloudwatch_logs_policy = false
+
+  #  use_existing_cloudwatch_log_group = true
+
+  #  lambda_at_edge = true
+
+  #  independent_file_timestamps = true
+
+  #  store_on_s3 = true
+  #  s3_bucket   = module.s3_bucket.s3_bucket_id
+
+  #  create_package         = false
+  #  local_existing_package = data.null_data_source.downloaded_package.outputs["filename"]
+
+  # snap_start = true
+
+  #  policy_json = <<EOF
+  #{
+  #    "Version": "2012-10-17",
+  #    "Statement": [
+  #        {
+  #            "Effect": "Allow",
+  #            "Action": [
+  #                "xray:GetSamplingStatisticSummaries"
+  #            ],
+  #            "Resource": ["*"]
+  #        }
+  #    ]
+  #}
+  #EOF
+  #
+  #  policy   = "arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess"
+  #  policies = ["arn:aws:iam::aws:policy/AWSXrayReadOnlyAccess"]
+  #
+  #  policy_statements = {
+  #    dynamodb = {
+  #      effect    = "Allow",
+  #      actions   = ["dynamodb:BatchWriteItem"],
+  #      resources = ["arn:aws:dynamodb:eu-west-1:052212379155:table/Test"]
+  #    },
+  #    s3_read = {
+  #      effect    = "Deny",
+  #      actions   = ["s3:HeadObject", "s3:GetObject"],
+  #      resources = ["arn:aws:s3:::my-bucket/*"]
+  #    }
+  #  }
+
+  #  source_path = "${path.module}/../fixtures/python-app1/"
+
+  #  source_path = [
+  #    "${path.module}/../fixtures/python-app1/index.py",
+  #    {
+  #      pip_requirements = "${path.module}/../fixtures/python-app1/requirements.txt"
+  #      prefix_in_zip = "vendor"
+  #    }
+  #  ]
+
+  #  source_path = [
+  #    "${path.module}/../fixtures/python-app1/index.py",
+  #    "${path.module}/../fixtures/python-app1/dir1/dir2",
+  #    {
+  #      pip_requirements = "${path.module}/../fixtures/python-app1/requirements.txt"
+  #    }
+  #  ]
+
+  #  source_path = [
+  #    {
+  #      path = "${path.module}/../fixtures/python-app1"
+  #    }
+  #  ]
+
+  #  source_path = [
+  #    {
+  #      path = "${path.module}/../fixtures/python-app1"
+  #      pip_requirements = false
+  #    }
+  #  ]
+
+  #  source_path = [
+  #    {
+  #      path = "${path.module}/../fixtures/python-app1"
+  #      pip_requirements = true
+  #    }
+  #  ]
+
+  #  source_path = [
+  #    {
+  #      path = "${path.module}/../fixtures/python-app1"
+  #      commands = [
+  #        ":zip",
+  #        "cd `mktemp -d`",
+  #        "pip install --target=. -r ${path.module}/../fixtures/python-app1/requirements.txt",
+  #        ":zip . vendor/",
+  #      ]
+  #      patterns = [
+  #        "!vendor/colorful-0.5.4.dist-info/RECORD",
+  #        "!vendor/colorful-.+.dist-info/.*",
+  #        "!vendor/colorful/__pycache__/?.*",
+  #      ]
+  #    }
+  #  ]
 
   source_path = [
-    {
-      path = "${path.module}/../fixtures/rust-app1"
-      commands = [
-        "cargo lambda build --release --arm64",
-        "cd target/lambda/rust-app1",
-        ":zip",
-      ]
-      patterns = [
-        "bootstrap",
-      ]
-    }
+    #    {
+    #      pip_requirements = "${path.module}/../fixtures/python-app1/requirements.txt"
+    #      pip_requirements = "${path.module}/../deploy/requirements.txt"
+    #    },
+    "${path.module}/../fixtures/python-app1/index.py",
+    #    {
+    #      path = "${path.module}/../fixtures/python-app1/index.py"
+    #      patterns = <<END
+    #        # To use comments in heredoc patterns set the env var:
+    #        # export TF_LAMBDA_PACKAGE_PATTERN_COMMENTS=true
+    #        # The intent for comments just to use in examples and demo snippets.
+    #        # To write a comment start it with double spaces and the # sign
+    #        # if it follows a pattern.
+    #
+    #        !index\.py         # Exclude a file with 'index.py' name
+    #        index\..*          # Re-include
+    #      END
+    #    },
+    #    {
+    #      path = "${path.module}/../fixtures/dirtree"
+    #      #      prefix_in_zip = "vendor"
+    #      patterns = <<END
+    #        # To see step by step output how files and folders was skipped or added
+    #        # set an env var in your shell by a command similar to:
+    #        # export TF_LAMBDA_PACKAGE_LOG_LEVEL=DEBUG
+    #
+    #        # To play with this demo pattern you can go to a ../fixtures folder
+    #        # and run there a dirtree.sh script to create a demo dirs tree
+    #        # matchable by following patterns.
+    #
+    #      # !abc/.*           # Filter out everything in an abc folder with the folder itself
+    #      # !abc/.+           # Filter out just all folder's content but keep the folder even if it's empty
+    #         abc/def/.*       # Re-include everything in abc/def sub folder
+    #      # !abc/def/ghk/.*   # Filter out again in abc/def/ghk sub folder
+    #        !.*/fiv.*
+    #        !.*/zi--.*
+    #
+    #        ########################################################################
+    #        # Special cases
+    #
+    #        # !.*/  # Removes all explicit directories from a zip file, mean while
+    #                # the zip file still valid and unpacks correctly but will not
+    #                # contain any empty directories.
+    #
+    #        # !.*/bar/  # To remove just some directory use more qualified path to it.
+    #
+    #        # !([^/]+/){3,}  # Remove all directories more than 3 folders in depth.
+    #      END
+    #    }
   ]
-}
-
-# module "lambda_function" {
-#   source = "../../"
-
-#   publish = true
-
-#   function_name = "${random_pet.this.id}-rust-lambda-simple"
-#   handler       = "index.lambda_handler"
-#   runtime       = "python3.12"
-
-#   # role_maximum_session_duration = 7200
-
-#   #  attach_cloudwatch_logs_policy = false
-
-#   #  use_existing_cloudwatch_log_group = true
-
-#   #  lambda_at_edge = true
-
-#   #  independent_file_timestamps = true
-
-#   #  store_on_s3 = true
-#   #  s3_bucket   = module.s3_bucket.s3_bucket_id
-
-#   #  create_package         = false
-#   #  local_existing_package = data.null_data_source.downloaded_package.outputs["filename"]
-
-#   # snap_start = true
-
-#   #  policy_json = <<EOF
-#   #{
-#   #    "Version": "2012-10-17",
-#   #    "Statement": [
-#   #        {
-#   #            "Effect": "Allow",
-#   #            "Action": [
-#   #                "xray:GetSamplingStatisticSummaries"
-#   #            ],
-#   #            "Resource": ["*"]
-#   #        }
-#   #    ]
-#   #}
-#   #EOF
-#   #
-#   #  policy   = "arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess"
-#   #  policies = ["arn:aws:iam::aws:policy/AWSXrayReadOnlyAccess"]
-#   #
-#   #  policy_statements = {
-#   #    dynamodb = {
-#   #      effect    = "Allow",
-#   #      actions   = ["dynamodb:BatchWriteItem"],
-#   #      resources = ["arn:aws:dynamodb:eu-west-1:052212379155:table/Test"]
-#   #    },
-#   #    s3_read = {
-#   #      effect    = "Deny",
-#   #      actions   = ["s3:HeadObject", "s3:GetObject"],
-#   #      resources = ["arn:aws:s3:::my-bucket/*"]
-#   #    }
-#   #  }
-
-#   #  source_path = "${path.module}/../fixtures/python-app1/"
 
-#   #  source_path = [
-#   #    "${path.module}/../fixtures/python-app1/index.py",
-#   #    {
-#   #      pip_requirements = "${path.module}/../fixtures/python-app1/requirements.txt"
-#   #      prefix_in_zip = "vendor"
-#   #    }
-#   #  ]
-
-#   #  source_path = [
-#   #    "${path.module}/../fixtures/python-app1/index.py",
-#   #    "${path.module}/../fixtures/python-app1/dir1/dir2",
-#   #    {
-#   #      pip_requirements = "${path.module}/../fixtures/python-app1/requirements.txt"
-#   #    }
-#   #  ]
-
-#   #  source_path = [
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-app1"
-#   #    }
-#   #  ]
-
-#   #  source_path = [
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-app1"
-#   #      pip_requirements = false
-#   #    }
-#   #  ]
-
-#   #  source_path = [
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-app1"
-#   #      pip_requirements = true
-#   #    }
-#   #  ]
-
-#   #  source_path = [
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-app1"
-#   #      commands = [
-#   #        ":zip",
-#   #        "cd `mktemp -d`",
-#   #        "pip install --target=. -r ${path.module}/../fixtures/python-app1/requirements.txt",
-#   #        ":zip . vendor/",
-#   #      ]
-#   #      patterns = [
-#   #        "!vendor/colorful-0.5.4.dist-info/RECORD",
-#   #        "!vendor/colorful-.+.dist-info/.*",
-#   #        "!vendor/colorful/__pycache__/?.*",
-#   #      ]
-#   #    }
-#   #  ]
-
-#   source_path = [
-#     #    {
-#     #      pip_requirements = "${path.module}/../fixtures/python-app1/requirements.txt"
-#     #      pip_requirements = "${path.module}/../deploy/requirements.txt"
-#     #    },
-#     "${path.module}/../fixtures/python-app1/index.py",
-#     #    {
-#     #      path = "${path.module}/../fixtures/python-app1/index.py"
-#     #      patterns = <<END
-#     #        # To use comments in heredoc patterns set the env var:
-#     #        # export TF_LAMBDA_PACKAGE_PATTERN_COMMENTS=true
-#     #        # The intent for comments just to use in examples and demo snippets.
-#     #        # To write a comment start it with double spaces and the # sign
-#     #        # if it follows a pattern.
-#     #
-#     #        !index\.py         # Exclude a file with 'index.py' name
-#     #        index\..*          # Re-include
-#     #      END
-#     #    },
-#     #    {
-#     #      path = "${path.module}/../fixtures/dirtree"
-#     #      #      prefix_in_zip = "vendor"
-#     #      patterns = <<END
-#     #        # To see step by step output how files and folders was skipped or added
-#     #        # set an env var in your shell by a command similar to:
-#     #        # export TF_LAMBDA_PACKAGE_LOG_LEVEL=DEBUG
-#     #
-#     #        # To play with this demo pattern you can go to a ../fixtures folder
-#     #        # and run there a dirtree.sh script to create a demo dirs tree
-#     #        # matchable by following patterns.
-#     #
-#     #      # !abc/.*           # Filter out everything in an abc folder with the folder itself
-#     #      # !abc/.+           # Filter out just all folder's content but keep the folder even if it's empty
-#     #         abc/def/.*       # Re-include everything in abc/def sub folder
-#     #      # !abc/def/ghk/.*   # Filter out again in abc/def/ghk sub folder
-#     #        !.*/fiv.*
-#     #        !.*/zi--.*
-#     #
-#     #        ########################################################################
-#     #        # Special cases
-#     #
-#     #        # !.*/  # Removes all explicit directories from a zip file, mean while
-#     #                # the zip file still valid and unpacks correctly but will not
-#     #                # contain any empty directories.
-#     #
-#     #        # !.*/bar/  # To remove just some directory use more qualified path to it.
-#     #
-#     #        # !([^/]+/){3,}  # Remove all directories more than 3 folders in depth.
-#     #      END
-#     #    }
-#   ]
-
-#   #  source_path = [
-#   #    {
-#   #      #      path = "${path.module}/../fixtures/python-app1"
-#   #
-#   #      #      pip_requirements = true
-#   #      pip_requirements = "${path.module}/../fixtures/python-app1/requirements.txt"
-#   #      prefix_in_zip = "vendor"
-#   #      #      commands = ["pip install -r requirements.txt"]
-#   #
-#   #      #      patterns = <<END
-#   #      #        !.*/.*\.txt       # Filter all txt files recursively
-#   #      #        node_modules/.*   # Include empty dir or with a content if it exists
-#   #      #        node_modules/.+   # Include full non empty node_modules dir with its content
-#   #      #        node_modules/     # Include node_modules itself without its content
-#   #      #                          # It's also a way to include an empty dir if it exists
-#   #      #        node_modules      # Include a file or an existing dir only
-#   #      #
-#   #      #        !abc/.*           # Filter out everything in an abc folder
-#   #      #        abc/def/.*        # Re-include everything in abc/def sub folder
-#   #      #        !abc/def/ghk/.*   # Filter out again in abc/def/ghk sub folder
-#   #      #      END
-#   #
-#   #      patterns = [
-#   #        "**/*.txt",
-#   #        "",
-#   #        "",
-#   #      ]
-#   #    },
-#   #
-#   #  ]
-
-#   #  source_path = [
-#   #    "${path.module}/../fixtures/python-app1-extra",
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-appsadasdasd"
-#   #      prefix_in_zip = "foo/bar-bla",
-#   #      match = [
-#   #        "**/*.txt",
-#   #        "",
-#   #        "",
-#   #      ]
-#   #    },
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-app1"
-#   #      pip_requirements = true
-#   #      prefix_in_zip = "foo/bar",
-#   #      match = [
-#   #        "**/*.txt",
-#   #        "",
-#   #        "",
-#   #      ]
-#   #    },
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-app1"
-#   #      pip_requirements = "requirements.txt"
-#   #      prefix_in_zip = "foo/bar",
-#   #      match = [
-#   #        "!.*/.*\\.txt",
-#   #        "",
-#   #      ]
-#   #    },
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-app1"
-#   #      commands = [
-#   #        "npm install",
-#   #        ":zip"
-#   #      ]
-#   #      prefix_in_zip = "foo/bar",
-#   #      patterns = [
-#   #        "!.*/.*\\.txt", # Filter all txt files recursively
-#   #        "node_modules/.+", # Include
-#   #      ]
-#   #    },
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-app1"
-#   #      commands = [
-#   #        "npm install",
-#   #        ":zip"
-#   #      ]
-#   #      prefix_in_zip = "foo/bar", # By default everything installs into the root of a zip package
-#   #      patterns = <<END
-#   #        !.*/.*\.txt       # Filter all txt files recursively
-#   #        node_modules/.*   # Include empty dir or with a content if it exists
-#   #        node_modules/.+   # Include full non empty node_modules dir with its content
-#   #        node_modules/     # Include node_modules itself without its content
-#   #                          # It's also a way to include an empty dir if it exists
-#   #        node_modules      # Include a file or an existing dir only
-#   #
-#   #        !abc/.*           # Filter out everything in an abc folder
-#   #        abc/def/.*        # Re-include everything in abc/def sub folder
-#   #        !abc/def/ghk/*    # Filter out again in abc/def/ghk sub folder
-#   #      END
-#   #    },
-#   #    {
-#   #      path = "${path.module}/../fixtures/python-app1"
-#   #      commands = [
-#   #        "npm install",
-#   #        ":zip"
-#   #      ]
-#   #      prefix_in_zip = "foo/bar",
-#   #      patterns = [".*"]  # default
-#   #    }
-#   #  ]
-
-#   #  build_in_docker = true
-#   #  docker_pip_cache = true
-#   #  docker_with_ssh_agent = true
-#   #  docker_file = "${path.module}/../fixtures/python-app1/docker/Dockerfile"
-#   #  docker_build_root = "${path.module}/../../docker"
-#   #  docker_image = "public.ecr.aws/sam/build-python3.12"
-# }
+  #  source_path = [
+  #    {
+  #      #      path = "${path.module}/../fixtures/python-app1"
+  #
+  #      #      pip_requirements = true
+  #      pip_requirements = "${path.module}/../fixtures/python-app1/requirements.txt"
+  #      prefix_in_zip = "vendor"
+  #      #      commands = ["pip install -r requirements.txt"]
+  #
+  #      #      patterns = <<END
+  #      #        !.*/.*\.txt       # Filter all txt files recursively
+  #      #        node_modules/.*   # Include empty dir or with a content if it exists
+  #      #        node_modules/.+   # Include full non empty node_modules dir with its content
+  #      #        node_modules/     # Include node_modules itself without its content
+  #      #                          # It's also a way to include an empty dir if it exists
+  #      #        node_modules      # Include a file or an existing dir only
+  #      #
+  #      #        !abc/.*           # Filter out everything in an abc folder
+  #      #        abc/def/.*        # Re-include everything in abc/def sub folder
+  #      #        !abc/def/ghk/.*   # Filter out again in abc/def/ghk sub folder
+  #      #      END
+  #
+  #      patterns = [
+  #        "**/*.txt",
+  #        "",
+  #        "",
+  #      ]
+  #    },
+  #
+  #  ]
+
+  #  source_path = [
+  #    "${path.module}/../fixtures/python-app1-extra",
+  #    {
+  #      path = "${path.module}/../fixtures/python-appsadasdasd"
+  #      prefix_in_zip = "foo/bar-bla",
+  #      match = [
+  #        "**/*.txt",
+  #        "",
+  #        "",
+  #      ]
+  #    },
+  #    {
+  #      path = "${path.module}/../fixtures/python-app1"
+  #      pip_requirements = true
+  #      prefix_in_zip = "foo/bar",
+  #      match = [
+  #        "**/*.txt",
+  #        "",
+  #        "",
+  #      ]
+  #    },
+  #    {
+  #      path = "${path.module}/../fixtures/python-app1"
+  #      pip_requirements = "requirements.txt"
+  #      prefix_in_zip = "foo/bar",
+  #      match = [
+  #        "!.*/.*\\.txt",
+  #        "",
+  #      ]
+  #    },
+  #    {
+  #      path = "${path.module}/../fixtures/python-app1"
+  #      commands = [
+  #        "npm install",
+  #        ":zip"
+  #      ]
+  #      prefix_in_zip = "foo/bar",
+  #      patterns = [
+  #        "!.*/.*\\.txt", # Filter all txt files recursively
+  #        "node_modules/.+", # Include
+  #      ]
+  #    },
+  #    {
+  #      path = "${path.module}/../fixtures/python-app1"
+  #      commands = [
+  #        "npm install",
+  #        ":zip"
+  #      ]
+  #      prefix_in_zip = "foo/bar", # By default everything installs into the root of a zip package
+  #      patterns = <<END
+  #        !.*/.*\.txt       # Filter all txt files recursively
+  #        node_modules/.*   # Include empty dir or with a content if it exists
+  #        node_modules/.+   # Include full non empty node_modules dir with its content
+  #        node_modules/     # Include node_modules itself without its content
+  #                          # It's also a way to include an empty dir if it exists
+  #        node_modules      # Include a file or an existing dir only
+  #
+  #        !abc/.*           # Filter out everything in an abc folder
+  #        abc/def/.*        # Re-include everything in abc/def sub folder
+  #        !abc/def/ghk/*    # Filter out again in abc/def/ghk sub folder
+  #      END
+  #    },
+  #    {
+  #      path = "${path.module}/../fixtures/python-app1"
+  #      commands = [
+  #        "npm install",
+  #        ":zip"
+  #      ]
+  #      prefix_in_zip = "foo/bar",
+  #      patterns = [".*"]  # default
+  #    }
+  #  ]
+
+  #  build_in_docker = true
+  #  docker_pip_cache = true
+  #  docker_with_ssh_agent = true
+  #  docker_file = "${path.module}/../fixtures/python-app1/docker/Dockerfile"
+  #  docker_build_root = "${path.module}/../../docker"
+  #  docker_image = "public.ecr.aws/sam/build-python3.12"
+}
 
-# ####
-# # Download from remote and upload to S3
-# ####
-# #locals {
-# #  package_url = "https://github.com/antonbabenko/terraform-aws-anything/archive/master.zip"
-# #  downloaded  = "downloaded_package_${md5(local.package_url)}.zip"
-# #}
-# #
-# #resource "null_resource" "download_package" {
-# #  triggers = {
-# #    downloaded = local.downloaded
-# #  }
-# #
-# #  provisioner "local-exec" {
-# #    command = "curl -L -o ${local.downloaded} ${local.package_url}"
-# #  }
-# #}
-# #
-# #data "null_data_source" "downloaded_package" {
-# #  inputs = {
-# #    id       = null_resource.download_package.id
-# #    filename = local.downloaded
-# #  }
-# #}
+####
+# Download from remote and upload to S3
+####
+#locals {
+#  package_url = "https://github.com/antonbabenko/terraform-aws-anything/archive/master.zip"
+#  downloaded  = "downloaded_package_${md5(local.package_url)}.zip"
+#}
+#
+#resource "null_resource" "download_package" {
+#  triggers = {
+#    downloaded = local.downloaded
+#  }
+#
+#  provisioner "local-exec" {
+#    command = "curl -L -o ${local.downloaded} ${local.package_url}"
+#  }
+#}
+#
+#data "null_data_source" "downloaded_package" {
+#  inputs = {
+#    id       = null_resource.download_package.id
+#    filename = local.downloaded
+#  }
+#}
diff --git a/examples/triggers/README.md b/examples/triggers/README.md
index 0bfc0a69..ca40c3aa 100644
--- a/examples/triggers/README.md
+++ b/examples/triggers/README.md
@@ -15,7 +15,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -73,4 +73,4 @@ No inputs.
 | <a name="output_lambda_role_name"></a> [lambda\_role\_name](#output\_lambda\_role\_name) | The name of the IAM role created for the Lambda Function |
 | <a name="output_local_filename"></a> [local\_filename](#output\_local\_filename) | The filename of zip archive deployed (if deployment was from local) |
 | <a name="output_s3_object"></a> [s3\_object](#output\_s3\_object) | The map with S3 object data of zip archive deployed (if deployment was from S3) |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/with-efs/README.md b/examples/with-efs/README.md
index f835445d..0e008c4b 100644
--- a/examples/with-efs/README.md
+++ b/examples/with-efs/README.md
@@ -15,7 +15,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -75,4 +75,4 @@ No inputs.
 | <a name="output_lambda_role_name"></a> [lambda\_role\_name](#output\_lambda\_role\_name) | The name of the IAM role created for the Lambda Function |
 | <a name="output_local_filename"></a> [local\_filename](#output\_local\_filename) | The filename of zip archive deployed (if deployment was from local) |
 | <a name="output_s3_object"></a> [s3\_object](#output\_s3\_object) | The map with S3 object data of zip archive deployed (if deployment was from S3) |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/with-vpc-s3-endpoint/README.md b/examples/with-vpc-s3-endpoint/README.md
index d84f6bdc..1eebf085 100644
--- a/examples/with-vpc-s3-endpoint/README.md
+++ b/examples/with-vpc-s3-endpoint/README.md
@@ -16,7 +16,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -81,4 +81,4 @@ No inputs.
 | <a name="output_lambda_role_name"></a> [lambda\_role\_name](#output\_lambda\_role\_name) | The name of the IAM role created for the Lambda Function |
 | <a name="output_local_filename"></a> [local\_filename](#output\_local\_filename) | The filename of zip archive deployed (if deployment was from local) |
 | <a name="output_s3_object"></a> [s3\_object](#output\_s3\_object) | The map with S3 object data of zip archive deployed (if deployment was from S3) |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/examples/with-vpc/README.md b/examples/with-vpc/README.md
index 28844bbd..b1237350 100644
--- a/examples/with-vpc/README.md
+++ b/examples/with-vpc/README.md
@@ -16,7 +16,7 @@ $ terraform apply
 
 Note that this example may create resources which cost money. Run `terraform destroy` when you don't need these resources.
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -72,4 +72,4 @@ No inputs.
 | <a name="output_lambda_role_name"></a> [lambda\_role\_name](#output\_lambda\_role\_name) | The name of the IAM role created for the Lambda Function |
 | <a name="output_local_filename"></a> [local\_filename](#output\_local\_filename) | The filename of zip archive deployed (if deployment was from local) |
 | <a name="output_s3_object"></a> [s3\_object](#output\_s3\_object) | The map with S3 object data of zip archive deployed (if deployment was from S3) |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
diff --git a/modules/alias/README.md b/modules/alias/README.md
index 7744bbcc..4d1871d3 100644
--- a/modules/alias/README.md
+++ b/modules/alias/README.md
@@ -110,7 +110,7 @@ module "lambda" {
 * [Alias](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/alias) - Create Lambda function and aliases in various combinations with all supported features.
 
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -177,7 +177,7 @@ No modules.
 | <a name="output_lambda_alias_function_version"></a> [lambda\_alias\_function\_version](#output\_lambda\_alias\_function\_version) | Lambda function version which the alias uses |
 | <a name="output_lambda_alias_invoke_arn"></a> [lambda\_alias\_invoke\_arn](#output\_lambda\_alias\_invoke\_arn) | The ARN to be used for invoking Lambda Function from API Gateway |
 | <a name="output_lambda_alias_name"></a> [lambda\_alias\_name](#output\_lambda\_alias\_name) | The name of the Lambda Function Alias |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
 
 ## Authors
 
diff --git a/modules/deploy/README.md b/modules/deploy/README.md
index 26f2b00f..f5f5d8ec 100644
--- a/modules/deploy/README.md
+++ b/modules/deploy/README.md
@@ -95,7 +95,7 @@ module "lambda" {
 * [Deploy](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/deploy) - Creates Lambda Function, Alias, and all resources required to create deployments using AWS CodeDeploy.
 
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -191,7 +191,7 @@ No modules.
 | <a name="output_codedeploy_iam_role_name"></a> [codedeploy\_iam\_role\_name](#output\_codedeploy\_iam\_role\_name) | Name of IAM role used by CodeDeploy |
 | <a name="output_deploy_script"></a> [deploy\_script](#output\_deploy\_script) | Path to a deployment script |
 | <a name="output_script"></a> [script](#output\_script) | Deployment script |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
 
 ## Authors
 
diff --git a/modules/docker-build/README.md b/modules/docker-build/README.md
index d2c0aef8..bd223aaf 100644
--- a/modules/docker-build/README.md
+++ b/modules/docker-build/README.md
@@ -52,7 +52,7 @@ module "docker_image" {
 * [Container Image](https://github.com/terraform-aws-modules/terraform-aws-lambda/tree/master/examples/container-image) - Creates Docker Image, ECR resository and deploys it Lambda Function.
 
 
-<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- BEGIN_TF_DOCS -->
 ## Requirements
 
 | Name | Version |
@@ -116,7 +116,7 @@ No modules.
 |------|-------------|
 | <a name="output_image_id"></a> [image\_id](#output\_image\_id) | The ID of the Docker image |
 | <a name="output_image_uri"></a> [image\_uri](#output\_image\_uri) | The ECR image URI for deploying lambda |
-<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
+<!-- END_TF_DOCS -->
 
 ## Authors
 
diff --git a/wrappers/README.md b/wrappers/README.md
index 954ea7d1..5f2ad0d0 100644
--- a/wrappers/README.md
+++ b/wrappers/README.md
@@ -98,3 +98,42 @@ inputs = {
   }
 }
 ```
+
+<!-- BEGIN_TF_DOCS -->
+## Requirements
+
+| Name | Version |
+|------|---------|
+| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
+| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 5.32 |
+| <a name="requirement_external"></a> [external](#requirement\_external) | >= 1.0 |
+| <a name="requirement_local"></a> [local](#requirement\_local) | >= 1.0 |
+| <a name="requirement_null"></a> [null](#requirement\_null) | >= 2.0 |
+
+## Providers
+
+No providers.
+
+## Modules
+
+| Name | Source | Version |
+|------|--------|---------|
+| <a name="module_wrapper"></a> [wrapper](#module\_wrapper) | ../ | n/a |
+
+## Resources
+
+No resources.
+
+## Inputs
+
+| Name | Description | Type | Default | Required |
+|------|-------------|------|---------|:--------:|
+| <a name="input_defaults"></a> [defaults](#input\_defaults) | Map of default values which will be used for each item. | `any` | `{}` | no |
+| <a name="input_items"></a> [items](#input\_items) | Maps of items to create a wrapper from. Values are passed through to the module. | `any` | `{}` | no |
+
+## Outputs
+
+| Name | Description |
+|------|-------------|
+| <a name="output_wrapper"></a> [wrapper](#output\_wrapper) | Map of outputs of a wrapper. |
+<!-- END_TF_DOCS -->
diff --git a/wrappers/alias/README.md b/wrappers/alias/README.md
index a296ced7..0c40f21a 100644
--- a/wrappers/alias/README.md
+++ b/wrappers/alias/README.md
@@ -98,3 +98,39 @@ inputs = {
   }
 }
 ```
+
+<!-- BEGIN_TF_DOCS -->
+## Requirements
+
+| Name | Version |
+|------|---------|
+| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
+| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.9 |
+
+## Providers
+
+No providers.
+
+## Modules
+
+| Name | Source | Version |
+|------|--------|---------|
+| <a name="module_wrapper"></a> [wrapper](#module\_wrapper) | ../../modules/alias | n/a |
+
+## Resources
+
+No resources.
+
+## Inputs
+
+| Name | Description | Type | Default | Required |
+|------|-------------|------|---------|:--------:|
+| <a name="input_defaults"></a> [defaults](#input\_defaults) | Map of default values which will be used for each item. | `any` | `{}` | no |
+| <a name="input_items"></a> [items](#input\_items) | Maps of items to create a wrapper from. Values are passed through to the module. | `any` | `{}` | no |
+
+## Outputs
+
+| Name | Description |
+|------|-------------|
+| <a name="output_wrapper"></a> [wrapper](#output\_wrapper) | Map of outputs of a wrapper. |
+<!-- END_TF_DOCS -->
diff --git a/wrappers/deploy/README.md b/wrappers/deploy/README.md
index 5d24d8b2..67a7e162 100644
--- a/wrappers/deploy/README.md
+++ b/wrappers/deploy/README.md
@@ -98,3 +98,41 @@ inputs = {
   }
 }
 ```
+
+<!-- BEGIN_TF_DOCS -->
+## Requirements
+
+| Name | Version |
+|------|---------|
+| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
+| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 3.35 |
+| <a name="requirement_local"></a> [local](#requirement\_local) | >= 1.0 |
+| <a name="requirement_null"></a> [null](#requirement\_null) | >= 2.0 |
+
+## Providers
+
+No providers.
+
+## Modules
+
+| Name | Source | Version |
+|------|--------|---------|
+| <a name="module_wrapper"></a> [wrapper](#module\_wrapper) | ../../modules/deploy | n/a |
+
+## Resources
+
+No resources.
+
+## Inputs
+
+| Name | Description | Type | Default | Required |
+|------|-------------|------|---------|:--------:|
+| <a name="input_defaults"></a> [defaults](#input\_defaults) | Map of default values which will be used for each item. | `any` | `{}` | no |
+| <a name="input_items"></a> [items](#input\_items) | Maps of items to create a wrapper from. Values are passed through to the module. | `any` | `{}` | no |
+
+## Outputs
+
+| Name | Description |
+|------|-------------|
+| <a name="output_wrapper"></a> [wrapper](#output\_wrapper) | Map of outputs of a wrapper. |
+<!-- END_TF_DOCS -->
diff --git a/wrappers/docker-build/README.md b/wrappers/docker-build/README.md
index 093f989b..34b2dac4 100644
--- a/wrappers/docker-build/README.md
+++ b/wrappers/docker-build/README.md
@@ -98,3 +98,41 @@ inputs = {
   }
 }
 ```
+
+<!-- BEGIN_TF_DOCS -->
+## Requirements
+
+| Name | Version |
+|------|---------|
+| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.0 |
+| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.22 |
+| <a name="requirement_docker"></a> [docker](#requirement\_docker) | >= 3.0 |
+| <a name="requirement_null"></a> [null](#requirement\_null) | >= 2.0 |
+
+## Providers
+
+No providers.
+
+## Modules
+
+| Name | Source | Version |
+|------|--------|---------|
+| <a name="module_wrapper"></a> [wrapper](#module\_wrapper) | ../../modules/docker-build | n/a |
+
+## Resources
+
+No resources.
+
+## Inputs
+
+| Name | Description | Type | Default | Required |
+|------|-------------|------|---------|:--------:|
+| <a name="input_defaults"></a> [defaults](#input\_defaults) | Map of default values which will be used for each item. | `any` | `{}` | no |
+| <a name="input_items"></a> [items](#input\_items) | Maps of items to create a wrapper from. Values are passed through to the module. | `any` | `{}` | no |
+
+## Outputs
+
+| Name | Description |
+|------|-------------|
+| <a name="output_wrapper"></a> [wrapper](#output\_wrapper) | Map of outputs of a wrapper. |
+<!-- END_TF_DOCS -->