5
0

AWS LambdaでRubyのGemをレイヤーを使って利用する方法

Last updated at Posted at 2023-11-16

概要

lambda_function.rb
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
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関数の作成

ランタイムをRubyにしてLambda関数を作成します。
スクリーンショット 2023-11-17 3.43.36.png

コードの編集

Lambda関数のコードを下記に変更します。

lambda_function.rb
require 'active_support/all'

def lambda_handler(event:, context:)
  p "".blank?
end

まだ、active_supportのGemを使えるようにしていないので、
関数を更新した後にテスト実行すると cannot load such file -- active_support/all
エラーとなることが確認できると思います。

スクリーンショット 2023-11-17 4.31.01.png

レイヤーの作成

レイヤーを作成します。
ローカル環境での準備のところで作成しておいた layer.zip をアップロードします。
スクリーンショット 2023-11-17 4.51.46.png

レイヤーの追加

Lambda関数のメニューに戻ってレイヤーの追加から作成したレイヤーを追加します。
スクリーンショット 2023-11-17 4.56.04.png
スクリーンショット 2023-11-17 4.56.16.png

環境変数の追加

Layers に配置したファイルは /opt 配下に置かれるため、このパスからGemを読み込む設定が必要になります。
環境変数GEM_HOMEにパスを設定することで参照できるようになるため、
環境変数にGEM_HOMEを追加し、値は /opt/ruby/3.2.0 とします。
スクリーンショット 2023-12-01 1.54.44.png

※ 似たような環境変数としてGEM_PATHがあり、GEM_PATHにパスを指定することでもGemを参照することができます。
ただし、GEM_PATHには複数のパスが最初から設定されており、GEM_PATHを上書きしてしまうと
Lambda関数がデフォルトで使えるGemも使えなくなってしまうのでGEM_HOMEで設定する方がいいです

テスト実行

以上の手順でGemが使えるようになりました。
テストを実行すると成功することが確認できると思います。
スクリーンショット 2023-11-17 4.57.44.png

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0