【AWS Lambda】Ruby 3.2でgemのLambda Layerを簡単に作成する

NeeNetです。

2023年にAWS LambdaでランタイムとしてRuby 3.2が利用できるようになりました。

※2023年12月末現在、Ruby 2.7のサポートは終了しています。

今回はLambda (Ruby 3.2ランタイム) についてgemのLambda Layerを簡単に作成する方法をご紹介します。

前提

今回はLambda Layerの作成にDockerを利用します。

インストールがまだの方は、公式サイト等を参考にご準備をお願いします。

フォルダ構成・ファイル内容

まず、今回のフォルダ構成は以下の通りです。

.
├ tmp
| ├ Gemfile
| └ make_layer.sh
└ Dockerfile

トップにtmpというフォルダとDockerfileを作成し、tmpディレクトリの中にはインストールしたいパッケージを記載したGemfileとレイヤーを作成するためのスクリプトであるmake_layer.shを用意します。

Dockerfile

Dockerfileは以下の通りです。

FROM public.ecr.aws/sam/build-ruby3.2:latest-x86_64

WORKDIR /tmp

RUN yum -y install mysql-devel

RUN gem update bundler

CMD ["bash", "make_layer.sh"]

ベースイメージはRuby 3.2のSAMビルドコンテナイメージを利用しています。

今回はgemでmysql2も入れたいので、mysql-develもインストールするようにしています。

コンテナ起動時にはmake_layer.shを起動するようにしています。

Gemfile

Gemfileは以下の通りです。

source "https://rubygems.org"

gem 'mysql2'
gem 'activerecord'

先に述べたようにmysql2と加えてactiverecordを記載しています。

make_layer.sh

make_layer.shは以下の通りです。

bundle config --local build.mysql2 --with-mysql2-config=/usr/lib64/mysql/mysql_config
bundle config --local silence_root_warning true
bundle install --path /tmp/layer --clean
mkdir -p /tmp/layer/lib
cp -a /usr/lib64/mysql/*.so.* /tmp/layer/lib/
cd /tmp/layer
zip -r layer.zip .

mysql2用にbundle configを記載しています。

インストール自体はtmpフォルダ配下のlayerフォルダに実施するようにしています。

その後、layer配下のlibフォルダにmysql2用のsoファイルをコピーしています。(これがLambda Layerに含まれていないとLambdaからのrequireが失敗するため)

最後はlayer配下のファイル群をzip化する処理をしています。

実行

Dockerfileがあるフォルダをターミナルで開き、以下コマンドでDockerイメージのビルドを行います。

$ docker build -t ruby-lambda-layer .

イメージがビルドできたら、以下コマンドで実行を行います。ローカルのtmpフォルダをコンテナの/tmpにマウントします。

$ docker run --rm -it -v ${PWD}/tmp:/tmp ruby-lambda-layer

実行が完了すると、ローカルのtmpフォルダにlayer.zipファイルが作成されているかと思います。

これが作成されたLambda Layer用のzipファイルです。

Lambda Layerのデプロイ

AWSマネジメントコンソールからLambdaサービスにアクセスし、左側のダッシュボードのタブからレイヤーを探し、レイヤー作成画面に進みます。

後は先に作成したzipファイルを用いて、以下のように任意の名前でLambda Layerを作成します。

また、本レイヤーを使うLambda関数の環境変数にキーをGEM_HOMEで値を/opt/ruby/3.2.0に設定します。

以上で、Ruby 3.2のランタイムのLambdaでgemのパッケージを利用することができます。

最後に

今回はDockerを利用してLambda (Ruby 3.2ランタイム) 用のgemのLambda Layerを作成してみました。

参考になりましたら幸いです。

ご依頼について

NeeNetではAWSを利用したインフラ環境の構築、およびその上で動くアプリケーションの開発のご依頼・ご相談をお引き受けしております。

個人・法人問わず、何かご相談事項がございましたら、一度ご連絡いただければと思います。

  • URLをコピーしました!