我有一个 terraform 配置来在 AWS 中创建 lambda 层,
variable "package_name" {
type = string
description = "name of the lambda layer"
default = "google-cloud-bigquery"
}
resource "null_resource" "install_package" {
provisioner "local-exec" {
working_dir = path.module
command = "chmod +x build_lambda_layer_package.sh; ./build_lambda_layer_package.sh ${var.package_name}"
}
triggers = {
id = var.package_name
always_update = timestamp()
}
}
data "archive_file" "lambda_zip" {
type = "zip"
source_dir = "${path.module}/${var.package_name}"
output_path = "${path.module}/${var.package_name}.zip"
depends_on = [null_resource.install_package]
}
# AWS Lambda Layer
resource "aws_lambda_layer_version" "layer_google_cloud_bigquery" {
filename = data.archive_file.lambda_zip.output_path
source_code_hash = data.archive_file.lambda_zip.output_base64sha256
layer_name = var.package_name
compatible_runtimes = var.layer_compatible_runtimes
compatible_architectures = var.layer_compatible_architectures
depends_on = [data.archive_file.lambda_zip]
}
build_lambda_layer_package.sh
#!/bin/bash
# Check if the package name is provided as argument
if [ $# -eq 0 ]; then
echo "Usage: $0 <package_name>"
exit 1
fi
# Package name provided as argument
PACKAGE_NAME="$1"
# Define the target directory for your AWS Lambda layer Python packages
TARGET_DIR="${PACKAGE_NAME}/python"
# Create the directory structure
mkdir -p $TARGET_DIR
# Install the package into the target directory
pip3 install $PACKAGE_NAME -t $TARGET_DIR
当我第一次执行
terraform apply
时,它会创建一个版本。但是当我再次应用时,它会破坏旧版本并再次创建新版本,即使 source_code_hash
没有改变。
如果已存在具有相同
source_code_hash
的图层,我想避免创建新版本。
值得注意的是,如果我删除
null_resource
块并手动创建 google-cloud-bigquery.zip
zip 文件,则 aws_lambda_layer_version
不会创建新版本。我似乎无法理解"null_resource" "install_package"
和"aws_lambda_layer_version" "layer_google_cloud_bigquery"
之间的关系
我尝试提供示例演示代码,向您展示如何使用带有源代码哈希的 lambda 层的 zip 文件。在运行时
terraform plan
它将检查 zip 文件的哈希值,并且仅在该哈希值已更改时部署该层。
这样,如果
src/lambda-layer
中有任何代码更改,则只会使用新版本创建 lambda 层。如果没有代码更改,则不会创建新的图层版本。
data "archive_file" "layer_zip" {
type = "zip"
output_path = "lambda-layer.zip"
source_dir = "../src/lambda-layer"
}
resource "aws_lambda_layer_version" "main" {
layer_name = "example-lambda-layer"
filename = "lambda-layer.zip"
description = "This is an example layer."
compatible_runtimes = "nodejs20.x"
license_info = "MIT"
source_code_hash = data.archive_file.layer_zip.output_base64sha256
}
resource "aws_lambda_function" "main" {
function_name = "example-lambda-function"
layers = [aws_lambda_layer_version.main.arn]
...
}