Terraform aws_lambda_layer_version 为每次运行创建新版本

问题描述 投票:0回答:1

我有一个 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"

之间的关系

编辑: 比较两个连续的 tfstate 文件,哈希值是相同的。

aws-lambda terraform terraform-provider-aws aws-lambda-layers
1个回答
0
投票

我尝试提供示例演示代码,向您展示如何使用带有源代码哈希的 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]
  ...
}
© www.soinside.com 2019 - 2024. All rights reserved.