English: README.en.md
RubyGemsを指定して、AWS Lambda Layerをデプロイ(新規作成・更新)します。 RubyGemsのビルドは、AWS Lambda Rubyランタイムの公式Dockerコンテナ内で行います。
Gemfileに指定してbundle install
できるRubyGems。
- Bash
-
aws-cli
- インストール手順:https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
- IAM権限:aws-cliが
aws lambda publish-layer-version
を実行できるようにしてください
例として、ruby-mysqlをAWS Lambda Layerとしてデプロイします。
-
Gemfileに、AWS Lambda LayerとしたいRubyGemsを指定します
# frozen_string_literal: true source "https://rubygems.org" gem "ruby-mysql", "~> 4.1.0"
-
config.shに、デプロイするAWS Lambda Layerの設定をします:
lambda_layer_name
:AWS Lambda Layer名lambda_layer_description
:AWS Lambda Layerの説明文compatible_runtimes
:AWS Lambda Rubyランタイムの互換性のあるバージョン"ruby3.2"
のように指定します- 複数指定する場合は、半角スペース
"ruby2.7" "ruby3.2"
)
compatible_architectures
:互換性のあるアーキテクチャ"x86_64"
、"arm64"
のいずれか、あるいは両方を指定できます- 両方を指定する場合は、半角スペース
"x86_64" "arm64"
)
# AWS Lambda Layer Settings # * Modify Gemfile too to install desired RubyGems. lambda_layer_name="rubygems-mysql" lambda_layer_description="RubyGem 'ruby-mysql' 4.1.0: https://rubygems.org/gems/ruby-mysql/versions/4.1.0" compatible_runtimes=("ruby3.2") # Use a space ' ' as a delimiter; "ruby2.7" "ruby3.2" compatible_architectures=("x86_64" "arm64") # Use a space ' ' as a delimiter; "x86_64" "arm64"
-
(必要な場合)Dockerfileに、RubyGemsをビルドするのに必要となるライブラリを追加します。
AWS LambdaのRubyランタイムのDockerコンテナ内でビルドを行うので、 あらかじめコンテナ作成時に
yum install -y <ライブラリ>
を加える必要があります。Dockerfileの
RUN
命令を使って、RUN yum install -y <ライブラリ>
を追記してください:# Install additionally required libraries for building RubyGems RUN yum groupinstall -y "Development Tools" RUN yum install -y <ライブラリ1> # 追記 RUN yum install -y <ライブラリ2> # 追記
-
スクリプト「
deploy-ruby-aws-lambda-layer-for-rubygems.sh
」を実行します:-
途中で、AWS Lambda Layerの設定内容確認のプロンプトを表示する場合(デフォルトの動作):
./deploy-ruby-aws-lambda-layer-for-rubygems.sh
-
もしプロンプトをスキップしたい場合:
オプション
-y
、--yes
、あるいは--skip-prompt
を指定して実行する。./deploy-ruby-aws-lambda-layer-for-rubygems.sh -y
-
スクリプト「deploy-ruby-aws-lambda-layer-for-rubygems.sh
」は、種々のケアのため長大ですが、主要な動作ロジックは単純です。
AWS Lambda Layerは、AWS Lambdaランタイムの/opt/
配下に配置されます。
また、AWS LambdaのRubyランタイムでは、RubyGemsをrequire
するための参照パスのひとつGEM_PATH
に、パス/opt/ruby/gems/3.2.0
(Ruby 3.2ランタイムの場合)が設定されています。
そこで、AWS Lambda Layerとしてデプロイするzipパッケージの構造を、ruby/gems/3.2.0/
配下にRubyGemsをインストールしたディレクトリ構成にします:
lambda_layer_json.zip
└ ruby/gems/3.2.0/
| build_info
| cache
| doc
| extensions
| gems
| └ json-2.7.0
└ specifications
└ json-2.7.0.gemspec
(https://docs.aws.amazon.com/lambda/latest/dg/packaging-layers.html より引用;一部加工)
こうすれば、追加のパスの設定等をせずに、AWS Lambda Ruby関数内からrequire
して呼び出すことができるようになります。
参考:https://docs.aws.amazon.com/lambda/latest/dg/packaging-layers.html
-
AWS LambdaのRubyランタイムのコンテナを起動する(関係するファイル:Dockerfile、docker-compose.yaml)
ENTRYPOINT
は上書きする(そのままだと、コンテナ起動時にLambda関数を実行しようとするため)- RubyGemsのビルドに必要なライブラリは、あらかじめ
yum install
しておく - ビルドしたRubyGemsを格納するために、Dockerホスト(以下ローカル)のカレントディレクトリをマウントする
-
AWS LambdaのRubyランタイムのコンテナ内にはBundlerがインストールされているので、このBundlerを使って、RubyGemsをビルドする(関係するファイル:Gemfile)
bundle install
する前に、あらかじめコンテナ内でbundle config set --local path ./tmp
を行い、 手順1でマウントしたローカルのカレントディレクトリ直下の./tmp/
ディレクトリ内に、RubyGemsをビルドするように設定する
-
コンテナを停止する
- ローカルのカレントディレクトリの
./tmp/
内に、RubyGemsがビルドされている状態になる
- ローカルのカレントディレクトリの
-
ビルドしたRubyGemsのディレクトリ構造を、AWS Lambda Layer用に変更する
- 変更前:
./tmp/ruby/3.2.0/...
(Ruby 3.2ランタイムでビルドした場合) - 変更後:
./built_rubygems/ruby/gems/3.2.0/...
(作業の簡便さのために、./tmp/
から./built_rubygems/
に移動した)
- 変更前:
-
手順4の
./built_rubygems/ruby/gems/3.2.0/...
のディレクトリruby/
以下を、zipパッケージにする -
手順5のzipパッケージを指定して、AWS Lambda Layerをデプロイする
-
aws-cliを使う場合、
aws lambda publish-layer-version
を使う- オプション
--zip-file
で、手順4のzipパッケージを指定する
aws lambda publish-layer-version --layer-name <AWS Lambda Layer名> \ --description <AWS Lambda Layer説明文> \ --zip-file fileb://<zipパッケージパス> \ --compatible-runtimes <互換性のあるAWS LambdaのRubyランタイムのバージョン> \ --compatible-architectures <互換性のあるアーキテクチャ>
- オプション
-