使用 EFS 在 AWS Lambda 上安装 Python 依赖项

使用 efs 在 aws lambda 上安装 python 依赖项

使用 aws lambda 时,开发人员面临的常见挑战之一是管理大型 python 依赖项。 pandasshapelygeopandas 等库对于地理空间分析等任务至关重要,通常会超过 lambda 的 250 mb 解压层限制。一个实用的解决方案?将您的依赖项存储在 efs(弹性文件系统) 上并将其挂载到您的 lambda 函数。

在这篇文章中,我们将逐步介绍其设置过程,包括先决条件、主要优势和分步实施。

先决条件

这篇文章面向具有高级 aws 经验的用户。它假设您对 lambda、efs、vpc 和安全组等 aws 服务有深入的了解,并且熟悉管理基础设施和在云中部署可扩展的解决方案。
在我们深入设置之前,请确保您具备以下条件:

aws lambda 函数:您将使用 efs 配置的已部署 lambda 函数。efs 文件系统:在同一 aws 区域中创建的弹性文件系统。 efs 访问点:在同一 aws 区域中创建的 efs 访问点,根目录路径为 /data ,确保正确设置 posix 权限和目录创建权限,如下所示,1101 和 1001,次要组id 1002 和权限 0755。vpc 和网络:确保 lambda 函数与 efs 位于同一 vpc 中,并正确配置子网和安全组。iam 权限:您的 lambda 函数需要访问 efs 的权限。附加适当的策略(例如,elasticfilesystem:clientmount、elasticfilesystem:clientwrite)。

用于安装软件包的处理程序代码

处理程序直接在挂载到 aws lambda 函数的 amazon efs 存储上安装 python 依赖项。这种方法绕过了 lambda 层的大小限制,使其适用于地理空间数据处理通常需要的重依赖项,例如 pandas、geopandas 和 shapely。它确保 /mnt/data 目录中提供所需的库,供 lambda 在执行期间使用:

import osimport subprocesspackage_dir = "/mnt/data/lib/{}/site-packages/"def get_python_version_tag():    """generates a python version tag like 'python3.11'."""    return f"python{os.sys.version_info.major}.{os.sys.version_info.minor}"def install_package(package):    """installs a python package into the efs-mounted directory."""    target_dir = package_dir.format(get_python_version_tag())    os.makedirs(target_dir, exist_ok=true)    try:        subprocess.run(            [                "pip",                "install",                package,                "--target",                target_dir,                "--upgrade",                "--no-cache-dir",            ],            check=true,        )        print(f"package {package} installed successfully!")    except subprocess.calledprocesserror as e:        print(f"failed to install package {package}: {e}")def handler(event, context):    """aws lambda handler for installing packages."""    try:        # list of packages to install from the event input        packages = event.get("packages", [])        for package in packages:            install_package(package)        #optional for see packages installed        #os.system(f"ls -la {package_dir.format(get_python_version_tag())}")        return {"statuscode": 200, "body": "packages installed successfully!"}    except exception as e:        print(f"error: {e}")        return {"statuscode": 500, "body": f"an error occurred: {e}"}

测试步骤

调用 lambda 函数时,传递以下 json 负载:

{    "packages": ["requests", "pandas"]}

验证软件包安装

使用 ssh 会话或 aws cli 导航到您的 efs 挂载点(例如 /mnt/data/lib/)。
检查 site-packages/ 目录下已安装的软件包。
或者简单地使用 a 查看已安装的软件包

os.system(f"ls -la {package_dir.format(get_python_version_tag())}")

最终使用 lambda 中安装的依赖项

更新 lambda 函数的处理程序以包含安装在 efs 上的依赖项,这里的关键是将 efs 中的依赖项路径挂载到 lambda 处理程序的 pythonpath:

重要提示

所有希望使用已安装依赖项的 lambda 函数都必须将 efs 附加到 lambda。如果没有此附件,lambda 将无法访问 efs 上存储的所需依赖项。

import syssys.path.append("/mnt/data/lib/python3.11/site-packages/")  # Adjust Python version as needed# Dependencies are now available!!!import pandas as pd  def lambda_handler(event, context):    return {"message": "Dependencies loaded successfully!"}

主要优点

虽然直接在 efs 中安装 python 依赖项并不常见,但在 lambda 的默认限制(例如 250 mb 解压缩层大小)受到限制的情况下,它提供了某些优势。这种方法对于需要使用诸如 pandasshapelygeopandas 等繁重库进行地理空间计算的应用程序特别有用,这些库通常超出层大小限制。

立即学习“Python免费学习笔记(深入)”;

使用 efs 进行依赖关系的好处:

绕过 lambda 层大小限制:安装和使用库,无需担心打包限制。启用大规模地理空间处理:在无服务器环境中处理复杂的空间计算。简化依赖关系管理:动态添加或更新库,无需重新部署 lambda 函数。

该解决方案非常适合高级数据处理任务,例如地理空间分析,还可以根据需要轻松扩展存储,同时保持无服务器架构的灵活性。

以上就是使用 EFS 在 AWS Lambda 上安装 Python 依赖项的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1354226.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 18:22:34
下一篇 2025年12月13日 18:22:51

相关推荐

  • Python进程池为什么无法监听同一端口?

    进程池无法监听同一端口的原因 在并发编程中,通过使用进程池可以创建多个进程来同时处理任务。不过,在 python 中,进程池无法监听同一端口。这是因为: 端口独占性:操作系统通常不允许多个进程监听同一端口,除非它们是同一进程的子进程或线程。这是为了防止不同程序之间的端口冲突。 你的代码中,你尝试使用…

    2025年12月13日
    000
  • MongoDB适合企业级业务报表场景吗?

    MongoDB 是否适合企业业务报表场景? 在考虑使用 Python 和 MongoDB 构建原型系统时,开发者往往会面临 MySQL 和 MongoDB 的选择。MongoDB 的灵活性使其成为迭代快速的场景的理想选择,但人们普遍担心它在复杂业务报表中的表现。 MongoDB 的限制:Join 查…

    2025年12月13日
    000
  • Python多进程监听同一端口失败:为何线程池无法绑定相同端口?

    线程池无法绑定相同端口的原因 在本文档中,开发者试图实现类似 nginx、gunicorn 等 master-slave 架构,其中多个进程监听相同的端口。然而,在使用 python 的进程池时遇到了 oserror,提示“地址已被使用”。 原因在于,调用 init_serversocket 函数初…

    2025年12月13日
    000
  • 如何用Python遍历N级JSON并生成树状结构?

    遍历 n 级 json,生成树结构 本文档将介绍如何使用 python 遍历嵌套 json 数据,并将其转换为树状结构。 python 方案 python 提供了多种方法来遍历复杂 json 对象。例如,使用 json.loads() 将 json 字符串加载为 python 数据结构: 立即学习“…

    2025年12月13日
    000
  • MongoDB 能否胜任复杂的企业业务报表制作?

    使用 MongoDB 制作业务报表的可行性 对于使用 Python + MongoDB 进行快速迭代的原型系统,MongoDB 的灵活性确实很具有吸引力。但当涉及到复杂的数据查询,如企业业务报表时,一些开发者可能会疑问 MongoDB 是否能胜任。 挑战 MongoDB 的文档导向模式意味着它不支持…

    2025年12月13日
    000
  • 如何用Python递归打印JSON树状结构?

    如何用 python 深入遍历 json 结构,按树结构打印? 在处理复杂多层的 json 数据时,按层次结构打印其内容会更有条理和可读性。 问题: 本文提供了一个 json 结构,需要将其所有节点深度遍历并按树结构打印出来。 立即学习“Python免费学习笔记(深入)”; 答案: 为了实现嵌套 j…

    2025年12月13日
    000
  • 什么是 NullPointerException,如何修复它?

    空指针异常 (npe),表示为 java.lang.nullpointerexception,当 java 程序尝试在需要对象的地方使用空引用时发生。它是 java 中最常见的运行时异常之一,通常是由于尝试以下操作引起的: 在空对象上调用方法。 string str = null; str.leng…

    2025年12月13日
    000
  • MongoDB能否满足企业业务报告的复杂查询需求?

    MongoDB:企业业务报告的可行性 问题: 使用 MongoDB 加上 Python 构建原型系统时,是否可以满足企业业务报告需求? 回答: 当涉及复杂的 join 查询时,MongoDB 可能确实面临一些挑战。它不支持集合之间的 join 操作,也没有子查询,这对于处理复杂的 join 查询而言…

    2025年12月13日
    000
  • FastAPI中如何实现类似Flask g对象的全局数据容器?

    如何像 flask 一样在 fastapi 中使用全局数据容器? 对于希望在不同方法中使用用户身份等信息的情况,许多开发人员习惯了使用 flask 中的 g 对象。那么 fastapi 是否提供了类似的功能? 答案: fastapi 没有像 flask 的 g 对象这样的内置全局数据容器。但是,我们…

    2025年12月13日
    000
  • Python中__slots__如何影响实例属性的访问和修改?

    为什么修改类属性__slots__影响实例? 你提供的代码中出现了以下问题: class Person: __slots__ = (“name”) def __init__(self): self.name=13shili=Person()print(shili.name)# Person.name…

    2025年12月13日
    000
  • Python如何以树状结构打印多层嵌套JSON数据?

    如何用 python 遍历 n 级 json 并以树状打印 问题: 如何遍历并全量打印如下 json 数据中的所有节点,使其呈现树状结构? { “id”: “series”, “css”: “wrapper”, “html”: [ { “id”: “series”, “css”: “header”,…

    2025年12月13日
    000
  • Python中如何避免writelines()函数并在文件中打印带有换行符的列表?

    在文件中打印带有换行符的列表 要将列表写入文件时插入换行符,不能使用 writelines() 函数,因为它无法自动插入换行符。 解决方案 要实现所需行为,可以使用以下方法之一: 1. 循环写入: 立即学习“Python免费学习笔记(深入)”; with open(‘your_file.txt’, …

    2025年12月13日
    000
  • Python如何用换行符写入文本文件?

    如何用换行符写入文本文件? 此前我们介绍了如何使用 writelines() 将列表写入文件。然而,此方法不能插入换行符。 为了实现以换行符分隔列表项的写入,有几种方法: 使用循环 以下代码演示了如何使用循环逐行写入文件,并添加换行符: 立即学习“Python免费学习笔记(深入)”; with op…

    2025年12月13日
    000
  • Python中如何使用writelines()函数高效写入带换行符的列表到文件?

    用换行符写入列表到文件 通过使用 writelines() 函数将列表写入文件中时,可能会发现无法插入换行符。以下是如何实现生成换行符的方法: 循环法 可以使用循环逐行写入列表,同时插入换行符: 立即学习“Python免费学习笔记(深入)”; with open(‘your_file.txt’, ‘…

    2025年12月13日
    000
  • python session day-t payilagam for loop and if condition

    for 循环:for 循环用于迭代序列(即列表、元组、字典、集合或字符串)。 语法:对于序列中的变量 示例: txt = ‘1234’for num in txt: print(num,end=’ ‘)output:1 2 3 4 如果条件:if 语句的工作原理是检查表达式以查看是否满足条件,并根据…

    2025年12月13日
    000
  • 如何合并相同订单编号的字典,并按物流单号分组商品信息?

    合并列表中相同键字典生成新列表 问题: 你有许多字典组成的一个列表,需要将相同键的字典合并到一个新的列表中。这些字典表示订单及其商品的详细信息。你希望将具有相同订单编号的订单分组,然后根据每个订单的物流单号将商品分组。 具体来说,给定列表: data = [ {‘售后编号’: ‘123’, ‘订单编…

    2025年12月13日
    000
  • Python包内模块函数如何直接调用?

    直接调用模块内函数 原问题中遇到的情况是,一个包的不同模块之间的函数调用问题。 对于 python 包,可以通过在包的根目录下创建 __init__.py 文件并定义 __all__ 变量来指定可以直接调用的函数。例如: # ana/__init__.pyfrom .api import *__al…

    2025年12月13日
    000
  • 编程语言及其应用

    在编程方面,Python 已经巩固了自己作为世界上最受欢迎和广泛使用的语言之一的地位。其简单的语法、强大的功能和无与伦比的多功能性使其成为开发人员的最爱 – 无论他们是构建复杂的机器学习模型、自动化日常任务还是开发动态 Web 应用程序。 但是让我们具体谈谈 Web 开发。如果您曾经梦想…

    2025年12月13日
    000
  • 如何简化Python模块导入后的函数调用?

    模块导入中的函数调用简化 在导入模块后,通常需要通过指定模块名来调用其函数,如 jqdatasdk.get_all_securities。然而,对于自写模块,我们希望能够免去这一麻烦,直接调用函数。 要实现这一点,需要修改模块中的 __init__.py 文件。在 __init__.py 中,可以指…

    2025年12月13日
    000
  • IceCream:Python 中打印调试的甜蜜替代品

    厌倦了用打印语句来调试你的代码? icecream 是一个 python 库,它使调试变得轻松且更具可读性。让我们探索 icecream 如何让您的调试体验更加甜蜜。 安装 首先,使用 pip 安装 icecream: pip install icecream 基本用法 要使用 icecream,请…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信