【发布时间】:2021-03-10 14:35:14
【问题描述】:
我遇到的问题与SO question 类似,但答案对我不起作用。
我正在尝试从 AWS Lambda 中的 /tmp 文件夹导入 Python 库(比如说 xgboost)。
库 requests 被添加到 Lambda 层,我所做的是:
import json
import io
import os
import zipfile
import requests
import sys
sys.path.insert(0, '/tmp/')
sys.path.append('/tmp/')
os.environ["PYTHONPATH"] = "/var/task"
def get_pkgs(url):
print("Getting Packages...")
re = requests.get(url)
z = zipfile.ZipFile(io.BytesIO(re.content))
print("Extracting Packages...")
z.extractall("/tmp/")
print("Packages are downloaded and extracted.")
def attempt_import():
print("="*50)
print("ATTEMPT TO IMPORT DEPENDENCIES...")
print("="*50)
import xgboost
print("IMPORTING DONE.")
def main():
URL = "https://MY_BUCKET.s3.MY_REGION.amazonaws.com/MY_FOLDER/xgboost/xgboost.zip"
get_pkgs(URL)
attempt_import()
def lambda_handler(event, context):
main()
return "Hello Lambda"
我得到的错误是[ERROR] ModuleNotFoundError: No module named 'xgboost'。我为我的 S3 存储桶提供了所有必要的权限,并且我确信 Lambda 可以访问 .zip 文件,因为 requests.get 有效并且变量 z 返回:
<zipfile.ZipFile file=<_io.BytesIO object at 0x7fddaf31c400> mode='r'>
【问题讨论】:
-
在 lambda 执行中下载包是在浪费你的 $。相反,您应该将依赖项打包到部署包中或构建 lambda 层。
-
@jellycsc 问题是我已经有 5 层的多个包,接近 260MB,这是限制。临时 lambda 文件夹有 512MB 的额外空间,所以这个解决方案对我有用。
-
好的,我明白了。那你可以试试EFS集成。
-
@jellycsc 你是说 Sagemaker 吗?您可以发送一些参考/材料吗?
-
不,这就是我的意思。 aws.amazon.com/blogs/compute/…
标签: python amazon-web-services amazon-s3 aws-lambda python-requests