【问题标题】:create utils.py in AWS lambda在 AWS lambda 中创建 utils.py
【发布时间】:2021-12-30 08:27:38
【问题描述】:

我的home/file.py 文件中有一个def hello() 函数。我创建了一个home/common/utils.pyfile 并将函数移到那里。 现在,我想将它导入我的文件file.py

我是这样导入的:from utils import hellofrom common.utils import hello,我的文件中的导入不会引发错误。但是,当我在 AWS Lambda 上运行它时,我收到一个错误:

Runtime.ImportModuleError: Unable to import module 'file': No module named 'utils'

我该如何解决这个问题?无需使用 Ec2 之类的...

data "archive_file" "file_zip" {
  type             = "zip"
  source_file      = "${path.module}/src/file.py"
  output_file_mode = "0666"
  output_path      = "${path.module}/bin/file.zip"
}

【问题讨论】:

  • 您上传到 Lambda 的打包 ZIP 文件中的文件层次结构是什么?
  • 不确定你的意思..我只是运行 terraform init,应用它会自动发生。如何检查结构@jarmod
  • 部署 Lambda 函数时,无论您使用哪种 IaC 工具,您都将提供一个打包的部署工件(代码和依赖项的 ZIP 文件)。例如,您通常通过将代码和依赖项压缩到 lambda.zip 中来做到这一点,然后在 Terraform 模板的 aws_lambda_function 资源中指明该文件,然后 Terraform 获取并部署它。
  • 我用压缩文件内容的方式更新了 qs。不确定这是否是你所说的层次结构@jarmod

标签: python python-3.x amazon-web-services aws-lambda terraform


【解决方案1】:

您上传的部署包仅包含您的主要 Python 脚本 (file.py)。具体来说,它不包含任何依赖项,例如 common/utils.py。这就是代码在 Lambda 中运行时导入失败的原因。

修改您的部署包 (file.zip) 的 creation,使其包含所有需要的依赖项。

例如:

data "archive_file" "file_zip" {
  type             = "zip"
  output_file_mode = "0666"
  output_path      = "${path.module}/bin/file.zip"

  source {
    content  = file("${path.module}/src/file.py")
    filename = "file.py"
  }

  source {
    content  = file("${path.module}/src/common/utils.py")
    filename = "common/utils.py"
  }
}

如果您的所有文件碰巧都在一个文件夹中,那么您可以使用source_dir 而不是指示单个文件。

注意:我不使用 Terraform,所以带有嵌入插值的 file(...) 可能不是 100% 正确,但你明白了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 2015-04-20
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2018-02-16
    相关资源
    最近更新 更多