概要
def lambda_handler(event:, context:)
p "".blank?
end
AWS Lambdaで上記の関数を実行しようとすると、active_supportのGemがないので、undefined method blank?と怒られてしまいます。
上記のような関数も実行できるように、AWS LambdaでGemを使う方法をまとめてみました。
ローカル環境での準備
Gemfileに gem 'activesupport'
を追加し bundle install
します。
bundle install
によってインストールしたファイルはこの後レイヤーにアップロードするので
--path .
のオプションをつけてカレントディレクトリにインストールされるようにします。
touch Gemfile
source 'https://rubygems.org'
gem 'activesupport'
bundle i --path .
すると ruby/3.2.0
フォルダが作成され、その中にインストールされます。
bundle install
後のディレクトリ構成は下記のようになると思います。
.
├── .bundle
│ └── config
├── Gemfile
├── Gemfile.lock
└── ruby
└── 3.2.0
rubyフォルダ以下をzipにするために下記のコマンドを実行て layer.zip
を作成します。
zip -r layer.zip ruby/
Lambda関数の作成
コードの編集
Lambda関数のコードを下記に変更します。
require 'active_support/all'
def lambda_handler(event:, context:)
p "".blank?
end
まだ、active_supportのGemを使えるようにしていないので、
関数を更新した後にテスト実行すると cannot load such file -- active_support/all
の
エラーとなることが確認できると思います。
レイヤーの作成
レイヤーを作成します。
ローカル環境での準備のところで作成しておいた layer.zip
をアップロードします。
レイヤーの追加
Lambda関数のメニューに戻ってレイヤーの追加から作成したレイヤーを追加します。
環境変数の追加
Layers に配置したファイルは /opt
配下に置かれるため、このパスからGemを読み込む設定が必要になります。
環境変数GEM_HOMEにパスを設定することで参照できるようになるため、
環境変数にGEM_HOMEを追加し、値は /opt/ruby/3.2.0
とします。
※ 似たような環境変数としてGEM_PATHがあり、GEM_PATHにパスを指定することでもGemを参照することができます。
ただし、GEM_PATHには複数のパスが最初から設定されており、GEM_PATHを上書きしてしまうと
Lambda関数がデフォルトで使えるGemも使えなくなってしまうのでGEM_HOMEで設定する方がいいです