Techioz Blog

Ruby gemの依存関係がラムダ関数にインストールされていない

概要

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

バンドル構成セット –local デプロイメントを「true」に設定しました。ベンダーフォルダーには必要なすべての gem が含まれています。 Bundle Pristine も試しましたが、同じ結果が得られました。

私に何が欠けているのかについてのご指摘があれば、大変感謝いたします。ありがとう。

解決策

実際には gem をベンダーしていないため、適切なプラットフォームをターゲットにしていない、または Lambda イメージに適切なビルド依存関係を持っていない可能性があります。代わりに、事前に構築されたベンダーの gem を使用してデプロイすることを検討してください。

Bundler の環境変数の一部を確認し、使用する動的ライブラリとプラットフォームに対して gem が構築されていることを確認してください (たとえば、多くのイメージでは glibc の代わりに muscl が使用されています)。また、開発環境と AWS Lambda イメージの両方をターゲットとする明示的なプラットフォームを Gemfile に含める必要がある場合もありますが、これらは異なる場合があります。

まず、ベンダーの gem (ローカル gem とは異なります) に関連する特定の環境変数を具体的に調べることから始めたい場合があります。 Bundler v2.4 で使用される環境変数には次のものがあります。

AWS Lambda 上で実行時に gem をビルドすることに関係するものはすべて依存関係の問題に遭遇する可能性があるため、私の個人的な経験では、実行時に Bundler に依存するのではなく、gem を事前にビルドして直接ベンダーすることが本当に最善です。可能であれば、デプロイ先と同じイメージまたはランタイム環境に対して開発することもお勧めします。これは、Lambda と同じように構成された Docker コンテナを使用して、「私のマシンでは動作する」という問題全体を回避することを意味します。これらのシナリオでは非常に一般的です。