【问题标题】:AWS Lambda function using pyaudio使用 pyaudio 的 AWS Lambda 函数
【发布时间】:2020-10-17 02:28:48
【问题描述】:

我的梦想:)

我想将pyaudio 用于将在 AWS Lambda 上运行的函数。但是,运行sam build --use-container 时出现PythonPipBuilder:ResolveDependencies 错误

我的设置

我已经设法将我的项目构建到此。

requirements.txt

pyaudio

app.py

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'Hello World'
    }

template.yaml(至少相关部分)

Resources:
  MyFunction:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: my_app/
      Handler: app.lambda_handler
      Runtime: python3.6
      Events:
        MyEvent:
          Type: Api 
          Properties:
            Path: /test
            Method: get

我的问题

在运行sam build --use-container --debug 时,我看到了这个输出:

Traceback(最近一次调用最后一次): 文件“/var/lang/lib/python3.6/site-packages/aws_lambda_builders/workflows/python_pip/actions.py”,第 42 行,在执行 requirements_path=self.manifest_path, 文件“/var/lang/lib/python3.6/site-packages/aws_lambda_builders/workflows/python_pip/packager.py”,第 137 行,在 build_dependencies self._dependency_builder.build_site_packages(requirements_path, artifacts_dir_path, scratch_dir_path) 文件“/var/lang/lib/python3.6/site-packages/aws_lambda_builders/workflows/python_pip/packager.py”,第 201 行,在 build_site_packages 引发 MissingDependencyError(packages_without_wheels) aws_lambda_builders.workflows.python_pip.packager.MissingDependencyError: {pyaudio==0.2.11(sdist)}

...

在容器内构建返回响应 {"jsonrpc": "2.0", "id": 1, "error": {"code": 400, "message": "PythonPipBuilder:ResolveDependencies - {pyaudio==0.2.11 (sdist)}"}}

我的理论

我的理论是这会失败,因为在运行sam build --use-container时使用的 Docker 容器镜像中没有安装 PortAudio

如果我在我安装 PortAudio 的本地计算机上运行pip install -r requirements.txt,一切都会按预期运行。

我怀疑我需要以某种方式在 AWS Lambda 环境中安装 PortAudio……但是如何?层?如果是这样,我从哪里获得我需要的二进制文件?

TL;DR;

如何在 AWS Lambda 环境中安装 PortAudio?

【问题讨论】:

  • 我正在尝试做同样的事情——为 PortAudio 创建一个 Lambda 层。我从您的评论中看到您终于能够做到,但我正在努力重现您的解决方案。我正在尝试使用 lambci/lambda docker 映像而不是 EC2 实例来做到这一点,但我认为它应该翻译。我克隆了 portaudio 存储库并使用 make 构建它,但现在我不确定我需要哪些构建输出文件,而且我不确定将文件放在我的层 zip 的位置。 libportaudio.so.2.0.0 重命名为 libportaudio.so?复制到 /lib 层 zip 中?
  • 嘿@jamshehan,你有我的同情 :) 我创建了一个 GitHub 存储库,其中包含依赖项和模糊的描述。希望有用:github.com/pbodsk/aws-lambda-libso-dependencies

标签: python aws-lambda portaudio


【解决方案1】:

测试 lambda 的快速方法是将包(例如 pyaudio)安装在包含 lambda 代码的文件夹中,然后将其全部压缩并上传。查看更多信息https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies

如果您在安装软件包时遇到任何问题,则可能是依赖关系造成的,您可能需要添加一个或多个层。

一旦你的 lambda 工作,你可以删除它并使用 buildspec.yml 安装 python 包。 AWS 将在运行代码管道时安装这些包。更多详情https://docs.aws.amazon.com/lambda/latest/dg/build-pipeline.html

【讨论】:

  • 感谢您的回答@greg。如果我按照该文档中的建议运行pip install --target ./package PyAudio,那么它在我的本地计算机(即 Mac)上运行良好。但据我了解——我可能错了——如果我上传它,它会失败,因为我尝试使用来自 Mac 的 .so 文件......这在 Linux 机器上不起作用。虽然它给了我一个想法,所以我将我的设置复制到 EC2 实例并尝试运行 pip install --target ./package PyAudio,但 .../src/_portaudiomodule.o unable to execute 'gcc': No such file or directory 失败,所以,没有 portaudiomodule :(
  • 如果我运行 yum search portaudio 我会得到:Warning: No matches found for: portaudio 这表明由于某种原因 PortAudio 在 AWS Linux 安装中开箱即用不可用
  • 我想你已经回答过了,但是大多数包都可以使用 PIP 安装。但是 PyAudio 必须使用滚轮安装(并且对于正确的操作系统/版本)。见stackoverflow.com/questions/52283840/…。现在我仍然建议将 lambda 作为 zip 上传(作为基本测试)。
  • 查看答案:stackoverflow.com/questions/44538746/… 应该让您知道如何安装它
  • 更新。我终于能够将 Portaudio 安装到 EC2 实例(使用这个:aws.amazon.com/premiumsupport/knowledge-center/ec2-enable-epel),然后我可以从那里安装 Portaudio,然后获取安装的 so 文件并将它们添加到我可以添加到我的函数中的层,最后得到它在职的。感觉不错的男人。我会接受你的回答,因为你真的帮助我在 cmets 中指出了正确的方向。感谢您的时间和帮助,非常感谢:)
猜你喜欢
  • 2021-09-19
  • 2021-07-26
  • 2018-01-13
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2017-03-31
  • 1970-01-01
相关资源
最近更新 更多