python - 如何将 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?
解决方案
根据与 Tim 的沟通,该问题是由 local 和 lambda 之间的库版本不兼容引起的。
解决此问题的最简单方法是使用 docker 映像lambci/lambda
通过以下命令构建包:
$ docker run -v $(pwd):/outputs -it --rm lambci/lambda:build-python3.6 pip install scrapy -t /outputs/
推荐阅读
- excel - 打开新建文本文件,另存为
- c++ - 按钮中图像的动态变化
- python - Jupyter 无法打开且无响应
- flutter - 如何在屏幕颤动之间绘制动画
- reactjs - 在drawend事件之后执行Openlayers select交互与draw交互
- delphi - Delphi 10 Seattle TabControl Style 像 Windows 中的 android
- node.js - Mongoose 只开启部分收藏
- pine-script - 如何克服“绘图”和“填充”功能限制
- javascript - Javascript从多个数组中查找所有重复项
- javascript - 阻止代码从 JS 中的检查元素运行?