【问题标题】:Importing a package from AWS lambda temp directory in Python 3.8从 Python 3.8 中的 AWS lambda 临时目录导入包
【发布时间】: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


【解决方案1】:

您可以尝试使用 boto3 库将文件从 S3 下载到 /tmp 目录,如中所述 https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.download_file

import boto3
s3 = boto3.resource('s3')
s3.meta.client.download_file('mybucket', 'hello.txt', '/tmp/hello.txt')

【讨论】:

  • 这可能是解决方案,但问题是当您尝试导入大型python包(例如xgboost)时,下载的.zip文件及其在tmp目录中的提取文件夹更大超过 500MB 导致:[ERROR] OSError: [Errno 28] No space left on device
【解决方案2】:

实际上,我上面的代码有效,但我遇到了一个相当愚蠢的错误。我实际上并没有压缩 xgboost 包文件夹(xgboostxgboost.libsxgboost.dist-info),而是压缩了我命名为 package-xgoboost 的父文件夹,但这在 AWS lambda 中不起作用。确保您实际上直接压缩了这 3 个文件夹。

另外,请确保您的 xgboost 库是最新的。以前我使用的版本 1.2.1 也不起作用。升级库并压缩最新的xgboost 版本(在我的例子中是 1.3.3)终于奏效了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2020-12-06
    • 2016-12-27
    • 2012-07-08
    • 2021-07-07
    • 1970-01-01
    • 2018-06-30
    相关资源
    最近更新 更多