Pip 在 AWS Lambda 中安装 Python 包?

2023-12-29

我正在尝试在 AWS Lambda 函数中 pip install 包。

Amazon 推荐的方法是创建一个压缩的部署包,其中包含依赖项和 python 函数(如Python 中的 AWS Lambda 部署包 https://docs.aws.amazon.com/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html)。但是,这会导致无法在 AWS Lambda GUI 中使用内联代码编辑来编辑 Lambda 函数。

因此,我想在 AWS Lambda 函数本身内 pip 安装该包。在 AWS Lambda 中,除了 /tmp/ 目录之外,文件系统是只读的,因此我尝试将 pip 安装到 /tmp/ 目录。该函数每天仅调用一次,因此我不介意每次运行该函数时重新安装软件包所需的几秒钟时间。

我的尝试

def lambda_handler(event, context):
    # pip install dependencies
    print('begin lambda handler')
    import subprocess
    import sys
    subprocess.call('pip install cryptography -t /tmp/ --no-cache-dir'.split())
    from cryptography.fernet import Fernet
    pwd_encrypted = b'gAAAAABeTcT0OXH96ib7TD5-sTII6jMfUXPhMpwWRCF0315rWp4C0yav1XAPIn7prfkkA4tltYiWFAJ22bwuaj0z1CKaGl8vTgNd695SDl25HnLwu1xTzaQ='
    key = b'fP-7YR1hUeVW4KmFmly4JdgotD6qjR52g11RQms6Llo='
    cipher_suite = Fernet(key)
    result = cipher_suite.decrypt(pwd_encrypted).decode('utf-8')
    print(result)
    print('end lambda handler')

但是,这会导致错误

[错误] ModuleNotFoundError:没有名为“加密”的模块

我也尝试过更换子流程按照以下建议进行调用这个 stackoverflow 答案 https://stackoverflow.com/a/50255019/11918892

    cmd = sys.executable+' -m pip install cryptography -t dependencies --no-cache-dir'
    subprocess.check_call(cmd.split())

但是,这会导致错误

OSError: [Errno 30] 只读文件系统: '/var/task/dependencies'


我通过对最初尝试的一行调整解决了这个问题。您只需将 /tmp/ 添加到 sys.path 中,以便 Python 知道在 /tmp/ 中搜索该模块。您需要做的就是添加以下行sys.path.insert(1, '/tmp/').

Solution

import os
import sys
import subprocess

# pip install custom package to /tmp/ and add to path
subprocess.call('pip install cryptography -t /tmp/ --no-cache-dir'.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
sys.path.insert(1, '/tmp/')
from cryptography.fernet import Fernet

def lambda_handler(event, context):
    # pip install dependencies
    pwd_encrypted = b'gAAAAABeTcT0OXH96ib7TD5-sTII6jMfUXPhMpwWRCF0315rWp4C0yav1XAPIn7prfkkA4tltYiWFAJ22bwuaj0z1CKaGl8vTgNd695SDl25HnLwu1xTzaQ='
    key = b'fP-7YR1hUeVW4KmFmly4JdgotD6qjR52g11RQms6Llo='
    cipher_suite = Fernet(key)
    result = cipher_suite.decrypt(pwd_encrypted).decode('utf-8')
    print(result)

Output

你好,堆栈溢出!

注意 - 正如 @JohnRotenstein 在评论中提到的,添加 Python 包的首选方法是将依赖项打包在AWS Lambda 层 https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html。我的解决方案只是表明可以直接在 AWS Lambda 函数中 pip install 包。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pip 在 AWS Lambda 中安装 Python 包? 的相关文章

随机推荐

  • C# 调用 C++ DLL 传递指针到指针参数

    你们能帮我解决以下问题吗 我有一个 C 函数 dll 它将由另一个 C 应用程序调用 我需要的功能之一如下 struct DataStruct unsigned char data int len DLLAPI int API ReadFi
  • pandas.DataFrame 子类的属性在 pickle 后消失

    我试图将属性添加到 pandas DataFrame 的子类中 它们在酸洗和取消酸洗后消失 import cPickle import pandas as pd class MyClass pd DataFrame def init sel
  • 使用 C# 反序列化具有一个空白键的深度嵌套 Json

    我正在尝试将下面的嵌套 Json 反序列化为自定义 c 类型 该类型也在下面进行了描述 但我不断将反序列化对象中的路径键设置为 null 下面是代码 任何有关如何正确反序列化的建议都非常感谢 Json swagger 2 0 info ve
  • Android:strings.xml的默认语言

    我将翻译我的应用程序 strings xml 文件 strings xml 文件的默认语言是什么 因为现在我需要支持意大利语 我现在编写 strings xml 的语言 和英语 我应该使用 string xml 来表示英语并创建 资源 值
  • 带有消息队列的任务处理状态

    我正在开发一个产品数据导入系统 该系统从外部源下载产品数据 将其转换为正确的模式 并存储结果 本质上是一个 ETL 系统 系统处理的核心消息类型是 ImportProductCommand 它指定要导入的产品和来源 然而 导入命令很少单独发
  • 如何使用 JWT + HttpOnly Cookie 正确刷新令牌?

    我已经使用 JWT HttpOnly Cookies 在我的 AspNetCore API 应用程序中成功设置了身份验证 灵感来自this https stormpath com blog token authentication asp
  • Rails 3:无法验证 CSRF 令牌的真实性

    当我尝试通过 REST 客户端发布数据时 我收到这样的警告 Warning Can t verify CSRF token authenticity 怎么解决这个问题 我相信你正在努力做一个POST from a link 默认情况下lin
  • 如何将 PHP 的 stream_select() 与 zlib 过滤器结合使用?

    我目前有一个用 PHP 编写的服务器守护进程 它接受传入连接并使用以下命令为它们创建网络流stream socket 函数并使用轮询活动流stream select 我希望能够添加一个 zlib 过滤器 使用string filter ap
  • Django 版本 1.5:“url”需要非空的第一个参数。 Django 1.5 中的语法发生了变化

    我开始使用 Django 1 5 版 但我的旧代码出现了问题 a href h3 post title h3 a 错误 url 需要非空的第一个参数 Django 1 5 中的语法发生了变化 请参阅文档 文件 一个值得注意的已弃用功能是转向
  • 当单词以 n-gram 开头时,Elasticsearch Edge NGram 分词器得分更高

    假设与 Edge NGram Tokenizer 有以下映射 settings analysis analyzer autocomplete analyzer tokenizer autocomplete tokenizer filter
  • 不同活动中的相同导航抽屉

    我制作了一个工作导航抽屉 如教程中所示开发者 android com http developer android com网站 但现在 我想使用一个导航抽屉 它是我在 NavigationDrawer class 中为我的应用程序中的多个活
  • Python、Unicode 和 Windows 控制台

    当我尝试printWindows 控制台中的字符串 有时我会收到一条错误消息UnicodeEncodeError charmap codec can t encode character 我认为这是因为 Windows 控制台无法处理所有
  • mediawiki mathjax需要使用转义$x$

    我将 MediaWiki 与 MathJax 一起使用 因为很多页面都有数学方程 但在某些页面上 我还需要按原样显示字符串 x 有什么办法可以转义 x 这样它就不会调用 MathJax 并显示为斜体 x 吗 MathJax 支持 来转义表达
  • 在 swift 中如何理解设置为 private 的全局变量?

    我正在完成一本书中的核心数据练习 它首先创建一个单例的帮助器类 我知道全局变量可以在类的范围之外创建 并且可以在整个项目中访问 但是令我困惑的是 书中的一个示例创建了一个全局变量并将其设置为私有 我假设通过将变量设置为私有 它只能由该特定类
  • Gekko 返回错误的成功解决方案

    以下代码返回Successful Solution Objective 0 但这不是最佳解决方案 最优解是 6 通过阅读其他问题 我认为这是在目标函数中使用非 Gekko 函数的问题 但我使用的唯一非 Gekko 函数是np matmul
  • Laravel Passport 令牌生命周期

    我不明白我做错了什么 我无法设置令牌过期时间
  • JTable 单元格闪烁

    我正在使用 Java 中的 Swing 库编写一个应用程序 我有一个扩展的表格组件JTable 在这个组件中我重写了该方法getTableCellRendererComponent 因为我为表格的单元格着色 我有一个自定义表模型 从默认表模
  • 截击超时错误

    我正在尝试使用 Volley 拨打休息服务 public class AuthFunctions private static final String LOGIN URL http 10 0 2 2 8080 stewayservices
  • 如何防止PDF页面大小调整?

    我想要一个 pdf 文件 其中实际尺寸与打印时适合页面的尺寸之间没有差异 我尝试使用以下示例 但不起作用 仅锁定宽度 而不锁定高度 有什么解决办法吗 package etiq import java io FileOutputStream
  • Pip 在 AWS Lambda 中安装 Python 包?

    我正在尝试在 AWS Lambda 函数中 pip install 包 Amazon 推荐的方法是创建一个压缩的部署包 其中包含依赖项和 python 函数 如Python 中的 AWS Lambda 部署包 https docs aws