首页 > 解决方案 > 如何将 Scrapy 依赖项打包到 lambda?

问题描述

我正在编写一个依赖于Scrapy模块的 python 应用程序。它在本地运行良好,但当我从 aws lambda 测试控制台运行它时失败。我的 python 项目有一个requirements.txt具有以下依赖项的文件:

scrapy==1.6.0

我通过以下链接打包了所有依赖项:https ://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html 。而且,我将我的源代码*.py放在 zip 文件的根目录中。可以找到我的包脚本https://github.com/zhaoyi0113/quote-datalake/blob/master/bin/deploy.sh

它基本上做了两件事,首先运行命令pip install -r requirements.txt -t dist将所有依赖项下载到dist目录。其次,将app python源代码复制到dist目录。

部署通过以下方式完成terraform,下面是配置文件。

provider "aws" {
  profile    = "default"
  region     = "ap-southeast-2"
}

variable "runtime" {
  default = "python3.6"
}

data "archive_file" "zipit" {
    type        = "zip"
    source_dir  = "crawler/dist"
    output_path = "crawler/dist/deploy.zip"
}
resource "aws_lambda_function" "test_lambda" {
  filename      = "crawler/dist/deploy.zip"
  function_name = "quote-crawler"
  role          = "arn:aws:iam::773592622512:role/LambdaRole"
  handler       = "handler.handler"
  source_code_hash = "${data.archive_file.zipit.output_base64sha256}"
  runtime = "${var.runtime}"
}

它压缩目录并将文件上传到 lambda。

我发现Unable to import module 'handler': cannot import name 'etree'当有语句时我在 lambda 中得到运行时错误import scrapy。我没有etree在我的代码中使用,所以我相信scrapy.

我的源代码可以在https://github.com/zhaoyi0113/quote-datalake/tree/master/crawler. 只有两个简单的 python 文件。

如果我在本地运行它们,它工作正常。该错误仅出现在 lambda 中。有没有不同的方法来打包scrapy到 lambda?

标签: pythonaws-lambdascrapy

解决方案


根据与 Tim 的沟通,该问题是由 local 和 lambda 之间的库版本不兼容引起的。

解决此问题的最简单方法是使用 docker 映像lambci/lambda通过以下命令构建包:

$ docker run -v $(pwd):/outputs -it --rm lambci/lambda:build-python3.6 pip install scrapy -t /outputs/

推荐阅读