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を利用したインフラ環境の構築、およびその上で動くアプリケーションの開発のご依頼・ご相談をお引き受けしております。
個人・法人問わず、何かご相談事項がございましたら、一度ご連絡いただければと思います。