AWS Lambda Layer 如何压缩文件夹而不是 terraform 中的文件夹内容

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

我的 lambda 和 lambda 层有这个 terraform 代码:

#lambda
resource "aws_lambda_function" "sql_automation_lambda" {
  function_name    = "${var.project_name}${var.environment}-NAME"
  handler          = "lambda_handler.lambda_handler"
  role             = IAM_ROLE
  runtime          = "python3.9"
  filename         = PATH
  layers           = [aws_lambda_layer_version.my_layer.arn]
}

# create zip file from requirements.txt. Triggers only when the file is updated
resource "null_resource" "lambda_layer" {
  triggers = {
    requirements = filesha1("${path.module}/files/requirements.txt")
  }
  # the command to install python and dependencies to the machine and zips

  provisioner "local-exec" {
    command = "python3 -m pip install -r ${"${path.module}/files/requirements.txt"} -t ${path.module}/python"
  }
}

#Create zip file
data "archive_file" "layer" {
  type        = "zip"
  source_dir  = "${path.module}/python"
  output_path = "${path.module}/python.zip"
  depends_on  = [null_resource.lambda_layer]
}

resource "aws_lambda_layer_version" "my_layer" {
  layer_name          = "python"
  filename            = data.archive_file.layer.output_path
  source_code_hash    = data.archive_file.layer.output_base64sha256
  compatible_runtimes = ["python3.11", "python3.10", "python3.8", "python3.9", "python3.7"]
}

一切都可以毫无问题地创建,但是当我测试 lambda 时,我收到错误“[ERROR] Runtime.ImportModuleError:无法导入模块 [...] 没有名为 [...] 的模块”

我知道如何修复错误 - 确保我设置了 lambda 层,以便所有内容都在一个名为“python”的目录中 - 我手动创建了一个层,我只需右键单击我的 python 文件夹并单击压缩,然后将其作为 lambda 层上传,并且可以正常工作。

当我通过 terraform 创建它时,似乎发生的情况是我认为 python 目录的内容正在被压缩,而不是文件夹本身。因为当我转到 lambda 并下载它时,它将下载为 python-[RANDOM_STRING].zip,这是预期的,因为这与 aws 层版本控制相关。

但是当我解压它时,该目录也将被称为“python-[RANDOM_STRING]”,而不仅仅是 python。因此我的 lambda 无法工作,因为它不再被称为“python”

如果我回到手动制作的 lambda 层,它将下载为“python-[RANDOM_STRING].zip”,当我解压它时,我会按预期获得“python”目录,这就是我想要的。

所以基本上在这个屏幕截图中,您可以看到,当我解压缩手动制作的压缩测试层时,其中的文件夹是“python”。由 terraform 制成的那个刚刚被解压为相同的图层名称

有人知道如何在我的 terraform 代码中解决这个问题吗?

amazon-web-services aws-lambda terraform zip archive
1个回答
0
投票

设法通过将“python”文件夹移动到另一个文件夹,然后压缩新文件夹来解决此问题。所以我的代码现在是:

# create zip file from requirements.txt. Triggers only when the file is updated
resource "null_resource" "lambda_layer" {
  triggers = {
    requirements = filesha1("${path.module}/files/requirements.txt")
  }
  # the command to install python and dependencies to the machine and zips

  provisioner "local-exec" {
    command = "python3 -m pip install -r ${"${path.module}/files/requirements.txt"} -t ${path.module}/**layer/**python"
  }
}

#Create zip file
data "archive_file" "layer" {
  type        = "zip"
  source_dir  = "${path.module}/**layer**"
  output_path = "${path.module}/python.zip"
  depends_on  = [null_resource.lambda_layer]
}
© www.soinside.com 2019 - 2024. All rights reserved.