提问人:Alvaro 提问时间:11/11/2023 最后编辑:Holger JustAlvaro 更新时间:11/12/2023 访问量:67
Lambda 函数中未安装 Ruby Gems 依赖项
ruby gems dependency not being installed in lambda function
问:
我正在尝试将 Ruby 应用程序部署到 AWS Lambda 函数,但某些 gem 未正确捆绑。
这是日志中的错误消息:
INIT_START Runtime Version: ruby:3.2.v9 Runtime Version ARN: arn:aws:lambda:eu-central-1::runtime:b96ddb9b1905c3979339d7706a5f7cfda1d851593b1255eb0f15ff573c17fd28
Ignoring bigdecimal-3.1.4 because its extensions are not built. Try: gem pristine bigdecimal --version 3.1.4
Ignoring pg-1.5.4 because its extensions are not built. Try: gem pristine pg --version 1.5.4
Ignoring psych-5.1.1.1 because its extensions are not built. Try: gem pristine psych --version 5.1.1.1
Ignoring racc-1.7.3 because its extensions are not built. Try: gem pristine racc --version 1.7.3
Ignoring bigdecimal-3.1.4 because its extensions are not built. Try: gem pristine bigdecimal --version 3.1.4
Ignoring stringio-3.0.9 because its extensions are not built. Try: gem pristine stringio --version 3.0.9
Ignoring stringio-3.0.9 because its extensions are not built. Try: gem pristine stringio --version 3.0.9
我已经设置好了,供应商文件夹里有所有必要的宝石。
我也试过了,但我得到了相同的结果。bundle config set --local deployment 'true'
bundle pristine
任何关于我错过了什么的指示将不胜感激!谢谢。
答:
1赞
Todd A. Jacobs
11/12/2023
#1
平台、动态库、依赖项和 ENV 变量
TL;博士
您实际上并没有提供 Gem,并且可能没有以正确的平台为目标,或者对 Lambda 映像具有正确的构建依赖项。请考虑改用预构建的供应商 Gem 进行部署。
分析与建议
查看 Bundler 的一些环境变量,并确保任何 gem 都是针对您将使用的动态库和平台构建的(例如,许多图像使用 muscl 而不是 glibc)。您可能还需要在 Gemfile 中包含针对开发环境和 AWS Lambda 映像的显式平台,这些平台可能有所不同。
首先,您可能需要专门检查与供应商 gem 相关的一些特定环境变量(这与本地 gem 不同)。Bundler v2.4 使用的环境变量包括:
cache_all (BUNDLE_CACHE_ALL)
:缓存所有 gem,包括路径和 git gem。这需要在捆绑器 1 和捆绑器 2 上显式配置,但在捆绑器 3 上将是默认配置。cache_all_platforms (BUNDLE_CACHE_ALL_PLATFORMS)
:缓存所有平台的 Gem。cache_path (BUNDLE_CACHE_PATH)
:bundler 在运行 bundle package 时将缓存的 gem 放入的目录,以及该 bundler 在安装 gem 时将查找的目录。缺省值为 .vendor/cache
任何涉及在 AWS Lambda 上运行时构建 Gem 都可能遇到依赖性问题,因此根据我的个人经验,最好直接预构建和提供 Gem,而不是在运行时依赖 Bundler。如果可能,最好针对要部署到的相同映像或运行时环境进行开发,这可能意味着使用与 Lambda 配置方式相同的 Docker 容器,以避免在这些场景中非常常见的整个“它在我的计算机上工作”问题。
评论