为在AWS Lambda中使用的Python包指定C(++)依赖项

5

我有一个无服务器服务,希望能在AWS Lambda中使用sasl pypi包。不幸的是,AWS Lambda环境似乎没有最新版本的libstdc++.so,这意味着当我们的构建服务器将pip install的sasl包打包成zip文件并调用lambda时,会出现预期的错误:

Unable to import module 'handler': /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /var/task/sasl/saslwrapper.so)

我的问题是:如何解决这个问题? 是否有一种方法可以在 Amazon Linux 实例上构建这些库,以便可以打包到 libs 中,并针对更新的 libstdc++.so.6 进行编译?将 LD_LIBRARY_PATH 环境变量设置为 并包含最新版本的 libstdc++.so.6 是否有效?是否有任何最佳实践可遵循?

2
什么是“C(++)”? - Lightness Races in Orbit
@LightnessRacesinOrbit c或c++ - a p
C语言不使用libstdc++.so.6库。请专注于一种语言。C和C++是不同的,需要分开看待。 - Lightness Races in Orbit
3个回答

4
您可以使用amazonlinux作为基础镜像,使用docker构建所有依赖项,然后将其复制到打包的目录中,最终上传到lambda函数中:https://medium.com/@johnnyopao/python-dependencies-and-aws-lambda-18acbdebca20 或者您可以在远程EC2实例上进行等效操作(构建):http://www.perrygeo.com/running-python-with-compiled-code-on-aws-lambda.html 最后一个选择是使用AWS Cloud 9作为IDE,如下所述:https://markn.ca/2018/02/python-extension-modules-in-aws-lambda/

除了反复运行和收集错误之外,有没有一种方法可以找到应该复制哪些共享库对象文件(.so)? - Att Righ
自从我的回答之后,AWS已经推出了新的Lambda打包方式:
  • 2019年11月发布的层(https://aws.amazon.com/blogs/aws/new-for-aws-lambda-use-any-programming-language-and-share-common-components/)
  • 2020年12月直接使用Docker镜像(https://aws.amazon.com/blogs/aws/new-for-aws-lambda-container-image-support/)
我建议使用后者(请参阅官方文档:https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html)。并通过Serverless(https://www.serverless.com/)或AWS SAM(https://aws.amazon.com/serverless/sam/)进行部署,以便在Lambda周围进行配置。
- bluu
这是关于这种新方法的详细步骤说明:https://acloudguru.com/blog/engineering/packaging-aws-lambda-functions-as-container-images - bluu

2

-3

这是你的问题:

AWS Lambda是许多应用场景的理想计算平台,前提是您可以使用AWS Lambda支持的语言编写应用程序代码(即Node.js、Java、C#和Python)。

你正在做一些不应该做的事情。

你可能能够通过一些技巧来解决它(我曾经成功地重新分发过我的构建机器上的libstdc++libgcc_s,将它们与我的可执行文件放在一起,并确保在运行时首选它们,使用-Wl,-rpath,'$ORIGIN'),但基本上你将会独自面对问题。

C++并不是为部署到其他平台而设计的,除非Amazon提供了一个“AWS Lambda”环境来构建东西,否则你将被困在这样的技巧中。


1
说实话,我的所有代码都是Python2.7 -- 一些库使用多种语言的C和C++代码/库,而Python在这方面也不例外。显然,如果需要,我可以将其放在EC2实例上并设置轮询等来进行调用,但当我的其他服务都是lambda时,这似乎很麻烦。 - a p
1
你可以尝试执行 pip install -b python_pkg_w_c_deps 命令,如果预编译的二进制包可用,则会下载该包... - Joran Beasley
除非亚马逊提供“AWS Lambda”环境,否则无法实现。<- 就我所知,这只是亚马逊Linux,以防您以后遇到它。 - a p
@ap:耸肩 我只是在引用官方帮助指南。他们不支持你的语言。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接