Skip to content

Commit 3d9292d

Browse files
committed
refactor: split genai lambda layer into openai and langchain
1 parent 1c11515 commit 3d9292d

22 files changed

+203
-90
lines changed

api/terraform/lambda_info.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ resource "aws_lambda_function" "info" {
7272
handler = "openai_api.lambda_info.lambda_handler.handler"
7373
filename = data.archive_file.lambda_info.output_path
7474
source_code_hash = data.archive_file.lambda_info.output_base64sha256
75-
layers = [aws_lambda_layer_version.genai.arn]
75+
layers = [aws_lambda_layer_version.openai.arn]
7676
tags = var.tags
7777

7878
environment {

api/terraform/lambda_langchain.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ resource "aws_lambda_function" "lambda_langchain" {
7979
architectures = var.compatible_architectures
8080
filename = data.archive_file.lambda_langchain.output_path
8181
source_code_hash = data.archive_file.lambda_langchain.output_base64sha256
82-
layers = [aws_lambda_layer_version.genai.arn]
82+
layers = [aws_lambda_layer_version.openai.arn, aws_lambda_layer_version.langchain.arn]
8383
tags = var.tags
8484

8585
environment {

api/terraform/lambda_layer_genai.tf

Lines changed: 0 additions & 62 deletions
This file was deleted.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#------------------------------------------------------------------------------
2+
# written by: Lawrence McDaniel
3+
# https://lawrencemcdaniel.com/
4+
#
5+
# date: sep-2023
6+
#
7+
# usage: implement a Python Lambda layer with a virtual environment
8+
# that includes the packages required by langchain API and LangChain.
9+
#------------------------------------------------------------------------------
10+
locals {
11+
langchain_layer_slug = "langchain"
12+
langchain_layer_name = "layer_${local.langchain_layer_slug}"
13+
langchain_layer_parent_directory = "${path.module}/python"
14+
langchain_layer_source_directory = "${local.langchain_layer_parent_directory}/${local.langchain_layer_name}"
15+
langchain_layer_packaging_script = "${local.langchain_layer_source_directory}/create_container.sh"
16+
langchain_layer_package_folder = local.langchain_layer_slug
17+
langchain_layer_dist_build_path = "${path.module}/build/"
18+
langchain_layer_dist_package_name = "${local.langchain_layer_name}_dst.zip"
19+
}
20+
21+
###############################################################################
22+
# Python package
23+
# https://alek-cora-glez.medium.com/deploying-aws-lambda-function-with-terraform-custom-dependencies-7874407cd4fc
24+
###############################################################################
25+
resource "null_resource" "package_langchain_layer" {
26+
triggers = {
27+
redeployment = sha1(jsonencode([
28+
"${path.module}/lambda_layer.tf",
29+
file("${local.langchain_layer_packaging_script}"),
30+
file("${local.langchain_layer_source_directory}/Dockerfile"),
31+
file("${local.langchain_layer_source_directory}/create_container.sh"),
32+
file("${local.langchain_layer_source_directory}/requirements.txt"),
33+
fileexists("${local.langchain_layer_source_directory}/${local.langchain_layer_dist_package_name}") ? filebase64("${local.langchain_layer_source_directory}/${local.langchain_layer_dist_package_name}") : null
34+
]))
35+
}
36+
37+
provisioner "local-exec" {
38+
interpreter = ["/bin/bash"]
39+
command = local.langchain_layer_packaging_script
40+
41+
environment = {
42+
SOURCE_CODE_PATH = local.langchain_layer_source_directory
43+
RUNTIME = var.lambda_python_runtime
44+
CONTAINER_NAME = local.langchain_layer_name
45+
PACKAGE_NAME = local.langchain_layer_dist_package_name
46+
}
47+
}
48+
}
49+
50+
resource "aws_lambda_layer_version" "langchain" {
51+
filename = "${local.langchain_layer_source_directory}/${local.langchain_layer_dist_package_name}"
52+
source_code_hash = fileexists("${local.langchain_layer_source_directory}/${local.langchain_layer_dist_package_name}") ? filebase64sha256("${local.langchain_layer_source_directory}/${local.langchain_layer_dist_package_name}") : "default"
53+
layer_name = local.langchain_layer_slug
54+
compatible_architectures = var.compatible_architectures
55+
compatible_runtimes = [var.lambda_python_runtime]
56+
lifecycle {
57+
create_before_destroy = true
58+
}
59+
depends_on = [
60+
null_resource.package_langchain_layer
61+
]
62+
}

api/terraform/lambda_layer_nlp.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ resource "null_resource" "package_nlp_layer" {
3030
file("${local.nlp_layer_source_directory}/Dockerfile"),
3131
file("${local.nlp_layer_source_directory}/create_container.sh"),
3232
file("${local.nlp_layer_source_directory}/requirements.txt"),
33-
fileexists("${local.nlp_layer_source_directory}/${local.nlp_layer_dist_package_name}") ? filebase64("${local.nlp_layer_source_directory}/${local.nlp_layer_dist_package_name}") : null
33+
fileexists("${local.nlp_layer_source_directory}/${local.nlp_layer_dist_package_name}") ? filebase64("${local.nlp_layer_source_directory}/${local.nlp_layer_dist_package_name}") : "default"
3434
]))
3535
}
3636

api/terraform/lambda_layer_openai.tf

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#------------------------------------------------------------------------------
2+
# written by: Lawrence McDaniel
3+
# https://lawrencemcdaniel.com/
4+
#
5+
# date: sep-2023
6+
#
7+
# usage: implement a Python Lambda layer with a virtual environment
8+
# that includes the packages required by OpenAI API and LangChain.
9+
#------------------------------------------------------------------------------
10+
locals {
11+
openai_layer_slug = "openai"
12+
openai_layer_name = "layer_${local.openai_layer_slug}"
13+
openai_layer_parent_directory = "${path.module}/python"
14+
openai_layer_source_directory = "${local.openai_layer_parent_directory}/${local.openai_layer_name}"
15+
openai_layer_packaging_script = "${local.openai_layer_source_directory}/create_container.sh"
16+
openai_layer_package_folder = local.openai_layer_slug
17+
openai_layer_dist_build_path = "${path.module}/build/"
18+
openai_layer_dist_package_name = "${local.openai_layer_name}_dst.zip"
19+
}
20+
21+
###############################################################################
22+
# Python package
23+
# https://alek-cora-glez.medium.com/deploying-aws-lambda-function-with-terraform-custom-dependencies-7874407cd4fc
24+
###############################################################################
25+
resource "null_resource" "package_openai_layer" {
26+
triggers = {
27+
redeployment = sha1(jsonencode([
28+
"${path.module}/lambda_layer.tf",
29+
file("${local.openai_layer_packaging_script}"),
30+
file("${local.openai_layer_source_directory}/Dockerfile"),
31+
file("${local.openai_layer_source_directory}/create_container.sh"),
32+
file("${local.openai_layer_source_directory}/requirements.txt"),
33+
fileexists("${local.openai_layer_source_directory}/${local.openai_layer_dist_package_name}") ? filebase64("${local.openai_layer_source_directory}/${local.openai_layer_dist_package_name}") : "default"
34+
]))
35+
}
36+
37+
provisioner "local-exec" {
38+
interpreter = ["/bin/bash"]
39+
command = local.openai_layer_packaging_script
40+
41+
environment = {
42+
SOURCE_CODE_PATH = local.openai_layer_source_directory
43+
RUNTIME = var.lambda_python_runtime
44+
CONTAINER_NAME = local.openai_layer_name
45+
PACKAGE_NAME = local.openai_layer_dist_package_name
46+
}
47+
}
48+
}
49+
50+
resource "aws_lambda_layer_version" "openai" {
51+
filename = "${local.openai_layer_source_directory}/${local.openai_layer_dist_package_name}"
52+
source_code_hash = fileexists("${local.openai_layer_source_directory}/${local.openai_layer_dist_package_name}") ? filebase64sha256("${local.openai_layer_source_directory}/${local.openai_layer_dist_package_name}") : null
53+
layer_name = local.openai_layer_slug
54+
compatible_architectures = var.compatible_architectures
55+
compatible_runtimes = [var.lambda_python_runtime]
56+
lifecycle {
57+
create_before_destroy = true
58+
}
59+
depends_on = [
60+
null_resource.package_openai_layer
61+
]
62+
}

api/terraform/lambda_openai_function.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ resource "aws_lambda_function" "lambda_openai_function" {
7979
architectures = var.compatible_architectures
8080
filename = data.archive_file.lambda_openai_function.output_path
8181
source_code_hash = data.archive_file.lambda_openai_function.output_base64sha256
82-
layers = [aws_lambda_layer_version.genai.arn, aws_lambda_layer_version.nlp.arn]
82+
layers = [aws_lambda_layer_version.openai.arn, aws_lambda_layer_version.nlp.arn]
8383
tags = var.tags
8484

8585
environment {

api/terraform/lambda_openai_v2.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ resource "aws_lambda_function" "lambda_openai_v2" {
7979
architectures = var.compatible_architectures
8080
filename = data.archive_file.lambda_openai_v2.output_path
8181
source_code_hash = data.archive_file.lambda_openai_v2.output_base64sha256
82-
layers = [aws_lambda_layer_version.genai.arn]
82+
layers = [aws_lambda_layer_version.openai.arn]
8383
tags = var.tags
8484

8585
environment {

0 commit comments

Comments
 (0)